在有(一)、(二)、(三)的基础后,只需要一个全局的shell脚本按需求执行各项命令即可。shell脚本循环监听json文件,根据内容的改变依次执行指令。
选取jq作为shell对json文件的处理工具。ubuntu下使用sudo apt-get install jq安装即可。
脚本remote_communication.sh如下:
#! /bin/bash
count=1
while [ $count -le 2 ];do
sleep 1
map_builder=`jq '.map_builder.map_builder_excute' /home/cabin/Desktop/remote_communication/task_state.json`
...
if [ "$map_builder"x == "1"x ];then
echo -e "map build mode..."
source /home/cabin/cartographer_0_3_0_ws/install_isolated/setup.bash
python /home/cabin/Desktop/remote_communication/map_save.py | roslaunch cartographer_ros demo_backpack_2d_xiaobao_map_builder.launch speed:=1 bag_filename:=/home/cabin/Desktop/record_data_171213_1150/20180119.bag
sleep 1
python /home/cabin/Desktop/remote_communication/json_value_modify.py map_builder.map_builder_excute 0 /home/cabin/Desktop/remote_communication/task_state.json
sleep 1
python /home/cabin/Desktop/remote_communication/json_value_modify.py map_builder.map_builder_exit 0 /home/cabin/Desktop/remote_communication/task_state.json
sleep 1
echo -e "map save succeed..."
fi
if [ ... ];then
...
fi
...
done
流程如下:
1、循环监听json文件;
2、当map_builder.map_builder_excute的值为1时,执行map_save.py脚本监听结束cartographer建图节点的信号,同时打开cartographer的建图程序;否则转至1;
3、建图的程序彻底终止后,依次执行json_value_modify.py将map_builder_excute和map_builder_exit置0;
4、打印“map save succeed...”
5、转至1 。
注意shell脚本为串联执行,上一行任务没完成时不会执行下一行任务,比如cartographer建图的节点没有完全关闭时,是不会执行下一步的。
至此,一个完整的建图流程构建完成。比如当手机发送信号使得json文件中map_builder_excute置1;remote_communication.sh脚本监听到map_builder_execute的改动后启动监听保存地图信号的save_map.py脚本,同时启动cartographer建图程序;手机再次发送信号使得json文件中map_builder_save置1;node_main.cc监听到map_builder_save的改动后将map_builder_save置0的同时结束建图并保存地图,然后将map_builder_exit置1;map_save.py监听到map_builder_exit的改动后将map_builder_exit置0的同时关闭cartographer建图的节点;节点完全关闭后remote_communication.sh可以继续执行剩余流程。建图流程完成后remote_communication.sh继续监听json文件,等待手机信号。
由于项目中手机与树莓派之间传输的信息都封装成了标准ros格式。所以关于通过手机修改树莓派上的json文件的思路大致为通过python文件新建ros节点接收手机发送的topic,根据topic的内容修改json相应内容。python修改json文件与前文类似。