文章目录
由于网上相关资料较少,在学习ROS时对TF变换关系还是一知半解,故利用实体机器人验证 【ROS】map、odom、base_link坐标系与坐标系变换关系里个人总结的一些结论,供参考。
1 启动
# 开ros
roscore
# 开键盘控制
roslaunch xtark_ctl xtark_keyboard.launch
# 开雷达、底盘、里程计等
roslaunch xtark_driver xtark_bringup.launch
# 开定位导航包
roslaunch xtark_nav lj_nav.launch map_file:=/home/xtark/ros_ws/src/xtark_nav/maps/ljmap.yaml
2 TF树
3 订阅map->footprint关系
3.1 运行功能包tf_subscriber
#!/usr/bin/env python
import rospy
import tf2_ros
if __name__ == '__main__':
rospy.init_node('tf2_listener')
tfBuffer = tf2_ros.Buffer()
listener = tf2_ros.TransformListener(tfBuffer)
rate = rospy.Rate(10) # 设置循环频率为10Hz
while not rospy.is_shutdown():
try:
transform = tfBuffer.lookup_transform("map", "base_footprint", rospy.Time())
print(transform)
except (tf2_ros.LookupException, tf2_ros.ConnectivityException, tf2_ros.ExtrapolationException):
rospy.logwarn("Failed to lookup transform")
rate.sleep()
可以输出map->footprint变换关系,但是连成一片,可读性差且不灵活。
3.2 命令行rosrun tf tf_echo …
可以直接用命令
rosrun tf tf_echo map <其他坐标系>
输出两个坐标系之间的变换关系。
4 一些实验结果
4.1 刚刚启动雷达、底盘、里程计等,启动定位导航包
odom->base_footprint:保持
[
0
,
0
,
0
]
[0,0,0]
[0,0,0]和
[
0
,
0
,
0
,
1
]
[0,0,0,1]
[0,0,0,1]不变
map->odom:保持
[
0
,
0
,
0
]
[0,0,0]
[0,0,0]和
[
0
,
0
,
0
,
1
]
[0,0,0,1]
[0,0,0,1]不变
4.2 沿x方向前进一小段距离后
odom->base_footprint:x
方向增加了0.468,y
方向偏离了0.008,随后保持
[
0.468
,
0.008
,
0
]
[0.468,0.008,0]
[0.468,0.008,0]和
[
0
,
0
,
0.004
,
1
]
[0,0,0.004,1]
[0,0,0.004,1]不变,说明机器人并不是严格沿着x
轴方向移动的。
map->odom:仍然保持
[
0
,
0
,
0
]
[0,0,0]
[0,0,0]和
[
0
,
0
,
0
,
1
]
[0,0,0,1]
[0,0,0,1]不变,说明并没有发生碰撞打滑等情况,map和odom坐标系仍然重合。
4.3 机器人保持静止,重新启动定位导航包
odom->base_footprint:位移关系保持
[
0.468
,
0.008
,
0
]
[0.468,0.008,0]
[0.468,0.008,0]不变,而旋转关系由
[
0
,
0
,
0.004
,
1
]
[0,0,0.004,1]
[0,0,0.004,1]变为了
[
0
,
0
,
0.01
,
1
]
[0,0,0.01,1]
[0,0,0.01,1],有微小差别。
map->odom:位移关系由
[
0
,
0
,
0
]
[0,0,0]
[0,0,0]变为了
[
0.002
,
0.002
,
0
]
[0.002,0.002,0]
[0.002,0.002,0],旋转关系保持
[
0
,
0
,
0
,
1
]
[0,0,0,1]
[0,0,0,1]不变。x
和·y
方向上各偏移了2毫米。
4.4 再沿x方向前进一段距离,然后右转九十度
odom->base_footprint:位移关系x
方向增加了1米左右,y
方向在原来基础上又偏离了0.032,而旋转关系由
[
0
,
0
,
0.01
,
1
]
[0,0,0.01,1]
[0,0,0.01,1]变为了
[
0
,
0
,
−
0.753
,
0.658
]
[0,0,-0.753,0.658]
[0,0,−0.753,0.658]。
map->odom:位移关系由
[
0.002
,
0.002
,
0
]
[0.002,0.002,0]
[0.002,0.002,0]变为了
[
−
0.444
,
0.177
,
0
]
[-0.444,0.177,0]
[−0.444,0.177,0],而旋转关系由
[
0
,
0
,
−
0.753
,
0.658
]
[0,0,-0.753,0.658]
[0,0,−0.753,0.658]变为了
[
0
,
0
,
−
0.081
,
0.997
]
[0,0,-0.081,0.997]
[0,0,−0.081,0.997],可以看到map和odom坐标系不再重合。
map->base_footprint:位移关系为
[
0.951
,
−
0.011
,
0
]
[0.951,-0.011,0]
[0.951,−0.011,0],旋转关系为
[
0
,
0
,
−
0.798
,
0.602
]
[0,0,-0.798,0.602]
[0,0,−0.798,0.602]。
4.5 再次重启定位导航包
map->base_footprint:位移关系由
[
0.951
,
−
0.011
,
0
]
[0.951,-0.011,0]
[0.951,−0.011,0]变为了
[
−
0.965
,
0.003
,
0
]
[-0.965,0.003,0]
[−0.965,0.003,0],而旋转关系由
[
0
,
0
,
−
0.798
,
0.602
]
[0,0,-0.798,0.602]
[0,0,−0.798,0.602]变为了
[
0
,
0
,
−
0.796
,
0.606
]
[0,0,-0.796,0.606]
[0,0,−0.796,0.606]。
map->odom:位移关系由
[
−
0.444
,
0.177
,
0
]
[-0.444,0.177,0]
[−0.444,0.177,0]变为了
[
−
0.430
,
0.193
,
0
]
[-0.430,0.193,0]
[−0.430,0.193,0],而旋转关系由
[
0
,
0
,
−
0.081
,
0.997
]
[0,0,-0.081,0.997]
[0,0,−0.081,0.997]变为了
[
0
,
0
,
−
0.082
,
0.997
]
[0,0,-0.082,0.997]
[0,0,−0.082,0.997]。
在odom和base_footprint不变的情况下,差不多重启后map坐标系在x和y方向上各偏移了14厘米。
5 总结
根据《ROS机器人开发实践》上相关内容,ACML功能包中的话题和服务有:
所以启动定位导航包后,有话题amcl_pose
发布,即为机器人在地图中的位姿估计,带有协方差信息,也即得到了map->base_footprint变换信息。再加上已知的odom->footprint变换信息,计算即可得到map->odom变换信息并发布。
在这里插入图片描述
同时经过观察,我发现每次重新启动rviz工具可视化地图和激光点云,它们都是不匹配不重合的,因此我推测rviz里的地图只是给用户一个参考,方便确定机器人的运动目标,同时观察机器人在“地图”这张图片上的运动行为,因此在rviz中并不需要匹配得太过精确。
随机而来的问题,话题amcl_pose
应该是随机器人移动而变化的,这个精度如何呢?好吧,我回家了,暂时没测。