ROS 中的三种坐标系(map、odom与base_link)

在网上看了一些大佬的解释,还是感觉有点迷糊,多看了几次之后感觉好像get到了,如果说错了还请指正。

map和base_link都很好理解,一个是绝对坐标系,另一个是以机器人自身为原点的坐标系,很容易懂。

唯一麻烦的就是odom,里程计坐标系。

下面就以我的拙见尝试小白化地解释一下这个玩意儿。

首先,我们制定机器人路径时,使用的必然是绝对坐标系——

比如我现在让机器人去点(10,10)。

要完成这件事,机器人需要先知道自己在哪。它没有GPS,所以只能倒推——通过里程计。这也是为什么“没有偏移的话odom应该与map重合”,因为odom本来就是用来倒推map的。
(经评论提醒,特强调,这个“偏移”指的是偏差,误差,而不是位移)

里程计告诉它,自从原点启动起,它在X向上移动2,Y向上移动了5。于是它就认为自己在(2,5)。反馈给base_link,则base_link里原点在(-2,-5),目标在(8,5)。

然而实际上,因为偏移,它的里程计是错的,它其实在(3,4)(map)。

此时,在map,也就是实际上,它在(3,4),但在odom中它在(2,5)。
它理应运动(7,6)到达目标点,但它会运动(8,5),因为odom反馈给base_link后,在base_link中,目标在(8,5)。

而这时,校正传感器又告诉它了,“我觉得你的里程计刚才X漏算了0.999,Y多算了1.001”。

于是它把自己所在位置修正为了(2.999,3.999)(odom),把目标在base_link中修正到了(7.001,6.001)(base_link)接下来该移动(7.001,6.001)。

以上。

odom←base_link+里程计
+
校正

接近map的坐标系

参考:https://blog.csdn.net/flyinsilence/article/details/51854123

要将odom里程计坐标系绕Z轴旋转180度,可以使用ROS的tf包来实现。具体的步骤如下: 1. 在RViz打开机器人模型,选odom坐标系,并在Fixed Frame选择odom坐标系。 2. 在终端输入以下命令,启动tf转换节点: ``` rosrun tf2_ros static_transform_publisher 0 0 0 0 0 0 odom base_link 1000 ``` 这条命令的作用是发布一个静态的坐标系变换,将odom坐标系base_link坐标系进行关联,并且将两个坐标系的初始变换矩阵都设置为单位矩阵。 3. 在终端输入以下命令,启动tf查看节点: ``` rosrun tf view_frames ``` 这条命令的作用是查看当前ROS系统的所有坐标系,并生成一个PDF文件,保存在/home/username/.ros/frame.pdf。 4. 在终端输入以下命令,打开PDF文件: ``` evince /home/username/.ros/frame.pdf ``` 这条命令的作用是打开PDF文件,查看当前ROS系统的所有坐标系之间的变换关系。 5. 在PDF文件找到odom坐标系base_link坐标系之间的变换关系,并记录下两个坐标系的旋转角度(绕Z轴的旋转角度为180度)。 6. 修改第二步的命令,将旋转角度改为180度,并重新运行该命令。 ``` rosrun tf2_ros static_transform_publisher 0 0 0 0 0 3.14159 odom base_link 1000 ``` 这条命令的作用是重新发布坐标系变换,将odom坐标系绕Z轴旋转180度。 7. 在RViz查看机器人模型,检查odom坐标系base_link坐标系之间的变换关系是否正确。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值