准备工作,根据 vins-fusion 开源代码提示安装 vins-fusion 镜像
https://github.com/HKUST-Aerial-Robotics/VINS-Fusion
并且需要主机(无人机或其他设备)发布 ros 话题
设置主机(工作站)和从机(无人机)的ROS_MASTER_URI(用于主机和从机的ROS通信)
(1)设置主机 ROS_MASTER_URI
首先进入~/.bashrc界面
lilabws01@lilabws01:~$ sudo gedit ~/.bashrc
在文本最后加入(如果已有则修改),并保存
export ROS_MASTER_URI=http://192.168.1.201:11311 # 主机IP
export ROS_HOSTNAME=192.168.1.201 # 本地IP
export ROS_IP=192.168.1.201 # 本地IP
source 当前该文件
lilabws01@lilabws01:~$ source ~/.bashrc
设置从机 ROS_MASTER_URI
首先进入~/.bashrc界面
nvidia@NXX-02:~$ sudo gedit ~/.bashrc
在文本最后加入(如果已有则修改),并保存
export ROS_MASTER_URI=http://192.168.1.201:11311 # 主机IP
export ROS_HOSTNAME=192.168.1.211 # 本地IP
export ROS_IP=192.168.1.211 # 本地IP
source 当前该文件
nvidia@NXX-02:~$ source ~/.bashrc
方法一(最稳妥)
(1)运行 roscore
(2)创建 docker 容器,终端输入
docker run \
-it \
--rm \
--net=host \
-v ~/catkin_ws/src/VINS-Fusion:/root/catkin_ws/src/VINS-Fusion/ \
-v ~/.bashrc:/root/.bashrc \
ros:vins-fusion \
/bin/bash
(3)进入容器之后,cmake编译,设置主从机ROS_MASTER_URI,并测试是否能受到话题,终端输入
cd /root/catkin_ws/;
catkin config \
--env-cache \
--extend /opt/ros/noetic \
--cmake-args \
-DCMAKE_BUILD_TYPE=Release; \
catkin build; \
source ~/.bashrc; \
rostopic list;
(4)在容器内,启动 vins 节点
rosrun vins vins_node /root/catkin_ws/src/VINS-Fusion/config/realsense_d435i/realsense_stereo_imu_config.yaml
如果需要调用回环,需要另起一个终端,
查看前面运行的 docker 容器 ID,终端输入
docker ps
输出如下结果
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fc1060e028a7 ros:vins-fusion "/ros_entrypoint.sh …" 2 minutes ago Up 2 minutes quizzical_clarke
注意的容器 ID 为 fc1060e028a7
然后进入容器
docker exec -it fc1060e028a7 /bin/bash
运行回环节点
rosrun loop_fusion loop_fusion_node /root/catkin_ws/src/VINS-Fusion/config/realsense_d435i/realsense_stereo_imu_config.yaml
(5)在物理机终端打开 rviz 即可看见 vins 效果
rviz -d ~/catkin_ws/src/VINS-Fusion/config/vins_rviz_config.rviz
方法二
(利用shell脚本之间生成容器并运行vins-fusion)
进入 vins-fusion 的 Docker 文件夹
cd ~/catkin_ws/src/VINS-Fusion/docker
编辑 run.sh 文件
新增挂载 ~/.bashrc 文件,替换 source 的文件 devel/setup.bash 为 ~/.bashrc;
-v ~/.bashrc:/root/.bashrc
source ~/.bashrc;
运行
./run.sh ~/catkin_ws/src/VINS-Fusion/config/realsense_d435i/realsense_stereo_imu_config.yaml
方法三
创建一个新的shell脚本
touch run_vins.sh
粘贴如下代码
#!/bin/bash
trap : SIGTERM SIGINT
CONFIG_IN_DOCKER="/root/catkin_ws/src/VINS-Fusion/config/realsense_d435i/realsense_stereo_imu_config.yaml"
roscore &
ROSCORE_PID=$!
sleep 1
rviz -d ~/catkin_ws/src/VINS-Fusion/config/vins_rviz_config.rviz &
RVIZ_PID=$!
docker run \
-it \
--rm \
--net=host \
-v ~/catkin_ws/src/VINS-Fusion/:/root/catkin_ws/src/VINS-Fusion/ \
-v ~/.bashrc:/root/.bashrc \
ros:vins-fusion \
/bin/bash -c \
"cd /root/catkin_ws/; \
catkin config \
--env-cache \
--extend /opt/ros/$ROS_DISTRO \
--cmake-args \
-DCMAKE_BUILD_TYPE=Release; \
catkin build; \
source ~/.bashrc; \
rostopic list; \
rosrun vins vins_node ${CONFIG_IN_DOCKER}"
wait $ROSCORE_PID
wait $RVIZ_PID
if [[ $? -gt 128 ]]
then
kill $ROSCORE_PID
kill $RVIZ_PID
fi
然后运行
./run_vins.sh
此时主机开始监听无人机在话题中发布的消息,在从机端发布话题即可在rviz中可视化。