zoukankan      html  css  js  c++  java
  • 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
    

      

  • 相关阅读:
    MySQL的安装和基本管理
    前端基础之jQuery
    前端基础之BOM和DOM
    前端基础之JavaScript
    前端基础之CSS
    前端基础之HTML
    五,pod控制器应用进阶
    运维都该会的Socket知识!
    四,k8s集群资源清单定义入门
    三,k8s集群的应用入门
  • 原文地址:https://www.cnblogs.com/flyinggod/p/10810239.html
Copyright © 2011-2022 走看看