ROS的开机自启脚本编写

用ROS开发好一个机器人后,在使用的时候每次都要先连上机器的网络再roslaunch太麻烦了,按产品的思路应该是按下电源键就OK才对。此外,若是还有上位机连着进行状态监视,万一主程序挂了,或者修改了程序要重新编译运行,那上位机这边的节点也要重新开一遍,太麻烦了吧。所以最好是在roslaunch之前单独开好一个roscore,这样修改下位机程序,上位机这边就不用重新开也能工作了。那就意味着机器上电后,我们要分两次ssh上去,一个开core,一个roslaunch。WTF!这种重复性的操作还是交给机器自己完成吧!(这篇博文的内容当时只用txt记录了过程,时间也有点久了,就保持原样吧~懒得排版~)

版权声明
原创文章,转载请说明出处:sheng-blog.cn
原文出处

笔记

1、联网检测代码段:

while true;do
ping -w 1 -c 1 192.168.1.132>/dev/null
ret=$?
if [ $ret -eq 0 ]
then printf "$prefix is up"
break;
else printf "$prefix is down \n" 
fi
done

2、在dash里搜索“启动应用程序”里将脚本设置为开机自启,脚本将在开机后后台运行,在命令前加上gnome-terminal -x可以实现在终端运行,但是比较建议在脚本里需要在终端执行的地方加这个指令。

3、这种方式的开机自启需要系统打开图形界面,比如树莓派的Ubuntu mate系统里确保graphical enable,但具体有没有显示屏存在并不重要。另外需要注意的是如果安装了xrdp这种远程桌面的话,在同一个IP开多个窗口远程登录看到的是同一块桌面,而不同IP则看到的是不同桌面,我们设置的开机启动程序在每一块桌面启动时都会被执行!而vnc则有且仅有一块桌面,与HDMI输出保持一致。

4、在同一个脚本里仅能执行一个不return的指令,比如在同一个脚本里先roscore再roslaunch是不行的,实际效果是只执行到roscore,除非ctrl+c结束core,脚本才会继续往下执行。因此,若要启动一个core和一个roslaunch需要添加两个开机启动脚本。

5、强大的screen指令:前面提到脚本在终端执行,但是在随后我们ssh后却无法操控该终端,此时screen指令可以解决这个问题。新建一个screen再在里面操作即可方便后续attach回去,脚本里gnome-terminal -x screen -S windowname /the/path/of/the/shell 即可,分成两条写{gnome-terminal -x screen -S windowname接/the/path/of/the/shell}是不行的。

6、使用上面这种开screen就运行脚本的方式有一个问题,比如roslaunch里某环节报错挂了,screen会话将直接被终止,我们无从获知程序报错的原因。因此不能按上述命令写,而应将新建screen会话和执行脚本分开,正确的方式是:gnome-terminal -x screen -S windowname接gnome-terminal -x screen -S windowname -X screen /the/path/of/the/shell。其中screen的 -X 参数意思是指定在哪个screen中运行某个指令。

7、尽管我们加了gnome-terminal -x指定了后面的命令需在一个终端里执行,但screen 后紧跟的指令执行的时机是在终端执行.bashrc文件之前,所以我们需要在脚本里自行source一些ROS配置文件,不要忘了export ROS_MASTER_URI=http://pi:11311
export ROS_IP=10.42.0.64这两个环境变量,否则其他计算机将无法与其正常通信。正是这一feature使得我们若要启动一个core和一个roslaunch的话需要用到四个脚本!

8、必须保证先开core,因此可在launch的脚本里加延时,延时不能太短,否则core还没开好就roslaunch了同样会死得很难看,我看到的现象是两个窗口里都在反复restart。目前使用25s延时,差不多。20s有点险。

当前使用的脚本

newscreen_core

#!/bin/bash 
while true;do
ping -w 1 -c 1 10.42.0.1>/dev/null
ret=$?
if [ $ret -eq 0 ]
then printf "$prefix is up"
break;
else printf "$prefix is down \n" 
fi
done
mate-terminal -x screen -S core ~/auto_runing/core_ros
#mate-terminal -x screen -S core -X screen ~/auto_runing/core_ros

core_ros

#!/bin/bash 
source /opt/ros/kinetic/setup.bash  
source /home/pi/.bashrc   
source /home/pi/catkin_ws/devel/setup.bash  
cd /home/pi/catkin_ws
export ROS_MASTER_URI=http://10.42.0.1:11311
export ROS_IP=10.42.0.1
roscore

newscreen_quad

#!/bin/bash 
while true;do
ping -w 1 -c 1 10.42.0.1>/dev/null
ret=$?
if [ $ret -eq 0 ]
then printf "$prefix is up"
break;
else printf "$prefix is down \n" 
fi
done
sleep 25s
mate-terminal -x screen -S quad
mate-terminal -x screen -S quad -X screen ~/auto_runing/quadrotor

quadrotor

#!/bin/bash 
source /opt/ros/kinetic/setup.bash  
source /home/pi/.bashrc   
source /home/pi/catkin_ws/devel/setup.bash  
cd /home/pi/catkin_ws
export ROS_MASTER_URI=http://10.42.0.1:11311
export ROS_IP=10.42.0.1
roslaunch planning start_test.launch

你可能感兴趣的:(ROS)