请问有人了解cartographer的定位是如何定位的吗?

打扰各位了
我现在知道的是:
定位使用PoseExtrapolator这个函数,输入参数是IMU得到的速度和角速度数据+Odometry得到的速度和角速度数据+scan matching得到的优化过的上一次的Pose数据
在角速度这里优先使用IMU的数据
在速度这里优先使用Odometry的数据
如果这两个传感器都没有数据的话就用上一时刻的Pose数据
问题1:具体PoseExtrapolator是如何融合这三个数据的呢?
问题2:机器人的位姿在算法里都是通过速度和角速度描述或者说观察的吗?
问题3:加速度传感器在机器人缓慢移动的时候阔以看作测的是重力加速度在三轴上的分量,陀螺仪则是测量绕三轴旋转的角速度,这两组数据最后要进行融合,但是一个是加速度一个是角速度,要如何进行融合呢?看资料的话是都转换成力在三轴上的分量来进行融合的。。

问题一:
我的个人理解:
这部分作用是输出当前时刻的位姿估计PoseEstimate,输入为上一时刻的位姿+imu+odom,其中imu和odom的融合输出基于上个时刻位姿的当前时刻的位姿估计。老版本的cartographer在做imu和odom融合的时候就是使用的ekf卡尔曼滤波。新版本的不清楚。

具体怎么做IMu和odom融合,参考这篇文章:(相关的文章有很多)https://blog.csdn.net/xiekaikaibing/article/details/80402113#comments

问题二:

通常位姿POSE的描述,指的是当前坐标position+方向orientation

geometry_msgs/Point position
  float64 x
  float64 y
  float64 z
geometry_msgs/Quaternion orientation
  float64 x
  float64 y
  float64 z
  float64 w

节点最终输出的位子估计信息,如果在ros下,具体格式是这样的:

std_msgs/Header header
  uint32 seq
  time stamp
  string frame_id
string child_frame_id
geometry_msgs/PoseWithCovariance pose
  geometry_msgs/Pose pose
    geometry_msgs/Point position
      float64 x
      float64 y
      float64 z
    geometry_msgs/Quaternion orientation
      float64 x
      float64 y
      float64 z
      float64 w
  float64[36] covariance
geometry_msgs/TwistWithCovariance twist
  geometry_msgs/Twist twist
    geometry_msgs/Vector3 linear
      float64 x
      float64 y
      float64 z
    geometry_msgs/Vector3 angular
      float64 x
      float64 y
      float64 z
  float64[36] covariance

可以看到包含了Post和twist两部分的估计信息

问题三:

惯性导航单元(IMU)组合(交融)来自两个或以上的传感器(例如陀螺仪、加速度计、磁场计和/或GPS)信息用于飞机相对地球的航向矢量和 速度矢量。

这部分我觉得你考虑的有些太多了。本来IMU这个产品就是已经做好了加速度传感器和陀螺仪的融合。我们直接拿来用imu数据就行了呀。

在ros中定义的IMU的数据类型包括: 三个方向的线加速度,四元数表示的位姿朝向,以及三个方向的角速度。
具体格式如下:

std_msgs/Header header
  uint32 seq
  time stamp
  string frame_id
geometry_msgs/Quaternion orientation
  float64 x
  float64 y
  float64 z
  float64 w
float64[9] orientation_covariance
geometry_msgs/Vector3 angular_velocity
  float64 x
  float64 y
  float64 z
float64[9] angular_velocity_covariance
geometry_msgs/Vector3 linear_acceleration
  float64 x
  float64 y
  float64 z
float64[9] linear_acceleration_covariance

参考文献
http://www.ztmicro.com/news-jszs/344.html

1赞

谢谢前辈回复!!
关于位姿估计的那部分代码我看了,虽然还不是非常明白,但没有看到卡尔曼的身影,大概就是拿IMU和Odometry的数据来估计位姿变化量,再和之前的位姿相加似乎。
请问一下前辈:
1.IMU的数据类型是ros本身就定义好了,然后cartographer拿来用的还是cartographer自己定义的呢?
2.今天被教授问到:IMU的数据具体是什么?以及pose具体是什么,即所谓的position和orientation在cartographer里到底是什么(或者说估计出来的到底是什么,我被问懵了emm)?按照前辈的回答我认为position都是用三个变量表示的向量,orientation则是用四个变量表示的四元数向量,这样说是否正确呢?
3.教授说做cartographer只需要imu不需要odometry,这是为什么呢?我看代码里是有用到odometry的,而且加速度计测的也不如里程计精确啊讲道理。。
麻烦前辈了!!
(弱弱问一句可以加前辈的联系方式吗)

抱歉才看到。

  1. 所有的传感器的原始数据格式,ros都有定义好,但是对于不同算法,可能有不同的数据裁剪配合算法使用。
  2. 对的,你说的没错。
  3. cartographer两个传感器消息都用了吧。我这边测试过不用imu只用odometry, 效果差强人意,小场景不如gmapping。单纯用imu可能更加不准确吧??

我不是前辈… 也是学生,也在学习哇。 我的wx 17610071006

本周末 ros社区好像有线下分享会,在北京中科院软件所

@wuwei

是滴,欢迎参加~明天会在Q站贴通知