静态坐标变换

URL

tf2/Tutorials/Writing a tf2 static broadcaster (C++) - ROS Wiki

需要的软件包

tf2 tf2_ros

创建功能包的过程不再赘述,功能包官网中命名为learning_tf2 文件名为static_turtle_tf2_broadcaster.cpp

代码及解释

#include <ros/ros.h>
#include <tf2_ros/static_transform_broadcaster.h>
#include <geometry_msgs/TransformStamped.h>
#include <cstdio>
#include <tf2/LinearMath/Quaternion.h>


//创建一个字符串变量
std::string static_turtle_name;

int main(int argc, char **argv)
{
    //节点命名为my_static_tf2_broadcaster
    ros::init(argc, argv, "my_static_tf2_broadcaster");
    if (argc != 8)
    {
        ROS_ERROR("Invalid number of parametersnusage: static_turtle_tf2_broadcaster child_frame_name x y z roll pitch yaw");
        return -1;
    }

    if (strcmp(argv[1], "world") == 0)
    {
        ROS_ERROR("Your static turtle name cannot be 'world'");
        return -1;
    }

    static_turtle_name = argv[1];
    //创建一个静态tf广播对象 static_broadcaster
    static tf2_ros::StaticTransformBroadcaster static_broadcaster;
    //包含静态变化信息的变量 static_transformStemped
    geometry_msgs::TransformStamped static_transformStamped;

    //设置时间戳
    static_transformStamped.header.stamp = ros::Time::now();
    //设置父坐标系名称
    static_transformStamped.header.frame_id = "world";
    //设置子坐标系名称
    static_transformStamped.child_frame_id = static_turtle_name;
    //从命令行参数argv中读取值 设置偏移量
    static_transformStamped.transform.translation.x = atof(argv[2]);
    static_transformStamped.transform.translation.y = atof(argv[3]);
    static_transformStamped.transform.translation.z = atof(argv[4]);

    //创建一个四元数对象
    //根据输入参数中的roll pitvh yaw角度设置四元数姿态
    tf2::Quaternion quat;
    quat.setRPY(atof(argv[5]), atof(argv[6]), atof(argv[7]));
    //设置变换的旋转分量为四元数的x,y,z和w分量。
    static_transformStamped.transform.rotation.x = quat.x();
    static_transformStamped.transform.rotation.y = quat.y();
    static_transformStamped.transform.rotation.z = quat.z();
    static_transformStamped.transform.rotation.w = quat.w();

    //使用静态tf广播器将static_transformStamped广播出去
    static_broadcaster.sendTransform(static_transformStamped);
    ROS_INFO("Spinning until killed publishing %s to world", static_turtle_name.c_str());
    ros::spin();

    return 0;
}

涉及到的模块的简介

  1. tf2_ros::StaticTransformBroadcaster

用于广播静态变换的类,可以另一和发布静态变换

常用的成员函数

sendTransform(const geometry_msgs::TransformStamped& transform):用于发布静态变换消息

  1. geometry_msgs::TransformStamped 用于表示带时间戳的变换信息。

geometry_msgs::TransformStamped 类型包含以下成员:

  • std_msgs::Header header:消息头部信息,包含时间戳和坐标系信息。
  • std::string child_frame_id:子坐标系的名称。
  • geometry_msgs::Transform transform:坐标系变换的具体信息。

坐标系变换的具体信息包括:

  • geometry_msgs::Vector3 translation:表示坐标系的平移变换,包含 x、y、z 三个浮点数。
  • geometry_msgs::Quaternion rotation:表示坐标系的旋转变换,包含四元数的成员变量 x、y、z、w,用于表示旋转轴和旋转角度。

通过访问这些成员变量,可以分别获取或设置静态坐标系变换消息的各个属性值。

小结

通过tf2_ros::StaticTransformBroadcaster模块下的sendTransform发布geometry_msgs::TransformStamped类型的消息。

CMakeLists文件的编写不再赘述

静态转换的正确方法

本教程旨在展示如何使用 StaticTransformBroadcaster 发布静态转换。在实际的开发过程中,您不必自己编写此代码,而应该优先使用专用的tf2_ros工具来执行此操作。tf2_ros提供了一个名为 static_transform_publisher 的可执行文件,该可执行文件既可以用作命令行工具,也可以用作可以添加到启动文件的节点。

static_transform_publisher x y z 偏航俯仰滚frame_id child_frame_id

static_transform_publisher x y z qx qy qz qw frame_id child_frame_id

  • 使用 x/y/z 偏移(以米为单位)和偏航/俯仰/滚动(以弧度为单位)将静态坐标变换发布到 tf2。(偏航是绕 Z 的旋转,俯仰是绕 Y 的旋转,滚动是绕 X 的旋转)。
 <launch>
   <node pkg="tf2_ros" type="static_transform_publisher" name="link1_broadcaster" args="1 0 0 0 0 0 1 link1_parent link1" />
 </launch>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值