博客参考:https://www.ncnynl.com/archives/201702/1312.htmlhtml
ROS与C++入门教程-tf-增长坐标系
说明:node
- 介绍如何为TF增长额外固定的坐标系
为什么增长坐标系vim
- 对于许多任务,更容易在本地坐标内思考。
- 例如,更容易推断在激光扫描器中心的坐标系中的激光扫描。
- tf容许您为系统中的每一个传感器,连接等定义一个本地坐标系。
- 而且,tf将处理所引入的全部额外坐标系的变换。
那里增长坐标系url
- tf创建坐标系的树结构; 它不容许在坐标系结构中存在闭环。
- 这意味着一个坐标系只有一个父系,但它能够有多个子系。
- 目前咱们的tf树包含三个坐标系:world,turtle1和turtle2。 两只乌龟是世界的子系。
- 若是咱们要向tf添加一个新坐标系,三个现有坐标系中的一个须要是父系,新坐标系将成为子系。
- 图示:
如何添加坐标系spa
- 在咱们的乌龟例子中,咱们将添加一个新的坐标系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; };
- 代码相似广播变换
代码解释:.net
- 代码:
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米远
编译运行code
- 打开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文件orm
-
编辑start_demo.launchhtm
$ 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
检查结果:blog
- 接着上个教程的,若是你驱动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