![d7f10ceaf2ceb44847830e010fc87236.png](https://img-blog.csdnimg.cn/img_convert/d7f10ceaf2ceb44847830e010fc87236.png)
将Cartographer-ROS应用到自己的机器人
此系列为Cartographer-ROS官方文档的翻译与学习 正文是官方文档翻译,引用块内是我的注解,如有不妥当的地方,还请指正,原地址见:Cartographer-ROS官方文档google-cartographer-ros.readthedocs.io
由于还没有建立出合适的机器人模型,本文档的方法尚未验证。
检测你的程序包
Cartographer ROS提供了一个名为“cartographer_rosbag_validate”的工具来分析你的程序包中的数据是否正确。
得益于Cartographer作者的经验,我们可以利用这个工具检测程序包中的各种常见错误。举例来说,如果检测到一个sensor_msgs/Imu类型的话题(Imu数据),这个工具将会确认数据中是否存在重力向量(gravity vector),因为Cartographer需要通过重力向量来确定地面的方向。
这个工具还能帮助你提高数据品质。例如,如果你用一个Velodyne激光雷达采集数据,它会建议你对传感器发送的每个UDP包使用一个“sensor_msgs/PointCloud2”类型的数据来记录,而非每次循环使用一条消息。有了这种粒度(granularity),Cartographer就可以解析机器人运动引起的点云变形,从而得到更好的重建效果。
如果你已经source了Cartographer ROS环境(见这一篇文章开头),就可以用如下运行这个检测工具:
cartographer_rosbag_validate -bag_filename your_bag.bag
以前一篇文章中的德意志博物馆2D数据包为例,运行:
cd ~/Downloads/
cartographer_rosbag_validate -bag_filename cartographer_paper_deutsches_museum.bag
创建.lua配置文件
Cartographer具有很强的适应性,可以通过改变配置支持许多种类的机器人工作。机器人的配置信息是从一个名为“options”的数据结构中读取的,它需要在一个Lua文件中进行定义。
配置信息定义在如下目录中:
~/catkin_ws/src/cartographer_ros/cartographer_ros/configuration_files/
并安装在如下目录中:
~/catkin_ws/install_isolated/share/cartographer_ros/configuration_files/
注意:理想情况下,.lua配置文件是基于机器人而非基于数据包的。
首先,我们将演示程序的配置文件拷贝一份,以其为基础进行修改,以适应自己的需求。
如果你想要使用3D SLAM:
cp ~/catkin_ws/install_isolated/share/cartographer_ros/configuration_files/backpack_3d.lua ~/catkin_ws/install_isolated/share/cartographer_ros/configuration_files/my_robot.lua
如果你想要使用2D SLAM:
cp ~/catkin_ws/install_isolated/share/cartographer_ros/configuration_files/backpack_2d.lua ~/catkin_ws/install_isolated/share/cartographer_ros/configuration_files/my_robot.lua
接下来,你可以调整拷贝出来的“my_robot.lua”文件来满足你的机器人的需求。在“options”代码块中定义了Cartographer ROS前端与数据包的接口。其后的代码是关于Cartographer的内部设置,我们可以暂时先忽略。
my_robot.lua——“options”代码块内容
options = {
map_builder = MAP_BUILDER,
trajectory_builder = TRAJECTORY_BUILDER,
map_frame = "map",
tracking_frame = "base_link",
published_frame = "base_link",
odom_frame = "odom",
provide_odom_frame = true,
publish_frame_projected_to_2d = false,
use_odometry = false,
use_nav_sat = false,
use_landmarks = false,
num_laser_scans = 0,
num_multi_echo_laser_scans = 1,
num_subdivisions_per_laser_scan = 10,
num_point_clouds = 0,
lookup_transform_timeout_sec = 0.2,
submap_publish_period_sec = 0.3,
pose_publish_period_sec = 5e-3,
trajectory_publish_period_sec = 30e-3,
rangefinder_sampling_ratio = 1.,
odometry_sampling_ratio = 1.,
fixed_frame_pose_sampling_ratio = 1.,
imu_sampling_ratio = 1.,
landmarks_sampling_ratio = 1.,
}
官方提供两个参考文档:
Cartographer ROS 配置参考文档
Cartographer 配置参数
在所有需要调整的值中,最重要的是环境的TF frame的ID以及机器人的map_frame、tracking_frame、published_frame以及odom_frame。
注意:你既可以从数据包的 /tf 话题中、也可以从机器人的.urdf模型中分配你的机器人TF树。
警告:你应该确保你的位姿(poses)是可信的!你的IMU和LIDA所测出的连杆(link)只要有一点偏移,就会为地图重建带来误差。Cartographer虽有一定的修正误差的能力,但也是有限的!
另外,你还需要定义是传感器的种类和数量:
- num_laser_scans: 话题 sensor_msgs/LaserScan 的数量
- num_multi_echo_laser_scans: 话题 sensor_msgs/MultiEchoLaserScan 的数量
- num_point_clouds: 话题
sensor_msgs/PointCloud
的数量
你还可以通过设置use_landmarks和use_nav_sat来启用landmarks和GPS作为定位信息的辅助来源。
剩下的选项一般应保持不变。
然而,在你的数据包里面还有一些是必须要调整的全局变量:
TRAJECTORY_BUILDER_3D.num_accumulated_range_data (3D数据)
TRAJECTORY_BUILDER_2D.num_accumulated_range_data (2D数据)
这个变量定义了构建一次完整的扫描所需要的消息数目。如果你遵循cartographer_rosbag_validate 的建议,每次扫描使用100条ROS消息,这个变量就设置为100。如果你有两个测距传感器(例如两个激光雷达),它们每次都同时进行完整的扫描,你就应该将这个变量设置为2。
为你的SLAM方案创建.launch文件
你可能已经注意到,在先前的每个演示程序中,都需要运行一个不同的.launch指令。在Cartographer中,每个机器人和每种类型的SLAM都需要创建一个.launch文件。
.launch文件的示例定义在:
~/catkin_ws/src/cartographer_ros/cartographer_ros/launch/
安装在:
~/catkin_ws/install_isolated/share/cartographer_ros/launch/
首先,我们拷贝一些给出的演示程序,在此基础上进行修改(如果是2Dslam,就将所有3d改为2d):
cp ~/catkin_ws/install_isolated/share/cartographer_ros/launch/backpack_3d.launch ~/catkin_ws/install_isolated/share/cartographer_ros/launch/my_robot.launch
cp ~/catkin_ws/install_isolated/share/cartographer_ros/launch/demo_backpack_3d.launch ~/catkin_ws/install_isolated/share/cartographer_ros/launch/demo_my_robot.launch
cp ~/catkin_ws/install_isolated/share/cartographer_ros/launch/offline_backpack_3d.launch ~/catkin_ws/install_isolated/share/cartographer_ros/launch/offline_my_robot.launch
cp ~/catkin_ws/install_isolated/share/cartographer_ros/launch/demo_backpack_3d_localization.launch ~/catkin_ws/install_isolated/share/cartographer_ros/launch/demo_my_robot_localization.launch
cp ~/catkin_ws/install_isolated/share/cartographer_ros/launch/assets_writer_backpack_3d.launch ~/catkin_ws/install_isolated/share/cartographer_ros/launch/assets_writer_my_robot.launch
- my_robot.launch:使用真实的传感器数据,对机器人执行在线实时SLAM
- demo_my_robot.launch:用来开发机器人,需要一个参数bag_filename来从记录中重载数据。这个launch文件还能够生成一个rviz窗口,将Cartographer的状态可视化。
- offline_my_robot.launch:这个文件和demo_my_robot.launch非常类似,但会尽可能快地执行SLAM,显著地提高建图的速度。这个launch也能通过bag_filename参数接受多个数据包文件。
- demo_my_robot_localization.launch:这个文件也和demo_my_robot.launch非常类似,但需要一个load_state_filename参数,该参数指向先前Cartographer执行的.pbstream记录。先前的记录将作为预计算的地图使用,Cartographer将仅对该地图执行本地化。
- assets_writer_my_robot.launch:用于从先前Cartographer执行的.pstream记录中提取数据
为了适应你的机器人,需要在这些文件中做一些微调:
- 给予 -configuration_basename 的每个参数都需要调整以指向 my_robot.lua
- 如果你决定使用一个urdf文件来描述你的机器人,那么你应当将其放置在“install_isolated/share/cartographer_ros/urdf”路径下,且调整robot_description参数来指向你的urdf文件名
- 如果你决定采用/tf消息,则你可以移除robot_description参数、robot_state_publisher节点和以“-urdf”开始的行
- 如果你的包或者传感器所发布的话题和Cartographer ROS需要的不一致,你可以使用<remap>标签来重定向你的话题。需要的话题名称取决于你使用的测距设备的类型,如下:
1. IMU话题需要命名为“imu”
2. 如果你只用了一个sensor_msgs/LaserScan话题,则需要命名为“scan”。更多的时候,就依次命名为“scan_1”,“scan_2”等等
3. 如果你只使用了一个sensor_msgs/MultiEchoLaserScan话题,则需要命名为“echoes”,更多的时候,就依次命名为“echoes_1”、“echoes_2”等等
4. 如果你只使用了一个sensor_msgs/PointCloud2话题,则需要命名为“points2”,更多的时候,就依次命名为“points2_1”、“points2_2”等等
测试你的配置
完成了所有的设置以后,使用如下命令启动Cartographer:
roslaunch cartographer_ros my_robot.launch bag_filename:=/path/to/your_bag.bag
第二个参数需要修改为你的数据包的路径。
理想情况下,你应该就可以看到预期的效果了!当然了,多数情况下还需要再进行优化,详见下一章节。