ROS TF编程-----广播并监听机器人的坐标变换
作者:互联网
TF编程:广播并监听机器人的坐标变换
例题:广播并监听机器人的坐标变换,已知激光雷达和机器人底盘的坐标关系,求解激光雷达数据在底盘坐标系下的坐标值?
ROS的TF编程是对于嵌入式的进阶学习,有助于我们理解机器人运动与实时获取位置信息的方式,学习TF编程,我们就的指导TF功能包,什么是ROS的TF功能包?
ROS的TF功能包:
TF功能包,可以通过广播TF变换和监听TF变换获取如下坐标变换关系:
机器人局部坐标系相对于全局坐标系的关系。
机器人夹取的物体相对于机器人中心坐标系的位置.
机器人中心坐标系相对于全局坐标系的位置。
本次博客,我们就用上文所给的例子来进行TF编程的学习,话不多说,一起来看吧!
一、设置TF广播器
1、进入项目工程包
cd ~/ros/src/comm/src
注意:ros是我的ros工作空间、comm是自己的ros工程包,小伙伴们根据自己的进行修改哦!
2、创建TF广播文件broadCaster.cpp
touch broadCaster.cpp
3、打开TF广播文件
gedit broadCaster.cpp
4、将以下c++语言代码写入TF广播文件
/**
* 该例程产生tf数据,并计算、发布base_laser的位置指令
*/
#include <ros/ros.h>
#include <tf/transform_broadcaster.h>
int main(int argc, char** argv){
// 初始化ROS节点
ros::init(argc, argv, "robot_tf_broadcaster");
// 订阅base_link的位置话题
ros::NodeHandle node;
// 创建tf的广播器
static tf::TransformBroadcaster br;
while(node.ok()){
// 初始化tf数据
tf::Transform transform;
transform.setOrigin( tf::Vector3(0.1, 0.0, 0.2) );
transform.setRotation( tf::Quaternion(0,0,0,1) );
// 广播base_link与base_laser坐标系之间的tf数据
br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "base_link", "base_laser"));
}
return 0;
};
到这里,我们的TF广播文件就创建完成,如下所示:
二、设置TF监听器
1、在当前文件夹创建TF监听器文件robListener.cpp
创建一个新的终端,我们命名为终端1,输入如下命令:
touch robListener.cpp
2、打开TF监听文件robListener.cpp
gedit robListener.cpp
3、将以下c++代码写入TF监听文件
/**
* 该例程监听tf数据,并计算、发布base_laser的位置指令
*/
#include <ros/ros.h>
#include <tf/transform_listener.h>
#include <geometry_msgs/PointStamped.h>
int main(int argc, char** argv){
// 初始化ROS节点
ros::init(argc, argv, "robot_tf_listener");
// 创建节点句柄
ros::NodeHandle node;
// 创建tf的监听器
tf::TransformListener listener;
ros::Rate rate(10.0);
while (node.ok()){
//我们将在base_laser帧中创建一个要转换为base_link帧的点
geometry_msgs::PointStamped laser_point;
laser_point.header.frame_id = "base_laser";
//我们将在我们的简单示例中使用最近可用的转换
laser_point.header.stamp = ros::Time();
//laser_point检测点获取
laser_point.point.x = 0.3;
laser_point.point.y = 0.0;
laser_point.point.z = 0.0;
try{
// 等待获取监听信息base_link和base_laser
listener.waitForTransform("base_link", "base_laser", ros::Time(0), ros::Duration(3.0));
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());
}
catch(tf::TransformException& ex){
ROS_ERROR("Received an exception trying to transform a point from \"base_laser\" to \"base_link\": %s", ex.what());
}
rate.sleep();
}
return 0;
};
到这里,我们的TF监听文件就创建好了,如下:
接下来就是修改CMakeLists.txt文件啦!
三、修改CMakeLists.txt文件
1、进入工程包comm
cd ~/ros/src/comm/
2、打开CMakeLists.txt文件
gedit CMakeLists.txt
3、在CMakeLists.txt文件末尾添加如下TF项目编译代码:
add_executable(broadCaster src/broadCaster.cpp)
target_link_libraries(broadCaster ${catkin_LIBRARIES})
add_executable(robListener src/robListener.cpp)
target_link_libraries(robListener ${catkin_LIBRARIES})
如下所示:
4、找到CMakeLists.txt文件中find_package函数一项,在里面添加如下TF属性:
tf
如下所示:
到这里,我们的CMakeLists.txt文件就修改完成,点击保存,关闭文件!
四、编译项目文件
1、进入ros工作空间
cd ~/ros
2、编译文件
catkin_make
出现如下编译进度100%,这编译代码成功,如果不成功,则可以根据提示的错误信息进行修改:
3、程序注册
让我们编写的代码生效
source ./devel/setup.bash
五、测试运行结果
1、启动ros
1)、新建一个终端,我们命令为终端2,然后启动
roscore
2、在终端2保持不动的时候,再次新建一个终端,我们命名为终端3
3、在终端3进入ros工作空间
cd ~/ros
4、在终端3进行程序注册
source ./devel/setup.bash
5、在终端3运行TF监听程序
在终端3输入以下代码,不忙按回车
rosrun comm robListener
6、在终端1运行TF广播程序
1)、在终端1输入以下命令,然后回车,紧接着在终端3回车,观察终端1和3的变化
rosrun comm broadCaster
运行后,我们可以观察到如下图的情况:
上图可以看出,终端3可以在监听处获得base_laser和base_link的坐标关系了。
2)、Ctrl+C关闭运行的程序,如下图:
以上就是本次博客的全部内容了,希望本次博客,对小伙伴们学习ROS TF编程有一定的帮助哦!感谢大家阅读,记得点赞、关注哦!遇到问题的小伙伴在评论区留言,一起讨论问题所在吧!林君学长耐心为大家解决哦!
陈一月的又一天编程岁月^ _ ^
标签:ros,laser,point,tf,base,TF,ROS,监听 来源: https://blog.csdn.net/qq_42451251/article/details/104772128