zoukankan      html  css  js  c++  java
  • ROS程序开机自启动

    1. ROS官方方法:

    Robot_upstart:

    The robot_upstart package provides scripts which may be used to install and uninstall Ubuntu Linux upstart jobs which launch groups of roslaunch files.

    所以,这个方法可能仅支持Ubuntu Linux。它提供scripte来安装和卸载随机启动的ROS工作。 可以使用roslaunch等。

    1.1:安装(indigo-ROS下):

    $sudo apt-get install ros-indigo-robot-upstart

    1.2: 设置某个Package的launch文件为开机启动 .launch:

    Sam有个Package:beacool_bringup, 它其中有个 .launch文件----beacool_bringup/launch/minimal.launch

    $rosrun robot_upstart install beacool_bringup/launch/minimal.launch

    这里容易出以下几个问题:

    A. 找不到launch文件:

    A1:确保package_name/launch/目录的正确。

    A2:确保roscd package_name 可以进入。(说明:source ~/catkin_ws/devel/setup.bash 已经起效)

    另一点要注意的是Log:

    Preparing to install files to the following paths:

    /etc/init/beacool.conf

    /etc/ros/indigo/beacool.d/.installed_files

    此时,Ubuntu启动时,这个Launch就会被调用。

    1.3: 其它关键信息:

    1.3.1: service名:

    service名为:包名的一部分,在以上例子中,Package_Name: beacool_bringup.  所以service名为:beacool

    1.3.2: 停止开机启动:

    rosrun robot_upstart uninstall service名

    rosrun robot_upstart uninstall beacool

    1.3.3: service 启动和停止:

    sudo service beacool start

    sudo service beacool stop

    1.3.4: 察看log:

    sudo vi /var/log/upstart/beacool.log

    网络上不少地方在描述这部分工作时:均不讲清楚 service名从何而来。带来不少误解。所以专门用红色标记service名


    2. 使用Linux桌面系统对应开机启动程序:

    不同的Linux桌面系统,开机启动并不相同。Ubuntu实用GNOME桌面系统。它使用启动应用程序来设置随机启动。也可以在终端输入:gnome-session-properties来启动。

    其它桌面系统对应软件并不一定相同:例如KDE----System Settings->System Administration->Startup and Shutdown

    可以看到,Sam使用这个工具,启动了计算器。

    可ROS 程序如何启动呢?

    其实思路很简单,就是运行一个终端程序,终端程序则运行一个脚本,这个脚本中设置ROS, 启动ROS应用程序。

    Sam想启动的 .launch为: beacool_bringup 包内的minimal.launch

    所以创建启动脚本如下:

    #! /bin/bash

    source /opt/ros/indigo/setup.sh

    source /home/exbot/devel/setup.bash

    roslaunch beacool_bringup minimal.launch

    其次:在启动程序的命令列表中,使用:

    gnome-terminal -x /home/exbot/catkin_ws/beacool_ros/beacool_run.sh

    001Ld2gwzy7aBpCyFu65e&690

    则系统每次启动后,会开启一个终端窗口,并执行脚本中的launch.

    此方法在大部分ubuntu+ROS下有用。但在TK1 Ubuntu下未起作用。暂时不知怎么回事。


    3. Linux 经典方式, 开机启动Service:

    首先介绍背景知识:Linux启动时,可以启动一些Service。 Sam很早之前搞Linux机顶盒,Android机顶盒时。很多程序就是以Service形式启动的。

    3.1: 创建Service的方法:

    A: 在/etc/init.d/目录下,创建要启动的脚本。例如名为:beacool_rfkill 这个脚本用来启动 bluetooth.

    内容如下:

    rfkill unblock bluetooth

    B: 把脚本增加入Service:

    $ cd /etc/init.d

    $ sudo update-rc.d beacool_rfkill defaults 95

    此时,会把脚本beacool_rfkill 加入到/etc/rcX.d/目录中。X:0-6, 分别表示不同的启动级别。3为字符界面启动,5为GUI启动。其它不关键。

    脚本名则在/etc/rc3.d/中变为:S95beacool_rfkill

    命令中,最后的数字表示表示启动顺序。

    C: 如果想要去掉此Service:

    $ cd /etc/init.d
    $ sudo update-rc.d -f beacool_rfkill remove

    3.2: ROS程序使用Service方式启动:

    为了查看脚本是否有效,可以查看log. Sam在脚本中作了如下动作:

    roslaunch beacool_nav amcl_demo.launch >> /home/ubuntu/catkin_ws/src/beacool.log 2>&1

    这样,就会把log 发送到指定目录。

    Log如下:

    /etc/rc2.d/S96dashgo_launch: 1: /etc/rc2.d/S96dashgo_launch: roslaunch: not found

    这说明 ros没加入环境变量中。需要先把环境变量设置好。

    可参见后面的写法:

    .  /opt/ros/indigo/setup.sh

    .  /home/ubuntu/catkin_ws/devel/setup.sh

    roslaunch beacool_bringup minimal.launch

    此办法有个缺点:

    如果有多个ROS工程要加入,例如:其中一个加为S98, 另一个加为S99。则S98会被执行。而S99并未执行。

    虽然也可以后台执行,但会导致前一个退出。

    所以如果一定要采用此方法:

    可以把多个Launch合并。(并不建议)


    4. 简单暴力的 rc.local (问题较多的方法):

    /etc/rcX.d/中,都包含了/etc/init.d/rc.local.  通常都是最后一刻加入的,例如:S99rc.local

    而它又引用了 /etc/rc.local

    所以,可以简单的在/etc/rc.local 的exit 0 之前加入调用。

    例如:Sam想要加入一个ROS项目:beacool_bringup 的minimal.launch.

    A: 先创建一个script:

    .  /opt/ros/indigo/setup.sh

    .  /home/ubuntu/catkin_ws/devel/setup.sh

    roslaunch beacool_bringup minimal.launch

    请注意:此时并没有使用source /opt/ros/indigo/setup.bash.

    而是采用 .  /opt/ros/indigo/setup.sh

    是因为此时bash还未启动,而source是bash内部命令。此时找不到source.

    B: 修改其权限:

    sudo chmod 777 beacool_launch

    C: 加入rc.local:

    /etc/init.d/beacool_launch

    此办法有个和方法3类似的缺点:

    1. 加入后,如果ROS 程序不退出,则阻塞在这里。这意味着如果要启动多个launch. 则下一个不会被执行。

    2. 当然有朋友会说,可以后台执行嘛。

    /etc/init.d/beacool_launch &

    但如果后面再启一个launch, 前面beacool_launch所启动的ROS项目会退出。

    所以如果一定要采用此方法:

    可以把多个Launch合并。(并不建议)

  • 相关阅读:
    .net c# gif动画如何添加图片水印
    Webbrowser控件设置所使用的内核
    WPF 用户控件不显示标记
    Spark应用场景以及与hadoop的比较
    Spark基本函数学习
    uniapp H5发布后在部分手机字体变大,导致页面错乱
    uni 小程序图片路径转base64
    uniapp px与upx(rpx)相互转换
    uniapp调用扫码功能
    uniapp 引入第三方字体
  • 原文地址:https://www.cnblogs.com/klcf0220/p/14150902.html
Copyright © 2011-2022 走看看