ros之tf经验总结

1.概念

搞ros都离不开tf,当建立一个机器人模型时,第一步就是要确定机器人的tf结构。

以kobuki导航运行为例,首先是

map:地图坐标,固定坐标系

odom : 机器人初始位置坐标,固定坐标系

base_link:机器人中心位置坐标

一般想法认为有map和base_link就可以了,而从网上的各种资料看来,多出来的odom是因为:在机器人导航运行过程中会出现视觉定位偏差,里程计误差积累等等问题,当算法纠正这些偏差时,base_link会出现机器人中心的位置在map坐标系上不连续,发生跳跃,而有了odom,不管算法如何纠正,base_link相对于odom是连续的,不会发生太大跳跃,从而对导航/定位过程中的雷达扫描收敛,设置区间速度等等方面不会发生突变。

参考链接:

http://www.ros.org/reps/rep-0105.html

https://answers.ros.org/question/44584/frames-definition-odom-and-map/

2.tf代码运用

熟悉以下几个方法的运用就可以了。

广播:sendTransform

#include <tf/transform_broadcaster.h>
tf::TransformBroadcaster broadcaster;
broadcaster.sendTransform(
tf::StampedTransform(tf::Transform(tf::Quaternion(0, 0, 0, 1), tf::Vector3(0.1, 0.0, 0.2)),ros::Time::now(),"base_link", "base_laser"));

监听:listener.transformPoint

#include <tf/transform_listener.h>
tf::TransformListener listener(ros::Duration(10));
listener.transformPoint("base_link", laser_point, base_point);

查找:

tf::TransformListener listener;
listener.lookupTransform("/turtle2", "/turtle1", ros::Time(0), transform);      //获取父节点的/turtle2, 子节点/turtle1的tf

参考链接:http://wiki.ros.org/navigation/Tutorials/RobotSetup/TF

还有tf工具的代码,也是很好的例子

3.tf工具的使用

查看tf结构:运行rqt,查看里面的tf viewer ,也可以rosrun rqt_tf_tree rqt_tf_tree

查看任意两个坐标系之间的transform

rosrun tf tf_echo [reference_frame] [target_frame]
rosrun tf tf_echo turtle1 turtle2

T2 = T(world) * T1;

当T1为map时,T2为base_link,这时transform就是机器人在map上的坐标。即可以看成以T1为坐标系,T2坐标系的坐标原点在T1坐标系上的位置。

view_frames:  rosrun tf view_frames生成一个pdf查看当前tf,查看方式:evince frames.pdf

固定发布transform:static_transform_publisher

监控tftf_monitor <source_frame> <target_target>

参考链接:http://wiki.ros.org/tf#view_frames

4.一些经验

a.roslibjs如何获取tf信息?web端就可以用rosbridge方式调用roslibjs库来实现

参考链接:http://wiki.ros.org/roslibjs 和 http://wiki.ros.org/roslibjs/Tutorials/TfClient

不要忘记启动节点rosrun tf2_web_republisher tf2_web_republisher

b.rosjava如何获取tf信息

目前还未找到

参考链接:http://wiki.ros.org/rosjava


版权声明:本文为sunyoop原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>