前言:将海龟的坐标系变换广播到TF。

URDF文件的描述是在相对坐标上进行的,运动起来就需要考虑机器人各个连杆的相对位置关系。TF的诞生就是为了自动管理这些相对关系下的坐标变换的,而我们需要做的就是给出连杆之间的相对位置关系,剩下的在运动中的坐标变换,速度关系,位置等信息就都由TF功能包自动处理完成。更直观的描述请参考:http://www.guyuehome.com/355

坐标标签有:位置坐标x,y,z和旋转角roll,pitch,yaw。例如如果只在平面移动,则只需要x,y,yaw即可。

一、新建功能包

在工作空间中新建功能包learning_tf tf roscpp rospy turtlesim

二、新建cpp文件

新建turtle_tf_broadcaster.cpp文件,文件内容如下:

#include <ros/ros.h>
#include <tf/transform_broadcaster.h>
#include <turtlesim/Pose.h>

std::string turtle_name;

void poseCallback(const turtlesim::PoseConstPtr& msg){
  static tf::TransformBroadcaster br;
  tf::Transform transform;//定义存放转换信息(平动,转动)的变量
  transform.setOrigin( tf::Vector3(msg->x, msg->y, 0.0) );//设置坐标原点
//定义旋转
  tf::Quaternion q;
  q.setRPY(, , msg->theta);
  transform.setRotation(q);

  br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", turtle_name));//新建坐标系turtle_name,父坐标系为world,坐标系相对位置为transform
}

int main(int argc, char** argv){
  ros::init(argc, argv, "my_tf_broadcaster");
  ){ROS_ERROR(;};
  turtle_name = argv[];

  ros::NodeHandle node;
  ros::Subscriber sub = node.subscribe(turtle_name+, &poseCallback);

  ros::spin();
  ;
};

----------------------------------------

代码解释:

大概思路是:接收turtle1的位置话题(/turtle1/pose),此时调用回调函数,将位置信息发布到tf

#include <tf/transform_broadcaster.h>,TF功能包提供了一个广播工具TransformBroadcaster,这个类需要引用<tf/transform_broadcaster.h>头文件

  tf::Transform transform;
  transform.setOrigin( tf::Vector3(msg->x, msg->y, 0.0) );
  tf::Quaternion q;
  q.setRPY(, , msg->theta);

这里创建了一个变换实例,并将2D位姿信息转化为3D位姿信息。

transform.setRotation(q);

这里设置了旋转

br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", turtle_name));

使用TransformBroadcaster发送TF变换需要四个参数:

  1. 变换本身
  2. 时间戳
  3. 提供连杆的父框架,这里是world
  4. 提供连杆的子框架,即自身,这里是乌龟本身。

三、新建launch文件

新建start_demo.launch文件,文件内容如下:

<launch>
    <!-- Turtlesim Node-->
    <node pkg="turtlesim" type="turtlesim_node" name="sim"/>

    <node pkg="turtlesim" type="turtle_teleop_key" name="teleop" output="screen"/>
    <!-- Axes -->
    <param name="scale_linear" value="2" type="double"/>
    <param name="scale_angular" value="2" type="double"/>

    <node pkg="learning_tf" type="turtle_tf_broadcaster"
          args="/turtle1" name="turtle1_tf_broadcaster" />
  </launch>

运行launch文件

roslaunch learning_tf start_demo.launch

四、查看广播

rosrun tf tf_echo /world /turtle1

参考自:http://wiki.ros.org/tf/Tutorials/Writing%20a%20tf%20broadcaster%20%28C%2B%2B%29

-END-

最新文章

  1. 生成任意长度的随机数 JS
  2. 控制Arduino的利器-Windows Remote Arduino
  3. js获取浏览器内核、类型、版本以及系统类型
  4. [课程设计]Sprint Three 回顾与总结&amp;发表评论&amp;团队贡献分
  5. PHP 判断是否为 AJAX 请求
  6. Topic Model
  7. thinkphp 3+ 观后详解 (5)
  8. [C#]Array 添加扩展
  9. Python的库和资源(转)
  10. HTML文本格式化
  11. 一个小玩具:NDK编译SDL的例子
  12. 课堂里学不到的C与C++那些事(一)
  13. 图文解说PhpStorm 7.0版本支持PHP 5.5
  14. Gitflow工作流程
  15. 【漫画】以后在有面试官问你平衡(AVL)树,你就把这篇文章扔给他。
  16. UI5-学习篇-17-云端WEB IDE开发
  17. Android疑问小结
  18. 使用spring的aop对Struts2的Action拦截后出现依赖注入为空问题
  19. PHP Fatal error: Uncaught ErrorException: preg_match_all (): JIT compilation failed: no more memory in phar
  20. 在timer的时候突然改变影片简介,先前的不暂停

热门文章

  1. Eclipse代码自动提示(内容辅助content assist)
  2. 解决Fiddler抓包上不了网的问题:
  3. express创建第一个web应用
  4. es6-set-map数据结构
  5. Scrapy处理200-300范围之外的响应代码
  6. 金蝶WAFII
  7. ES6中的Symbol
  8. django QuerySet对象转换成字典对象
  9. owin-startup方法
  10. 解决Chrome在隐身模式下无法播放Flash视频