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
监控tf:tf_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