在使用robot_localization
中的状态估计节点开始之前,用户必须确保其传感器数据格式正确,这一点很重要。每种类型的传感器数据都有各种注意事项,建议用户在尝试使用robot_localization
之前完整阅读本教程。
有关更多信息,建议用户观看ROSCon 2015的演示文稿。
1 遵守ROS标准
要考虑的两个最重要的ROS REP是:
鼓励不熟悉ROS或状态估计的用户阅读两个REP,因为它几乎肯定会帮助您准备传感器数据。robot_localization
尝试尽可能遵守这些标准。
此外,它可能会有益于用户查看每种受支持的ROS消息类型的规范:
- nav_msgs/Odometry
- geometry_msgs/PoseWithCovarianceStamped
- geometry_msgs/TwistWithCovarianceStamped
- sensor_msgs/Imu
2 坐标系和转换传感器数据
REP-105指定了四个主要坐标系:base_link
,odom
,map
和Earth
。base_link
坐标系牢固地固定在机器人上。map
和odom
是固定的世界坐标系,其原点通常与机器人的起始位置对齐。Earth
坐标系用于为多个map
坐标系(例如,分布在较大区域的机器人)提供公共参考坐标系。earth
坐标系与本教程无关。
robot_localization
的状态估计节点会生成状态估计,其状态在map
或odom
坐标系中给出,其速度在base_link
坐标系中给出。在与状态融合之前,所有传入的数据都将转换为这些坐标系之一。每种消息类型中的数据如下转换:
- nav_msgs/Odometry:所有位姿数据(位置和方向)都从消息头的
frame_id
转换为world_frame
参数指定的坐标系(通常为map
或odom
)。在消息本身中,这特别是指pose
属性中包含的所有内容。所有twist
数据(线速度和角速度)都将从消息的child_frame_id
转换为base_link_frame
参数(通常为base_link
)指定的坐标系。 - geometry_msgs/PoseWithCovarianceStamped:以与Odometry消息中的pose数据相同的方式处理。
- geometry_msgs/TwistWithCovarianceStamped:以与Odometry消息中的twist数据相同的方式处理。
- sensor_msgs/Imu:尽管ROS社区正在解决IMU消息,但目前存在一些歧义。大多数IMU在固定的世界坐标系中报告方向数据,该坐标系的X和Z轴分别由指向磁北和地球中心的向量定义,Y轴朝东(与磁北向量偏移90度)。此坐标系通常称为NED(北,东,下)。但是,REP-103为室外导航指定了ENU(东,北,上)坐标系。在撰写本文时,
robot_localization
假定所有IMU数据都使用ENU坐标系,并且不适用于NED坐标系数据。将来可能会有所改变,但就目前而言,用户应确保将数据转换为ENU框架后,再将其与robot_localization
中的任何节点一起使用。
IMU也可以在机器人的“中性”位置以外的其他位置定向。例如,用户可以将IMU安装在其侧面,或者旋转IMU使其面对机器人正面以外的方向。通常通过从base_link_frame
参数到IMU消息的frame_id
的静态转换来指定此偏移量。robot_localization
中的状态估计节点将自动校正传感器的方向,以使其数据与base_link_frame
参数指定的坐标系对齐。
3 处理tf_prefix
随着从ROS Indigo开始向tf2的迁移,robot_localization
仍然允许使用tf_prefix
参数,但是根据tf2,所有frame_id
值的前导”/“都将被去除。
4 每种传感器消息类型的注意事项
4.1 Odometry
许多机器人平台都配备了提供瞬时平移和旋转速度的车轮编码器。许多人还内部整合了这些速度以生成位置估计。如果您对此数据负责或可以对其进行编辑,请记住以下几点:
1.Velocities/Poses:robot_localization
可以整合速度或绝对姿态信息。通常,最佳做法是:
- 如果里程计同时提供位置和线速度,请融合线速度。
- 如果里程计同时提供方向和角速度,请融合方向。
注意:如果您有两个方向数据来源,则需要特别注意。如果两个方向都具有精确的协方差矩阵,则可以安全地融合方向。但是,如果其中一个或两个都未报告其协方差,则应仅融合来自更精确传感器的方向数据。对于另一个传感器,请使用角速度(如果已提供),或继续融合绝对方向数据,但是要为该传感器打开_differential模式。
2.frame_id:参见上面有关坐标系和变换的部分。
3.协方差:协方差值与robot_localization
有关。robot_pose_ekf尝试在Odometry消息中融合所有pose变量。已经编写了一些机器人驱动程序来满足其要求。这意味着,如果给定的传感器没有产生某个变量(例如,没有报告位置Z的机器人),那么使robot_pose_ekf
忽略它的唯一方法是将其方差膨胀到一个非常大的值(如1000),以便有效地忽略所讨论的变量。这种做法既不必要,甚至有害于robot_localization
的性能。例外情况是您有第二个输入源测量有问题的变量,在这种情况下,协方差将起作用。
注意:有关更多信息,请参见配置robot_localization和从robot_pose_ekf迁移。
4.Signs:遵守REP-103意味着您需要确保数据符号正确无误。例如,如果您有一个地面机器人,然后逆时针旋转它,则其偏航角应增加,并且其偏航速度应为正。如果将其向前推动,则其X位置应增加,并且其X速度应为正。
5.Transforms:广播odom->base_link
转换。当world_frame
参数设置为配置文件中odom_frame
参数的值时,robot_localization
的状态估计节点既输出nav_msgs/Odometry消息中的位置估计,也输出从其odom_frame
参数指定的坐标系到其base_link_frame
参数的转换。但是,某些机器人驱动程序也会将此测距信息与里程计信息一起广播。如果用户希望robot_localization
负责此转换,则需要禁用其机器人驱动程序对该转换的广播。这通常作为参数公开。
4.2 IMU
除以下内容外,请务必阅读上述有关坐标系和IMU数据转换的部分。
1.遵守规范:与odometry一样,请确保您的数据符合REP-103和sensor_msgs/Imu规范。仔细检查数据符号,并确保frame_id
值正确。
2.协方差:遵循odometry的建议,请确保您的协方差有意义。不要使用较大的值来使滤波器忽略给定的变量。将您要忽略的变量的配置设置为false
。
加速度:注意加速度数据。robot_localization
中的状态估计节点假定放置在平面上其中立的右侧向上位置的IMU将:
- Measure +9.81 meters per second squared for the Z axis.
- If the sensor is rolled +90 degrees (left side up), the acceleration should be +9.81 meters per second squared for the Y axis.
- If the sensor is pitched +90 degrees (front side down), it should read -9.81 meters per second squared for the X axis.
4.3 PoseWithCovarianceStamped
请参阅Odometry。
4.4 TwistWithCovarianceStamped
请参阅Odometry。
5 常见错误
- 输入数据不符合REP-103。确保所有值(尤其是方向角度)在正确的方向上增加或减少。
- 不正确的
frame_id
值。应当在base_link_frame
参数给定的坐标系中报告速度数据,或者应该在速度数据的frame_id
和base_link_frame
之间进行转换。 - 协方差夸大。在测量中忽略变量的首选方法是通过
odomN_config
参数。 - 缺少协方差。如果已配置给定传感器以将给定变量融合到状态估计节点中,则该值的方差(即位置 ( i , i ) (i,i) (i,i)处的协方差矩阵值,其中 i i i是该变量)不应为0。如果正在融合的变量遇到方差值0,则状态估算节点将为该值添加一个小的epsilon值(1e-6)。更好的解决方案是让用户适当设置协方差。