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,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¨,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,或者仅确保协方差值足够大以消除振荡。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章