昨天困扰个问题到今天,希望要让turtle2的坐标永远相对于turtle1的坐标都是向某个地方平移的。本来是根据tf_tutorial来做的,建议读者先照着上面的tutorial做一遍
方案1:a.新建的carrot1(由turtle1平移而来)
b.新建一个broadcaster发布carrot1相对于turtle1的位置
c.listener让turtle2向carrot1移动
但由于“/turtle/cmd_vel”消息类型是geometry_msgs::Twist,只能从transform中获取线速度和角速度进行平移。
这里要注意一点,我最开始犯的错误就是只建了三个frame(请忽略左边的point!)
我建了三个坐标系world,turtle1,turtle2,然后用两个broadcaster分别发布了world中turtle1的位置和turtle1中turtle2的位置,在listener中直接listener.lookupTransform("/world","/turtle2",ros::Time(0), transform);
这种直接按照tutorial修改而来的方式,运行结果并不能达到要求,因为前面提到了,控制turtle2是用线速度和角速度的,很明显上面获取到的tranform转换而来线速度和角速度的话,会让turtle2一直在原地旋转
方案2: 不使用消息turtle2/cmd_vel(类型为geometry_msgs::Twist,具体包含就是线速度和角速度),查阅turtlesim文档,发现有service为teleport_absolute,使用这个服务而不是使用线速度和角速度对turtle2进行控制,很遗憾的是关于teleport_absolute的例子很少,上面那个wiki界面本来是有视频教程的由于是youtube所以看不了(当然有能力翻墙的小伙伴还是看看为好,我只改了host只能用用google)
a.同样的,两个广播发布world中turtle1的位置和turtle1中turtle2的位置
b.listener中同样lookuptransform找出world中turtle2的坐标转换transform,从其中取出x,y然后用teleport_absolute直接指定turtle2的位置
代码如下
turtle_tf_broadcaster.cpp 和tutorial里面一模一样,作用就是发布turtle1在world中的位置
#include <ros/ros.h><