之前在项目上遇到一个需求:在无人驾驶车辆上安装一键启动程序以及开机自启动程序,这样就可以使得用户在上车之后轻松完成车辆的启动,避免繁琐的指令操作
一键启动的操作大概分为以下四个阶段:
1. 设置sudo免密
2. 编写一键启动shell文件 ——包括线控,控制,档位
3. 编写自启动shell文件——包括通讯,视觉,雷达,规划,决策,POS
4. 添加自启动程序到开机程序
5. 编写一键终止程序——关闭线控,控制,档位
系统: ubantu18.04
1. sudo免密
这是因为在后期一件启动的过程中某些指令会需要使用权限,需要输入密码,如果密码输入不及时就会中断程序,当然一般情况下来不及输入
看了一些教程,都是通过管道之类的解决,但是太麻烦,不如直接设置sudo免密
不过设置之后,之后涉及到操作权限的口令要注意哦!!!!!
首先打开终端,在命令行输入:
sudo vim /etc/sudoers
会打开一个编辑界面
找到最下面的一行
写入
sptuan ALL=(ALL:ALL) NOPASSWD: ALL
写入之后,按ESC键后输入:wq 回车保存并退出
2. 编写一键启动shell文件
#!/bin/sh
#chkconfig: 2345 22 80
#description: Filebeat Service
# 打开控制层
{
gnome-terminal --tab "cw_control" -x bash -c "cd /home/sptuan/Cw_BUS/autotju_bus/tjuPy_zt/modules/wiredcontrol/ChengWu_bus_One_wending;python2 cw_control.py ; exec bash" &
gnome-terminal --tab "cw_wiredcontrol" -x bash -c "cd /home/sptuan/Cw_BUS/autotju_bus/tjuPy_zt/modules/wiredcontrol/ChengWu_bus_One_wending;python2 cw_wiredcontrol_.py ; exec bash" &
gnome-terminal --tab "cw_start" -x bash -c "cd /home/sptuan/Cw_BUS/autotju_bus/tjuPy_zt/modules/wiredcontrol/ChengWu_bus_One_wending;python2 cw_start_stop_button.py ; exec bash"
}
其实命令比较单一:
gnome-terminal --tab :为打开窗口的意思(一个终端下的多个窗口)
x bash -c : 后面的“”中是我们原本要在终端输入的命令,例如在本项目中为了保险起见,我们用命令行先进入对应文件夹之后再启动对应程序
在分号内不同的命令用分号 ; 隔开
3. 编写自启动shell文件
自启动文件其实与一键启动的文件一样,同样是一个shell脚本
唯一不同的是我们需要把他加入的开机启动的程序中,也就是我们的第四步骤
首先我们先编写好这个文件,在这里我们把所有的准备工作包括视觉,雷达,通信等都添加到这个脚本中
#!/bin/sh
#chkconfig: 2345 22 80
#description: Filebeat Service
# 现在可以实现免密和自启动,请把该文件放在主目录下
sleep 3s
# 打开权限
{
gnome-terminal --window -e 'bash -c "source /opt/ros/melodic/setup.bash;roscore;exec bash"' --tab -e 'bash -c "sudo chmod 666 /dev/ttyUSB0;sh can_up.sh;candump can0;exec bash"'
}&&
sleep 2s
# 启动激光雷达
{
gnome-terminal --window -e 'bash -c "cd /home/robosense;./start.sh;candump can0;exec bash"'
}&&
sleep 3s
# 打开视觉端口
{
gnome-terminal --window -e 'bash -c "cd /home/catkin_ws_LidarParse;source devel/setup.bash;roslaunch zt_camera cw_camera.launch;exec bash"'
}&&
sleep 5s
# 启动激光雷达数据发送
{
gnome-terminal --window -e 'bash -c "cd /home/catkin_ws_calmcar_chengwu;source devel/setup.bash;rosrun chengwu_lidar chengwu_lidar;exec bash"'
}&&
sleep 3s
# 启动s1
{
gnome-terminal --window -e 'bash -c "cd /home/catkin_ws_roi;rosrun s_l_one s_l_one_node;exec bash"'
}&&
sleep 2s
# 启动POS,carmera,decision
{
gnome-terminal --tab --name="cw_POS" -x bash -c "cd/home/zhongtong/Cw_BUS/autotju_bus/tjuPy_zt/modules/wiredcontrol/ChengWu_bus_first_codes;python cw_POS.py ; exec bash" &
sleep 0.5s &
gnome-terminal --tab "cw_carmera" -x bash -c "cd/home/zhongtong/Cw_BUS/autotju_bus/tjuPy_zt/modules/wiredcontrol/ChengWu_bus_first_codes ; python3 cw_sl_by_carmera.py ; exec bash" &
sleep 0.5s &
gnome-terminal --tab "cw_decision" -x bash -c "cd/home/zhongtong/Cw_BUS/autotju_bus/tjuPy_zt/modules/wiredcontrol/ChengWu_bus_first_codes ; python3 cw_decision_new.py ; exec bash"
}&&
sleep 2s
# 启动rviz
{
gnome-terminal --window -e 'bash -c "rviz -d zhongtong_ONE/config/rviz/perception.rviz;exec bash"'
}&&
# 打开控制层
{
gnome-terminal --tab "cw_plan" -x bash -c "cd /home/sptuan/Cw_BUS/autotju_bus/tjuPy_zt/modules/wiredcontrol/ChengWu_bus_One_wending;python2 cw_plan_old.py ; exec bash" &
gnome-terminal --tab "ce_decision" -x bash -c "cd /home/sptuan/Cw_BUS/autotju_bus/tjuPy_zt/modules/wiredcontrol/ChengWu_bus_One_wending;python3 cw_decision.py ; exec bash" &
}
每一个{}中都是一个单独的功能,{}之间需要用&&连接
gnome-terminal --window 是单独开一个终端
而gnome-terminal --tab是单独开一个窗口
注意:一键启动和自启动的shell脚本最好放在主目录下
4.添加自启动到开机文件中
打开终端,在终端中输入:gnome-session-properties
会打开以下界面:
点击添加
在命令中可以点击浏览,选择你写好的开机自启动shell文件
名称和备注就随便了,不是很重要
5.编写一键终止程序
这是为了防止中途出现紧急情况人工接管后,让程序自动暂停,暂停的程序应该和一键启动的程序是呼应的,一键启动有哪些,一键终止就有哪些!所以编写时候注意程序的设计,把不需要暂停的放在自启动中!
一键终止程序如下:
#!/bin/bash
# PROCESS=`ps -ef | grep python | grep -v grep | awk '{print $2}' | xargs kill -9`
PROCESSE=`ps -ef | grep cw_start_stop_button.py | awk '{print $2}' | xargs kill -9`
PROCESSA=`ps -ef | grep cw_wiredcontrol_.py | awk '{print $2}' | xargs kill -9`
PROCESSB=`ps -ef | grep cw_control.py | awk '{print $2}' | xargs kill -9`
# PROCESSB=`ps -ef | grep cw_plan_old.py | awk '{print $2}' | xargs kill -9`
这其实是一个信息传输的命令
grep cw_start_stop_button.py :是把关于cw_start_stop_button.py的位置寻找到之后传递给awk,最后通过kill杀死进程!其他的原理都是一样的
由此就完成了整个程序设计和功能实现,欢迎大家交流讨论!