所有受限制的应用程序包_【ROS-SLAM】Cartographer ROS官方文档翻译学习(3)——应用到自己的机器人

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

第二个参数需要修改为你的数据包的路径。

理想情况下,你应该就可以看到预期的效果了!当然了,多数情况下还需要再进行优化,详见下一章节。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值