ROS理解:ros中的坐标以及对tf2进行解读

本文是ROS中TF2的教程,介绍了ROS中的坐标标准,说明了tf已被弃用、tf2包含其所有功能。详细讲解了发布静态和动态tf2的多种方式,如launch、urdf、代码方式等,还介绍了监听tf2的方法及注意事项,最后提及增加自定义frame的操作。


官网就是最好的教程,如果阅读英文没什么压力,强烈推荐以下链接进行全面了解:

官网tf2教程

1. ROS中的坐标

机器人当中有一套自己的坐标标准,它的直角坐标系表示如下:
在这里插入图片描述
相对于机器人来说:

X :朝前 ,红色
Y :朝左,绿色
Z :朝上,蓝色

旋转变换的坐标表示如下:
在这里插入图片描述

其中:Roll,Pitch,Yaw的右手法则,大拇指的方向为X,Y,Z的方向。

怎么理解发布的坐标呢?

建立父link到子link的tf变换,就是让父link向子link移动过程中(x, y, z, Roll,Pitch,Yaw)的变化。

2. tf到tf2的变化

tf已经被ROS弃用了,而且tf2包含了tf的所有功能,所以这里不介绍tf了,如果想要了解tf到tf2的变化,可以点击下列链接。

数据类型的变化:http://wiki.ros.org/tf2/Tutorials/Migration/DataConversions
监听模式的变化:http://wiki.ros.org/tf2/Tutorials/Migration/TransformListener
发布模式的变化:http://wiki.ros.org/tf2/Tutorials/Migration/TransformBroadcaster

3. 发布静态tf2

静态tf是不随时间变化的坐标变换,可以有三种发布方式,:launch方式、urdf发布方式和写代码方式,下面分别介绍。

  • 方式一:launch(或run)文件方式发布

这种方式最简单直接,直接发布从父link到子link的坐标变换,代码如下:

1) 欧拉角发布

  1. launch方法
<launch>
<node pkg="tf" type="static_transform_publisher" name="link1_link2_broadcaster" args="x y z yaw pitch roll link1 link2 100" />
</launch>
  1. run方法
# 欧拉角
rosrun tf2_ros static_transform_publisher x y z yaw pitch roll frame_id child_frame_id

2) 四元数发布

  1. launch方法
<launch>
<node pkg="tf" type="static_transform_publisher" name="link1_link2_broadcaster" args="x y z qx qy qz qw link1 link2 100" />
</launch>
  1. run方法
# 四元数
rosrun tf2_ros static_transform_publisher x y z qx qy qz qw frame_id child_frame_id
  • x y z 代表link2相对与link1的位置变换。

  • qx qy qz qw表示link2相对与link1的位姿变换的四元数。

  • 参数100表示每隔100毫秒发布一次。

  • 方式二:urdf方式发布
    待添加
  • 方式三:代码方式发布

创建ros包:

catkin_create_pkg learning_tf2 tf2 tf2_ros roscpp rospy turtlesim

代码以及注释如下:

#include <ros/ros.h>
#include <tf2_ros/static_transform_broadcaster.h>
#include <geometry_msgs/TransformStamped.h>
#include <cstdio>
#include <tf2/LinearMath/Quaternion.h>
#include <iostream>
std::string static_turtle_name;

int main(int argc, char **argv)
{
   
   
  ros::init(argc,argv, "my_static_tf2_broadcaster");
  if(argc != 8)//需要输入8个参数
  {
   
   
    ROS_ERROR("Invalid number of parameters\nusage: static_turtle_tf2_broadcaster child_frame_name x y z roll pitch yaw");
    return -1;
  }
  if(strcmp(argv[1],"world")==0)//1号参数不能和world相同,因为它是子link
  {
   
   
    ROS_ERROR("Your static turtle name cannot be 'world'");
    return -1;

  }
  static_turtle_name = argv[1];//赋值给子link,argv[0]为命令节点
  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;

  //将char*类型的值转换为double类型,从第2号开始输入值
  //前三位为位置变换
  static_transformStamped.transform.translation.x = atof(argv[2]);
  static_transformStamped.transform.translation.y = atof(argv[3]);
  static_transformStamped.transform.translation.z = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

非晚非晚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值