在ros下启动ORB-SLAM2的步骤比较繁琐,比如运行单目版本,首先需要启动相机,然后在新的命令窗口下打开ORB-SLAM2的相应节点,这个步骤需要输入配置好的路径等:
# ros 启动orb-slam2的单目节点
$ rosrun ORB_SLAM2 Mono PATH_TO_VOCABULARY PATH_TO_SETTINGS_FILE
为了以后偷懒,用一个launch文件来管理ORB-SLAM2的启动过程,本文主要记录完成这个简单任务的过程。
一. 在ROS下建立orb_launch包
参考官方的教程,建立orb_launch package,其实就一行代码:
$ cd ~/catkin_ws/src
$ catkin_create_pkg orb_launch std_msgs rospy roscpp
然后在orb_launch文件夹下建立launch文件夹。
二.在launch文件夹下建立xxx.launch文件
我主要建立了三个launch文件,具体的功能是:
- orb_slam2.launch : 单独启动orb_slam2 的某一个ros节点
- orb_slam2_mono.launch : 启动usb相机和orb_slam2 mono节点
- orb_slam2_rgbd.launch : 启动深度相机和orb_slam2 rgbd节点
具体代码:
放单目版本的文件内容(每个版本都差不多,具体代码我已经上传到github:
weihaotobe94/ORB_SLAM2_launchgithub.com![e4ef2f3906dd52764acdc0913106fc1e.png](https://i-blog.csdnimg.cn/blog_migrate/09a79c4acf869a6b4aea1eca0629c94c.jpeg)
)weihaotobe94/ORB_SLAM2_launch)
orb_slam2_mono.launch :
<launch>
<!--定义全局参数-->
<arg name="rgb_image" default="/usb_cam/image_raw"/>
<arg name="path_to_vacabulary" default="/home/weihao/SLAM_Project/ORB_SLAM2-master/Vocabulary/ORBvoc.txt"/>
<arg name="path_to_settings" default="/home/weihao/SLAM_Project/ORB_SLAM2-master/Examples/Monocular/TUM1.yaml"/>
<!--启动摄像头节点(USB相机)-->
<include file="$(find usb_cam)/launch/usb_cam-test.launch"/>
<!--启动ORB-SLAM2 RGBD-->
<node name ="Mono" pkg="ORB_SLAM2" type="Mono"
args="$(arg path_to_vacabulary) $(arg path_to_settings)" respawn="true" output="screen">
<remap from="/camera/image_raw" to="$(arg rgb_image)"/>
</node>
</launch>
可以根据实际情况修改全局参数的配置。(我的相机输出是640*480,因此直接调用了TUM1.yaml的配置文件,也可标定相机然后加载自己的配置文件,这里只是看一下效果,虽然实际差别可能不会太大,因为orb_slam2貌似对相机内参进行了在线优化)
三.运行效果
启动上述节点
$ roslaunch orb_launch orb_slam2_mono.launch
实际运行效果如图:
![f720953695a9d27411c5a1599d298c3e.png](https://i-blog.csdnimg.cn/blog_migrate/f4faf8d6563d08c112159e3c96effc9b.jpeg)
四.问题总结
- roslaunch找不到orb_slam2 mono节点
原因:ros找不到orb_slam2的ros包,需要将路径放在.bashrc文件末尾
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:PATH/ORB_SLAM2/Examples/ROS
然后"source ~/.bashrc",假如仍然不能正常运行,请参考:(十一)ORBSLAM2在ROS下运行-布布扣-bubuko.com
2.launch文件的格式一定要写对,经常忘了写/等。
3.本来打算用一个config/xx.yaml文件来管理所有参数,但node 的args传递参数没完全明白,之后再改进。
好长时间没有搞ros了,写十行代码花了2个小时,以后还是要加强学习啊!!!!