ros tf的学习教程第二部分——传感器数据的处理

第一部分学习完了小乌龟的教程,两只小乌龟都以世界坐标系为父坐标系,然后两只小乌龟就可以得到彼此之间的tf,然后根据tf就可以实现追赶。

链接如下:
https://blog.csdn.net/qq_24371789/article/details/99673470

我们肯定不止局限于在小乌龟上完成你追我的小任务,我们还是想在机器人上建立机器人与传感器,以及机器人与地图之间的内容,下面对传感器与机器人本体之间的transform进行详细的描述。

内容主要是参考的ROS与navigation教程-设置机器人使用TF,但是感觉代码其实不是很友好,有些地方突然用到boost了,还是自己一点点实现来的更清爽一些。

首先,背景就是一个机器人,一个雷达,之间有一个tf,就想知道雷达的数据,相对与机器人中心是多少呢,发布的程序还是蛮简单的,如下

#include <ros/ros.h>
#include <tf/transform_broadcaster.h>

int main(int argc, char** argv){
  ros::init(argc, argv, "robot_tf_publisher");
  ros::NodeHandle n;

  ros::Rate r(100);

  tf::TransformBroadcaster broadcaster;

  while(n.ok()){
    broadcaster.sendTransform(
      tf::StampedTransform(
        tf::Transform(tf::Quaternion(0, 0, 0, 1), tf::Vector3(0.1, 0.0, 0.2)),
        ros::Time::now(),"base_link", "base_laser"));
    r.sleep();
  }
}

就是定义了一个tf的广播者,只要节点还在运行就不停地发,内容的话就是

tf::StampedTransform( tf::Transform(tf::Quaternion(0, 0, 0, 1), tf::Vector3(0.1, 0.0, 0.2)), 
                                     ros::Time::now(),"base_link", "base_laser"));

一个transform,一个ros::Time::now(),父坐标系是"base_link",子坐标系是" base_laser "

接收的程序我给仿造之前小乌龟的那个给改了一下

#include <ros/ros.h>
#include <geometry_msgs/PointStamped.h>
#include <tf/transform_listener.h>

int main(int argc, char** argv){
	
	ros::init(argc,argv,"robot_tf_listener2");
	ros::NodeHandle n;

	tf::TransformListener listener;

	ros::Rate rate(10.0);

  	while (n.ok()){

  		geometry_msgs::PointStamped laser_point;
  		laser_point.header.frame_id = "base_laser";
  		//we'll just use the most recent transform available for our simple example
  		laser_point.header.stamp = ros::Time();
  		//just an arbitrary point in space
  		laser_point.point.x = 1.0;
  		laser_point.point.y = 0.2;
  		laser_point.point.z = 0.0;

//    	tf::StampedTransform transform;
      		
//      listener.lookupTransform("base_laser", "base_link",  ros::Time(0), transform);

    	geometry_msgs::PointStamped base_point;
    	listener.transformPoint("base_link", laser_point, base_point);

    	ROS_INFO("base_laser: (%.2f, %.2f. %.2f) -----> base_link: (%.2f, %.2f, %.2f) at time %.2f",
        	laser_point.point.x, laser_point.point.y, laser_point.point.z,
        	base_point.point.x, base_point.point.y, base_point.point.z, base_point.header.stamp.toSec());

    	rate.sleep();
  }
  return 0;
}

首先的话就是定义要发布的激光的数据

  		geometry_msgs::PointStamped laser_point;
  		
  		laser_point.header.frame_id = "base_laser";
  		laser_point.header.stamp = ros::Time();
  		laser_point.point.x = 1.0;
  		laser_point.point.y = 0.2;
  		laser_point.point.z = 0.0;

然后定义一个同类型的相对底盘的变量,然后通过

    	listener.transformPoint("base_link", laser_point, base_point);

就把laser_point 转为 base_point

仔细分析一下还是蛮简单的,然后继续学习一下如何接收传感器的数据流转换到base坐标系下的内容~

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值