robot_localization(3):配置

将传感器数据合并到robot_localization的任何状态估计节点的位置估计中时,重要的是要提取尽可能多的信息。本教程详细介绍了传感器集成的最佳实践。

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

1 传感器配置

即使所讨论的消息类型在配置向量中不包含某些变量(例如,虽然<<MsgLink(geometry_msgs/TwistWithCovarianceStamped)>>缺少任何位姿数据,但是配置向量仍然具有位姿变量的值),所有传感器的配置向量格式也相同。未使用的变量将被忽略。

注意:配置矢量在输入消息的frame_id中给出。例如,考虑一个速度传感器,该传感器会生成一个geometry_msgs/TwistWithCovarianceStamped消息,其frame_idvelocity_sensor_frame。在此示例中,我们假设存在一个从velocity_sensor_frame到机器人的base_link_frame(例如base_link)的转换,并且该转换会将Velocity_sensor_frame中的X速度转换为base_link_frame中的Z速度。为了将来自传感器的X速度数据包括到滤波器中,配置矢量应将X速度值设置为true,而不是Z˙速度值:

<rosparam param="twist0_config">[false, false, false,
                                 false, false, false,
                                 true,  false, false,
                                 false, false, false,
                                 false, false, false]</rosparam>

注意:布尔值的顺序是:
( X , Y , Z , r o l l , p i t c h , y a w , X ˙ , Y ˙ , Z ˙ , r o l l ˙ , p i t c h ˙ , y a w ˙ , X ¨ , Y ¨ , Z ¨ ) 。 (X,Y,Z,roll,pitch,yaw,X˙,Y˙,Z˙,roll˙,pitch˙,yaw˙,X¨,Y¨,Z¨)。 (X,Y,Z,roll,pitch,yaw,X˙,Y˙,Z˙,roll˙,pitch˙,yaw˙,X¨,Y¨,Z¨)

2 以2D运行?

配置传感器时,首先要做出的决定是机器人是否在平面环境中运行,并且您可以忽略IMU可能报告的接地平面变化的细微影响。如果是这样,请将two_d_mode参数设置为true。这样可以有效地将每次测量中的3D位姿变量归零,并强制将其融合到状态估计中。

3 融合不可测变量

让我们从一个例子开始。假设您有一个在平面环境中工作的轮式非完整机器人。您的机器人有一些车轮编码器,用于估算瞬时X速度以及绝对姿态信息。此信息在nav_msgs/Odometry消息中报告。此外,您的机器人还有一个IMU,可以测量转速,车辆姿态和线性加速度。其数据在sensor_msgs/Imu消息中报告。当我们在平面环境中操作时,我们将two_d_mode参数设置为true。这将自动将所有3D变量清零,例如Z,roll,pitch,它们各自的速度和Z加速度。我们从以下配置开始:

<rosparam param="odom0_config">[true, true, false,
                                false, false, true,
                                true, false, false,
                                false, false, true,
                                false, false, false]</rosparam>

<rosparam param="imu0_config">[false, false, false,
                               false, false, true,
                               false, false, false,
                               false, false, true,
                               true, false, false]</rosparam>

作为第一步,这是有道理的,因为平面机器人只需要关注:
X , Y , X ˙ , Y ˙ , X ¨ , Y ¨ , y a w , y a w ˙ 。 X , Y, X˙, Y˙, X¨, Y¨, yaw, yaw˙。 X,Y,X˙,Y˙,X¨,Y¨,yaw,yaw˙但是,这里有一些注意事项。

1.对于odom0,我们包括X和Y(在世界坐标系中报告),yaw,X˙(在本体坐标系中报告)和yaw˙。但是,除非您的机器人在内部使用IMU,否则很可能仅使用车轮编码器数据来生成其测量值。因此,它的速度,航向和位置数据都是从同一源生成的。在这种情况下,我们不想使用所有值,因为您要将重复的信息输入到过滤器中。相反,最好只使用速度:

<rosparam param="odom0_config">[false, false, false,
                                false, false, false,
                                true, false, false,
                                false, false, true,
                                false, false, false]</rosparam>

<rosparam param="imu0_config">[false, false, false,
                               false, false, true,
                               false, false, false,
                               false, false, true,
                               true, false, false]</rosparam>

2.接下来,我们注意到我们没有融合Y˙。乍一看,这是正确的选择,因为我们的机器人无法瞬时向侧面移动。但是,如果nav_msgs/Odometry消息报告Y˙的值为0(并且Y˙的协方差未夸大为大值),则最好将该值提供给滤波器。由于在这种情况下,测量值0表示机器人无法朝该方向移动,因此它可以作为完美的有效测量值:

<rosparam param="odom0_config">[false, false, false,
                                false, false, false,
                                true, true, false,
                                false, false, true,
                                false, false, false]</rosparam>

<rosparam param="imu0_config">[false, false, false,
                               false, false, true,
                               false, false, false,
                               false, false, true,
                               true, false, false]</rosparam>

您可能想知道为什么我们出于同样的原因不融合Z˙速度。答案是我们将two_d_mode设置为false时所做的。如果没有的话,实际上我们可以将Z˙速度的0测量值融合到滤波器中。

3.最后,我们来到IMU。您可能会注意到,我们已将Y¨设置为false。这是由于以下事实:许多系统,包括我们在此讨论的假设系统,都不会经历瞬时Y加速。但是,IMU可能会报告Y加速度的非零,嘈杂值,这可能会导致您的估计快速漂移。

4 微分和相对参数

robot_localization中的状态估计节点允许用户融合任意数量的传感器。这允许用户使用多个源来测量某些状态向量变量,尤其是位姿变量。例如,您的机器人可能会从多个IMU获得绝对方向信息,或者它可能具有多个提供其绝对位置估计值的数据源。在这种情况下,用户有两个选择:

1.照原样融合所有绝对位置/方向数据,例如:

<rosparam param="imu0_config">[false, false, false,
                               true,  true,  true,
                               false, false, false,
                               false, false, false,
                               false, false, false]</rosparam>

<rosparam param="imu1_config">[false, false, false,
                               true,  true,  true,
                               false, false, false,
                               false, false, false,
                               false, false, false]</rosparam>

在这种情况下,用户应该非常小心,并确保正确设置每个测量方向变量的协方差。如果每个IMU公布的偏航方差例如为:math:0.1,但IMU的偏航测量值之间的差异为:math:>0.1,则滤波器的输出将在两者之间来回振荡。每个传感器提供的值。用户应确保每次测量周围的噪声分布重叠。

2.或者,用户可以使用_differential参数。通过将给定传感器的此值设置为true,可以通过计算两个连续时间步长之间的测量值变化,将所有位姿(位置和方向)数据转换为速度。然后将数据融合为速度。再次提醒您,使用者应注意:合并绝对测量值(尤其是IMU)时,如果测量值对于给定变量具有静态或不增加的方差,则估计协方差矩阵中的方差将是有界的。如果将该信息转换为速度,则在每个时间步长处,估计将获得少量误差,并且所讨论变量的方差将无限制地增长。对于位置(X,Y,Z)信息,这不是问题,但是对于方向数据,则是一个问题。例如,一段时间后,机器人绕其环境移动并在X方向上累积1.5米的误差是可以接受的。如果同一个机器人四处走动并在偏航中累积1.5弧度的误差,那么当机器人继续向前行驶时,其位置误差将爆炸。

_differential参数的一般经验法则是,如果给定机器人只有一个方向数据源,则应将_differential参数设置为false。如果有N个源,用户可以将N-1个参数的_differential参数设置为true,或者仅确保协方差值足够大以消除振荡。

### 配置和使用 `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> ```
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值