ROS tf-增加坐标系
博客参考:https://www.ncnynl.com/archives/201702/1312.html
ROS与C++入门教程-tf-增加坐标系
说明:
- 介绍如何为TF增加额外固定的坐标系
为何增加坐标系
- 对于许多任务,更容易在本地坐标内思考。
- 例如,更容易推断在激光扫描器中心的坐标系中的激光扫描。
- tf允许您为系统中的每个传感器,链接等定义一个本地坐标系。
- 并且,tf将处理所引入的所有额外坐标系的变换。
那里增加坐标系
- tf建立坐标系的树结构; 它不允许在坐标系结构中存在闭环。
- 这意味着一个坐标系只有一个父系,但它可以有多个子系。
- 目前我们的tf树包含三个坐标系:world,turtle1和turtle2。 两只乌龟是世界的子系。
- 如果我们要向tf添加一个新坐标系,三个现有坐标系中的一个需要是父系,新坐标系将成为子系。
- 图示:
如何添加坐标系
- 在我们的乌龟例子中,我们将添加一个新的坐标系carrot1到turtle1。
- 新建文件frame_tf_broadcaster.cpp:
$ roscd learning_tf
$ touch src/frame_tf_broadcaster.cpp
$ vim src/frame_tf_broadcaster.cpp
- 代码如下:
#include <ros/ros.h>
#include <tf/transform_broadcaster.h> int main(int argc, char** argv){
ros::init(argc, argv, "my_tf_broadcaster");
ros::NodeHandle node; tf::TransformBroadcaster br;
tf::Transform transform; ros::Rate rate(10.0);
while (node.ok()){
transform.setOrigin( tf::Vector3(0.0, 2.0, 0.0) );
transform.setRotation( tf::Quaternion(0, 0, 0, 1) );
br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "turtle1", "carrot1"));
rate.sleep();
}
return 0;
};
- 代码类似广播变换
代码解释:
- 代码:
transform.setOrigin( tf::Vector3(0.0, 2.0, 0.0) );
transform.setRotation( tf::Quaternion(0, 0, 0, 1) );
br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "turtle1", "carrot1")
- 解释:我们创建transform,从父系turtle1到子系carrot1,carrot1离左边的turtle12米远
编译运行
- 打开CMakeLists.txt
$ rosed learning_tf CMakeLists.txt
- 在底部增加代码:
add_executable(frame_tf_broadcaster src/frame_tf_broadcaster.cpp)
target_link_libraries(frame_tf_broadcaster ${catkin_LIBRARIES})
- 编译:
$ cd ~/catkin_ws
$ catkin_make
编译顺利,在bin目录会生成frame_tf_broadcaster文件
编辑start_demo.launch
$ rosed learning_tf start_demo.launch
- 增加新代码:
<launch>
...
<node pkg="learning_tf" type="frame_tf_broadcaster"
name="broadcaster_frame" />
</launch>
- 运行:
$ roslaunch learning_tf start_demo.launch
检查结果:
- 接着上个教程的,如果你驱动turtle1,你注意到,即使我们添加了一个新的坐标系,行为没有改变。 这是因为添加额外的坐标系不会影响其他坐标系,我们的监听器仍然使用先前定义的坐标系。 所以,让我们改变监听器的行为。
- 编辑src/turtle_tf_listener.cpp,在26-27行用/carrot1替换/turtle1,如:
listener.lookupTransform("/turtle2", "/carrot1",
ros::Time(0), transform);
- 编译运行:
$ catkin_make
$ roslaunch learning_tf start_demo.launch
- 应该可以看到,turtle2跟随carrot1变化,而不是turtle1
广播移动的坐标系
- 我们在本教程中发布的额外坐标系是一个固定的坐标系,不随时间改变相对于父系。 但是,如果要发布移动坐标系,您可以更改广播器以随时间更改。 让我们修改/carrot1坐标系以相对于/turtle1随时间改变。
- 修改编辑src/turtle_tf_listener.cpp
$ vim src/frame_tf_broadcaster.cpp
- 代码如下:
transform.setOrigin( tf::Vector3(2.0*sin(ros::Time::now().toSec()), 2.0*cos(ros::Time::now().toSec()), 0.0) );
transform.setRotation( tf::Quaternion(0, 0, 0, 1) );
- 编译运行:
$ catkin_make
$ roslaunch learning_tf start_demo.launch
ROS tf-增加坐标系的更多相关文章
- ROS tf监听编写
博客转载自:https://www.ncnynl.com/archives/201702/1311.html ROS与C++入门教程-tf-编写tf listener(监听) 说明: 介绍如何使用tf ...
- ROS tf广播编写
博客参考:https://www.ncnynl.com/archives/201702/1310.html ROS与C++入门教程-tf-编写tf broadcaster(广播) 说明: 介绍如何广播 ...
- ROS tf 编程指南
ROS (Robot Operating System, 机器人操作系统)是最知名的机器人操作系统,广泛应用于无人驾驶和机器人,tf(transforms,坐标系转换)是ROS下的一个常用的工具库.r ...
- ROS tf基础使用知识
博客参考:https://www.ncnynl.com/archives/201702/1306.html ROS与C++入门教程-tf-坐标变换 说明: 介绍在c++实现TF的坐标变换 概念: Co ...
- ROS TF——learning tf
在机器人的控制中,坐标系统是非常重要的,在ROS使用tf软件库进行坐标转换. 相关链接:http://www.ros.org/wiki/tf/Tutorials#Learning_tf 一.tf简介 ...
- ROS tf
一.节点中使用(cpp,python) 1. ros wiki 提供的tutorials 2. https://blog.csdn.net/start_from_scratch/article/det ...
- ROS tf 两个常用的函数
/** \brief Get the transform between two frames by frame ID. * \param target_frame The frame to wh ...
- ROS Learning-014 learning_tf(编程) 坐标系变换(tf)广播员 (Python版)
ROS Indigo learning_tf-01 坐标系变换(tf)广播员 (Python版) 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubuntu ...
- 制作自己的ros机器人(navigaion)前提--22
摘要: 原创博客:转载请表明出处:http://www.cnblogs.com/zxouxuewei/ 一.要求: 1.大家已经对ROS的基本概念(进程间通讯topic service 数据类型 m ...
随机推荐
- Linux无法被远程登录;用户的关机, 重启,注销,新增用户,删除用户
不能使用xshell连接到我的Linux服务器 通过再windows的cmd中ping了我的Linux地址,发现网络不通. 查看百度发现是因为网络没有选桥接模式,然后选完桥接模式告诉我: 然后发现没有 ...
- Python的包管理工具
Python的包管理工具 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.为什么使用包管理 Python的模块或者源文件直接可以复制到目标项目目录中,就可以导入使用了. 但是为了 ...
- asp.net core 默认采用小驼峰命名和自定义模型验证
services.AddMvc(options => { options.Filters.Add<ApiExceptionAttribute>(); }).SetCompatibil ...
- Python基础->for循环、字符串以及元组
python流程控制>for循环.字符串以及元组 学习有关序列的思想.序列:一组有顺序的东西.所有的序列都是由元素组成的,序列中的元素位置是从0开始编号的,最后一个元素的位置是它长度减一. fo ...
- python+正则提取+ip代理爬取糗事百科文字信息
很多网站都有反爬措施,最常见的就是封ip,请求次数过多服务器会拒绝连接,如图: 在程序中设置一个代理ip,可有效的解决这种问题,代码如下: # 需要的库 import requests import ...
- dockerhub下载加速
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f5dad4ec.m.daocloud.io syste ...
- UVA11424 GCD - Extreme (I)[数论]
其实这题我也没太明白... 我们要求 \[ \sum_{i=1}^{N-1}\sum_{j=i+1}^Ngcd(i,j) \] 引理: 我们要求\(gcd(i,j)=k\)的个数,可转化为求\(gcd ...
- Centos7-Gnome安装
查看grouplist yum grouplist 安装gnome yum groupinstall "GNOME Desktop" root用户权限下,设置centos系统默认的 ...
- 使用Apache commons-maths3-3.6.1.jar包,在hive上执行获取最大值的操作
udf是对hive上的每行(单行)数据操作,现在我要实现对hive上的一列数据操作,udf函数已经满足不了我的要求了,使用udaf对hive的一列求最大值: 代码如下: package com; im ...
- Dict.Count
static void Main(string[] args) { Dictionary<string, string> paraNameValueDict = new Dictionar ...