ROS::TF2教程中的例程详解:Writing a tf2 static broadcaster (C++)

3 篇文章 0 订阅

原教程链接:
Writing a tf2 static broadcaster (C++)

注释如下:

#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)
{
  //初始化ros节点
  ros::init(argc,argv, "my_static_tf2_broadcaster"); 
  
  // 判断参数数量,参数至少应有8个
  // 参数0:static_turtle_tf2_broadcaster
  // 参数1:目标坐标系名(教程中是world坐标系的子坐标系即“mystaticturtle”)
  // 参数2,3,4:X、Y、Z轴的位移值
  // 参数5,6,7:横滚、俯仰、航向的旋转角度
  if(argc != 8)
  {
    ROS_ERROR("Invalid number of parameters\nusage: static_turtle_tf2_broadcaster child_frame_name x y z roll pitch yaw");
    return -1;
  }
  //目标的坐标系不能是world坐标系,world系是最根本的坐标系。
  if(strcmp(argv[1],"world")==0)  
  {
    ROS_ERROR("Your static turtle name cannot be 'world'");
    return -1;
  }

  //将输入参数1作为目标坐标系。
  static_turtle_name = argv[1];

  //创建一个StaticTransformBroadcaster的对象static_broadcaster之后通过这个对象来发布坐标变换。
  //可以把这个broadcaster对象想象成大喇叭。我们把变换消息消息用一个函数装填到喇叭里就能发送了。
  static tf2_ros::StaticTransformBroadcaster static_broadcaster;  
  
  //声明变换消息。
  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;
  //赋值变换消息的3D位移变量
  static_transformStamped.transform.translation.x = atof(argv[2]);
  static_transformStamped.transform.translation.y = atof(argv[3]);
  static_transformStamped.transform.translation.z = atof(argv[4]);
  //声明一个四元数变量(通常用来表示坐标系的旋转)
  tf2::Quaternion quat;
  //用Roll/Pitch/Yaw数值来初始化四元数变量
  quat.setRPY(atof(argv[5]), atof(argv[6]), atof(argv[7]));
  //赋值变换消息中的四元数变量
  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();

  //将初始化好的变换消息发送出去
 static_broadcaster.sendTransform(static_transformStamped);
  
  //在终端上显示信息
  ROS_INFO("Spinning until killed publishing %s to world", static_turtle_name.c_str());
  ros::spin();
  return 0;
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值