最近我在考虑能不能使用RVIZ可视化ORB_SLAM2,突然发现一位前辈的分享,为防止以后大佬删除了,我fork到了自己的github,这里做个笔记,记录一下.
这篇博客主要分析一下相关代码
可视化的几个要点
ORB-SLAM
中关于Rviz
的可视化:
- ORB-SLAM的Rviz可视化使用单独的一个类来完成可视化信息的发布:
MapPublisher
类. - 所有的可视化信息都是Rviz的Mark类型,根据发布的地图点、关键帧、
Covisibility Graph、Spanning Tree
和相机轨迹,使用了不同的Mark类型. - 所有的可视化信息,包括地图、轨迹等都是从
ORB-SLAM
中的Map
类中获取的. - 每次获得一帧图像,进行
Track
后,利用MapPublisher
类发布可视化信息. - 在配置相应的
Rviz
,使其可以接收可视化信息.
明白了这几点之后,在ORB-SLAM2中添加Rviz可视化模块就很简单了,主要对源代码做以下改动:
- 添加
MapPublisher
类和配置Rviz
,可以直接复用ORB-SLAM
中的MapPublisher
类和Rviz
文件,并在每次Track
之后(执行完mpSLAM->TrackStereo()
), 利用MapPublisher
类发布可视化信息. - 为Map类添加返回相关信息的接口.
特别要注意:
ORB-SLAM2的坐标系下,z轴
是朝前的,而Rviz
的坐标系下,z轴
是朝上的,因此要做相应的转换.
ROS包建立
创建相关软件包
在catkin_ws/src
目录下新建软件包并编译:
1 | catkin_create_pkg my_image_transport image_transport cv_bridge |
创建图像发布者程序
新建my_image_transport/src/my_publisher.cpp
1 | #include <ros/ros.h> |
代码解释:
1 | line 1-4: |
创建图像订阅者程序
新建my_image_transport/src/my_subscriber.cpp
:
1 | #include <ros/ros.h> |
代码解释:
1 | line 6:回调函数,当有新的图像消息到达camera/image时,该函数就会被调用; |
相关配置文件
CMakeLists.txt
内容
1 | cmake_minimum_required(VERSION 2.8.3) |
package.xml
文件中添加
1 | <build_depend>opencv2</build_depend> |
编译软件包
1 | cd ~/catkin_ws |
运行节点
单独开启一个终端执行roscore
,启动ros节点管理器。
开启另一个终端,启动发布者节点:
1 | rosrun my_image_transport my_publisher /home/xxx/catkin_ws/src/my_image_transport/000.png |
运行订阅者节点:
1 | rosrun my_image_transport my_subscriber |
ORB_SLAM2 ROS模块结点的编译
在环境变量ROS_PACKAGE_PATH
中添加Examples/ROS/ORB_SLAM2
的路径:
1 | echo "source ~/slam/ORB_SLAM2/Examples/ROS/ORB_SLAM2/build/devel/setup.sh" >> ~/.bashrc |
在~/slam/ORB_SLAM2目录下执行:
1 | chmod +x build_ros.sh |
等待编译成功.
运行结果
执行命令
1 | roslaunch my_image_transport stereo_image_transport.launch |
使用PCL库显示地图点
注意:ORB_SLAM2
系统Map
类中的地图点是世界坐标系中的所有地图点,而不是每个关键
1 | ROSpointcloud_to_laserscan包pointcloud_to_laserscan_node`节点将点云`PointCloud`转成`2D激光扫描 |
订阅节点:cloud_in(sensor_msgs/PointCloud2)
发布节点:scan(sensor_msg/LaserScan)
配置好ROS程序包,在MapPulisher
类中稍作修改,参照如下内容:
1 | #include<ros/ros.h> |
效果展示:
参考资料
[1] 2D Grid Mapping and Navigation with ORB SLAM. Abhineet Kumar Singh, Ali Jahani Amiri.
[2] 系统Rviz可视化方案