事情是这样的。。。
要求自动启动ROS里面的7~8个节点,也就是说在不确定的时间断电后又在不确定的时间上电且硬件时钟不可用的状态下自动启动且按照顺序启动一系列的节点。
环境是TX2×4、雷达×4、板子×3 + Ubuntu16.04
网上抄来抄去的大致是这几种办法,各有优略:
这个办法最为通用
首先写个启动脚本,和一般启动脚本不太一样,需要一些必要的注释
#!/bin/sh
### BEGIN INIT INFO
# Provides: start_node.sh
# Required-start: $local_fs $remote_fs $network $syslog
# Required-Stop: $local_fs $remote_fs $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts the svnd.sh daemon
# Description: starts svnd.sh using start-stop-daemon
### END INIT INFO
gnome-terminal --window -x bash -c "source ~/xxx/devel/setup.bash; roscore; "
sleep 10
gnome-terminal --window -x bash -c "source ~/xxx/devel/setup.bash; roslaunch x x.launch; "
sleep 10
gnome-terminal --window -x bash -c "source ~/xxx/devel/setup.bash; roslaunch x tf.launch; "
sleep 10
gnome-terminal --window -x bash -c "source ~/xxx/devel/setup.bash; roslaunch x x.launch; "
sleep 10
gnome-terminal --window -x bash -c "source ~/xxx/devel/setup.bash; roslaunch x x.launch; "
sleep 10
gnome-terminal --window -x bash -c "source ~/xxx/devel/setup.bash; roslaunch x x.launch; "
exit 0
写好了之后
sudo cp xxx.sh /etc/init.d/
sudo chmod +x /etc/init.d/xxx.sh
sudo update-rc.d xxx.sh default 90 10
一般情况下就已经生效了,那么需要注意的地方是:
这种办法下使用gnome-terminal --window -x bash -c 这种弹窗命令是不生效的!
执行sh是不生效的,如sh xxx.sh!(有的人说是路径问题,可惜并不是)
挂ssh的命令也不行 ssh或者sshpass都没用
多个命令写在一起也是不行的 ,无论是用&、&&、||、;都一样
那要你有什么用啊 掀桌
所以如果你不涉及ssh远程执行就一个一个写成本地的
比如就写个roscore,这种是没有问题的
但是凡事都有例外,就是其他的比如改改时间写写日志都是可以的
这个最简单
只要sudo gedit /etc/rc.local
的exit 0 前面写就可以了
和上面的红字遇到的问题基本一致
但是有的时候不执行是因为rc.local没有执行权限
走到这里我已经花了四天时间了
因为板子外接一个显示器很麻烦,而且在外地出差需要公司邮寄过来
思路是这样的:因为有三块板子,可以互相唤起,所有在其中一块上运行gnome-session-properties
写一个这个块板子上的引导文件包
两部分:1、主要文件,顺序启动所有节点
2、节点文件,用sshpass连接过去远程执行
这是主要文件:
#!/bin/bash
sleep 20
gnome-terminal --window -x bash -c "sh /home/xx/bash1/bash1/1.sh;exec bash"
sleep 6
gnome-terminal --window -x bash -c "sh /home/xx/bash1/bash1/2.sh;exec bash"
sleep 5
gnome-terminal --window -x bash -c "sh /home/xx/bash1/bash1/3.sh;exec bash "
sleep 10
gnome-terminal --window -x bash -c "sh /home/xx/bash1/bash1/4.sh;exec bash"
sleep 10
gnome-terminal --window -x bash -c "sh /home/xx/bash1/bash1/5.sh;exec bash"
sleep 5
gnome-terminal --window -x bash -c "sh /home/xx/bash1/bash1/6.sh;exec bash"
sleep 5
gnome-terminal --window -x bash -c "sh /home/xx/bash1/bash1/7.sh;exec bash"
sleep 5
gnome-terminal --window -x bash -c "sh /home/xx/bash1/bash1/8.sh;exec bash"
其中开始休眠20秒是为了等待网络就绪,然后sh文件的路径一定要用绝对路径,后面的exec bash是为了防止闪退,这样就算不成功也可以看到是什么信息表示了为了不行。
转载请著名出处:https://blog.csdn.net/Andrwin/article/details/100883593
然后是节点文件:
#!/bin/bash
sshpass -p 密码 ssh -tty 用户名@x.x.x.xip << eeooff
roscore
eeooff
echo done!
其中sshpass需要联网安装,如果你的板子也像我这种日了狗一样只能组个局域网的话可以下载里面包
但是要注意区分pc上的和板子上的架构不一样,板子上是arm64平台的
https://launchpad.net/ubuntu/xenial/arm64/?text=ntpdate
这个网站可以下载arm64的离线包
再贴一个节点文件吧
#!/bin/bash
sshpass -p 密码 ssh -tty 用户名@x.x.x.xip << eeooff
source ~/.bashrc
roslaunch xxx tf.launch
eeooff
echo done!
source 的东西和其他的都可以加进去,不需要连接符
eeooff之间的东西是一条接着一条在远程机器上执行的命令
最后把主要文件用绝对路径的形式加入到gnome-session-properties中去 注意是 sh /xx/x/xx/x.sh
其实只要有一个命令可以开机启动终端窗口和执行ssh剩下的问题都很容易