robot
转自: 仅供学习
将传感器数据合并到robot_localization
的任何状态估计节点的位置估计中时,重要的是要提取尽可能多的信息。本教程详细介绍了传感器集成的最佳实践。
有关更多信息,建议用户观看ROSCon 2015的演示文稿。
1 传感器配置
即使所讨论的消息类型在配置向量中不包含某些变量(例如,虽然<<MsgLink(geometry_msgs/TwistWithCovarianceStamped)>>
缺少任何位姿数据,但是配置向量仍然具有位姿变量的值),所有传感器的配置向量格式也相同。未使用的变量将被忽略。
注意:配置矢量在输入消息的frame_id
中给出。例如,考虑一个速度传感器,该传感器会生成一个geometry_msgs/TwistWithCovarianceStamped消息,其frame_id
为velocity_sensor_frame
。在此示例中,我们假设存在一个从velocity_sensor_frame
到机器人的base_link_frame
(例如base_link
)的转换,并且该转换会将Velocity_sensor_frame
中的X速度转换为base_link_frame
中的Z速度。为了将来自传感器的X速度数据包括到滤波器中,配置矢量应将X速度值设置为true,而不是Z˙速度值:
<--!
#x , y , z,
#roll , pitch , yaw,
#vx , vy , vz,
#vroll , vpitch, vyaw,
#ax , ay , az
-->
<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加速度。我们从以下配置开始:
<--!
#x , y , z,
#roll , pitch , yaw,
#vx , vy , vz,
#vroll , vpitch, vyaw,
#ax , ay , az
-->
<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,否则很可能仅使用车轮编码器数据来生成其测量值。因此,它的速度,航向和位置数据都是从同一源生成的。在这种情况下,我们不想使用所有值,因为您要将重复的信息输入到过滤器中。相反,最好只使用速度:
<--!
#x , y , z,
#roll , pitch , yaw,
#vx , vy , vz,
#vroll , vpitch, vyaw,
#ax , ay , az
-->
<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表示机器人无法朝该方向移动,因此它可以作为完美的有效测量值:
<--!
#x , y , z,
#roll , pitch , yaw,
#vx , vy , vz,
#vroll , vpitch, vyaw,
#ax , ay , az
-->
<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.照原样融合所有绝对位置/方向数据,例如:
<--!
#x , y , z,
#roll , pitch , yaw,
#vx , vy , vz,
#vroll , vpitch, vyaw,
#ax , ay , az
-->
<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
转自: 仅供学习
将传感器数据合并到robot_localization
的任何状态估计节点的位置估计中时,重要的是要提取尽可能多的信息。本教程详细介绍了传感器集成的最佳实践。
有关更多信息,建议用户观看ROSCon 2015的演示文稿。
1 传感器配置
即使所讨论的消息类型在配置向量中不包含某些变量(例如,虽然<<MsgLink(geometry_msgs/TwistWithCovarianceStamped)>>
缺少任何位姿数据,但是配置向量仍然具有位姿变量的值),所有传感器的配置向量格式也相同。未使用的变量将被忽略。
注意:配置矢量在输入消息的frame_id
中给出。例如,考虑一个速度传感器,该传感器会生成一个geometry_msgs/TwistWithCovarianceStamped消息,其frame_id
为velocity_sensor_frame
。在此示例中,我们假设存在一个从velocity_sensor_frame
到机器人的base_link_frame
(例如base_link
)的转换,并且该转换会将Velocity_sensor_frame
中的X速度转换为base_link_frame
中的Z速度。为了将来自传感器的X速度数据包括到滤波器中,配置矢量应将X速度值设置为true,而不是Z˙速度值:
<--!
#x , y , z,
#roll , pitch , yaw,
#vx , vy , vz,
#vroll , vpitch, vyaw,
#ax , ay , az
-->
<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加速度。我们从以下配置开始:
<--!
#x , y , z,
#roll , pitch , yaw,
#vx , vy , vz,
#vroll , vpitch, vyaw,
#ax , ay , az
-->
<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,否则很可能仅使用车轮编码器数据来生成其测量值。因此,它的速度,航向和位置数据都是从同一源生成的。在这种情况下,我们不想使用所有值,因为您要将重复的信息输入到过滤器中。相反,最好只使用速度:
<--!
#x , y , z,
#roll , pitch , yaw,
#vx , vy , vz,
#vroll , vpitch, vyaw,
#ax , ay , az
-->
<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表示机器人无法朝该方向移动,因此它可以作为完美的有效测量值:
<--!
#x , y , z,
#roll , pitch , yaw,
#vx , vy , vz,
#vroll , vpitch, vyaw,
#ax , ay , az
-->
<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.照原样融合所有绝对位置/方向数据,例如:
<--!
#x , y , z,
#roll , pitch , yaw,
#vx , vy , vz,
#vroll , vpitch, vyaw,
#ax , ay , az
-->
<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,或者仅确保协方差值足够大以消除振荡。
转自: 仅供学习