ROS的tf包中坐标变换的方法

来源:互联网 发布:C语言gets 编辑:程序博客网 时间:2024/04/27 01:35

1、setRotation函数的参数

在坐标变换的时候常有这样的写法: 
tfTutorialsAdding a frame (C++)

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")

这三句话分别做了以下工作: 

1、设置carrot1在turtle1坐标系下的坐标原点 
2、设置carrot1相对于turtle1的旋转角度,这里用四元数表示 
3、发送变换信息 
上面四元数表示旋转角度的方式不太直观,我们写代码的时候不想将旋转变换换算成四元数的时候可以采用如下方法写这个变换:

turtle_tf_ broadcaster.cpp

static tf::TransformBroadcaster br;tf::Transform transform;transform.setOrigin( tf::Vector3(msg->x, msg->y, 0.0) );tf::Quaternion q;q.setRPY(0, 0, msg->theta);transform.setRotation(q);br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", turtle_name));

这样通过这三句话就可以直接用RPY(分别对应绕XYZ轴旋转角度)来设置旋转变换了

tf::Quaternion q;q.setRPY(0, 0, msg->theta);transform.setRotation(q);
这里的msg->x, msg->y,msg->theta是解引用msg并获取该元素名为x(或者y,theta)的成员,相当于(*msg).x,(*msg).y,(*msg).theta

四元数的直观意义: 
四元数(x,y,z,w)表示绕轴(x0,y0,z0)旋转α角度,他们之间的关系是:w=cos(α2)x=x0sin(α2)y=y0sin(α2)z=z0sin(α2) 
在使用的时候往往将四元数归一化,即要求四元数的模为1: 
x2+y2+z2+w2=1

2  static_transform_publisher

        static_transform_publisher工具的功能是发布两个参考系之间的静态坐标变换,两个参考系一般不发生相对位置变化。

命令的格式如下:

  • static_transform_publisher x y z yaw pitch roll frame_id child_frame_id period_in_ms
  • static_transform_publisher x y z qx qy qz qw frame_id child_frame_id  period_in_ms

         以上两种命令格式,需要设置坐标的偏移和旋转参数,偏移参数都使用相对于xyz三轴的坐标位移,而旋转参数第一种命令格式使用以弧度为单位的 yaw/pitch/roll三个角度(yaw是围绕x轴旋转的偏航角,pitch是围绕y轴旋转的俯仰角,roll是围绕z轴旋转的翻滚角),而第二种命令格式使用四元数表达旋转角度。发布频率以ms为单位,一般100ms比较合适。


0 0