6. ros中坐标系管理系统
【 原理 】 : 通过tf包的发布功能,可以发布一组坐标之间的转换关系(平移+旋转), 构建一个树形结构,然后通过lookupTransform()接口可以获取任意两个坐标之间的转换关系,不用自己再计算了,强大!!
即通过tf广播器广播坐标映射关系,通过tf监听器得到任意两个坐标系之间的关系
6.1. 代码解释
- 创建坐标映射
static tf::TransformBroadcaster tfb;
tfb.sendTransform(tf::StampedTransform(tr, ros::Time::now(), "world", strTurtlename));
- 获取坐标映射
tf::TransformListener listener;
tf::StampedTransform tr;
listener.waitForTransform("/turtle2", "/turtle1", ros::Time(0), ros::Duration(3.0)); //从当前时间开始,等待一段时间3s,没有数据应该会异常(猜的),有数据返回
listener.lookupTransform("/turtle2", "/turtle1", ros::Time(0), tr); //获取转换关系
6.2. 相关指令
- rosrun rqt_tf_tree rqt_tf_tree :显示tf关系图
- rosrun tf view_frames : tf功能包中的一个工具,监听一段时间,5s内所有坐标系之间的关系保存成pdf文件。其中展示tf树,表示有多少个坐标系及他们之间的关系。
- rosrun tf tf_echo 坐标系1 坐标系2 : 实时打印两个坐标系之间的关系:
Translation: [-0.000, -0.000, 0.000]
表示坐标系之间的平移向量
Rotation: in Quaternion [0.000, 0.000, 0.599, 0.801]
表示坐标系之间的旋转向量,本行是四元数方式[x,y,z,w]
in RPY (radian) [0.000, -0.000, 1.284]
弧度表示,表示每个轴旋转的角度
in RPY (degree) [0.000, -0.000, 73.549]
度表示,表示每个轴旋转的角度 - 可视化工具rviz:rosrun rviz rviz -d
rospack find turtle_tf
/rviz/turtle_rviz.rviz - 用
rosmsg info tf2_msgs/TFMessage
查看消息内容:
geometry_msgs/TransformStamped[] transforms
std_msgs/Header header
uint32 seq
time stamp
string frame_id
string child_frame_id #子坐标系
geometry_msgs/Transform transform
geometry_msgs/Vector3 translation
float64 x
float64 y
float64 z
geometry_msgs/Quaternion rotation
float64 x
float64 y
float64 z
float64 w
6.3. ROS基本坐标系理解:map, odom, base_link, base_footprint, base_laser等等
参考链接https://blog.csdn.net/weixin_46181372/article/details/109694300
- map
地图坐标系,顾名思义,一般设该坐标系为固定坐标系,一般与机器人所在的世界坐标是重合的。 - base_link
机器人本体坐标系,与机器人中心重合。 - base_footprint
为base_link原点在地面的投影,和base_link只是z值不同。 - odom
里程计坐标系,这里主要区分odom topic,这是两个概念,一个是坐标系,一个是根据编码里程计计算得到的里程计信息。但是两者也有关系,odom topic转化得到的位姿矩阵是odom->base_link的tf关系。
两个问题:
①位姿矩阵得到的不应该是map->base_link的tf关系吗?map坐标系与odom坐标系又有什么关系?
其实机器人刚开始运动时,odom坐标系与map坐标系是重合的,即odom->base_link与map->base_link的tf是一致的。
但是随着时间的推移,出现了偏差,出现的偏差也就是里程计的累计误差,如果里程计精确度很高,没有计算误差,那么map坐标系与odom坐标系会一直是重合的。
然而实际情况中,里程计是有偏差的,所以我们计算里程计得到的位姿矩阵是odom->base_link,与map->base_link还是有偏差的。
②那么map->odom的tf是怎么得到的呢?
除去里程计还有一些合作校正的传感器例如imu,这些传感器可以估计出机器人在地图中的位置也就是map->base_link的tf,我们估计机器人在地图中的位置和解算里程计得到的位置的偏差也就是map->odom的tf。
- base_laser
激光雷达坐标系,与激光雷达的安装点有关,它与base_link的tf是固定的。