robot_localization(2):准备数据

在使用robot_localization中的状态估计节点开始之前,用户必须确保其传感器数据格式正确,这一点很重要。每种类型的传感器数据都有各种注意事项,建议用户在尝试使用robot_localization之前完整阅读本教程。

有关更多信息,建议用户观看ROSCon 2015的演示文稿

1 遵守ROS标准

要考虑的两个最重要的ROS REP是:

  • REP-103(标准计量单位和座标约定)
  • REP-105(座标系约定)

鼓励不熟悉ROS或状态估计的用户阅读两个REP,因为它几乎肯定会帮助您准备传感器数据。robot_localization尝试尽可能遵守这些标准。

此外,它可能会有益于用户查看每种受支持的ROS消息类型的规范:

2 座标系和转换传感器数据

REP-105指定了四个主要座标系:base_linkodommapEarthbase_link座标系牢固地固定在机器人上。mapodom是固定的世界座标系,其原点通常与机器人的起始位置对齐。Earth座标系用于为多个map座标系(例如,分布在较大区域的机器人)提供公共参考座标系。earth座标系与本教程无关。

robot_localization的状态估计节点会生成状态估计,其状态在mapodom座标系中给出,其速度在base_link座标系中给出。在与状态融合之前,所有传入的数据都将转换为这些座标系之一。每种消息类型中的数据如下转换:

  • nav_msgs/Odometry:所有位姿数据(位置和方向)都从消息头的frame_id转换为world_frame参数指定的座标系(通常为mapodom)。在消息本身中,这特别是指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/Posesrobot_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-103sensor_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_idbase_link_frame之间进行转换。
  • 协方差夸大。在测量中忽略变量的首选方法是通过odomN_config参数。
  • 缺少协方差。如果已配置给定传感器以将给定变量融合到状态估计节点中,则该值的方差(即位置(i,i)(i,i)处的协方差矩阵值,其中ii是该变量)不应为0。如果正在融合的变量遇到方差值0,则状态估算节点将为该值添加一个小的epsilon值(1e-6)。更好的解决方案是让用户适当设置协方差。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章