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) (i,i)处的协方差矩阵值,其中 i i i是该变量)不应为0。如果正在融合的变量遇到方差值0,则状态估算节点将为该值添加一个小的epsilon值(1e-6)。更好的解决方案是让用户适当设置协方差。
### 配置和使用 `robot_localization` 包中的 EKF 为了正确配置和使用 `robot_localization` 包中的扩展卡尔曼滤波器 (EKF),需要遵循一系列具体的步骤,这些步骤涉及 ROS 工作环境的准备、包的安装以及参数文件的调整。 #### 安装依赖项 确保已安装必要的软件包。可以通过以下命令完成安装: ```bash sudo apt-get install ros-<your_ros_version>-robot-localization ``` 此命令会下载并安装适用于当前 ROS 版本的 `robot_localization` 软件包[^2]。 #### 参数配置 在实际应用中,`ekf_localization_node` 是核心组件之一,用于实现基于 EKF 的状态估计功能。以下是关键配置要点: 1. **定义输入源** 在 YAML 文件中指定传感器数据源及其对应的测量类型。例如,如果要融合 IMU 和 GPS 数据,则需分别声明它们的作用域及关联属性。 ```yaml frequency: 30 # 设置更新频率(Hz) sensor_timeout: 0.1 # 单位秒的最大等待时间 two_d_mode: false # 是否启用二维模式;默认为三维 transform_time_offset: 0.0 # 时间偏移量设定 imu0: /imu/data # 输入主题名称 imu0_config: [false, false, false, true, true, true, false, false, false, true, true, true, true, true, true] imu0_queue_size: 5 # 缓冲区大小 imu0_nodelay: false # 不延迟标志 ``` 上述片段展示了如何针对 IMU 设备进行细致化的选项定制[^4]^。 2. **初始化条件** 初始协方差矩阵反映了系统的不确定性程度。合理设置初始值有助于提高收敛性能。 ```yaml initial_estimate_covariance: [1e-9, 0, ..., 0 ] # 初始化误差分布表象 [... , ... ,..., ... ] process_noise_covariance: [...] # 过程噪声水平描述 ``` 3. **发布 TF 变换** 如果希望节点自动广播坐标系转换关系,则开启相应开关即可。 ```yaml publish_tf: true # 开启/关闭TF消息传播机制 odom_frame: odom # 输出参考框架标签名 base_link_frame: base_footprint # 移动平台基座参照物标识符 world_frame: odom # 全局地图或者局部里程计视图代号 ``` 通过上述方法能够有效构建起一套完整的定位解决方案体系结构[^3]^。 #### 示例代码展示 下面给出一段简单的启动脚本来加载预设好的参数集并与硬件交互操作起来。 ```xml <!-- launch file example --> <launch> <!-- Load the parameters from a yaml config file --> <param name="ekf_filter_node" command="$(find robot_localization)/scripts/configure_ekf.launch"/> <!-- Start up the actual filter node itself --> <node pkg="robot_localization" type="ekf_localization_node" name="ekf_se".../> </launch> ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值