ROS TF编程-----小乌龟的坐标变换,如何让一个乌龟跟随着另一个乌龟移动

Adonia ·
更新时间:2024-11-15
· 504 次阅读

ROS TF编程-----小乌龟的坐标变换,如何让一个乌龟跟随着另一个乌龟移动

为了探索TF编程中的坐标变换,我们需要了解小乌龟(机器人)头部坐标系相对于全局坐标系的关系是什么样的?机器人夹取的物体相对于机器人中心坐标系的位置?机器人中心坐标系相对于全局坐标系的位置?
这些是我们在进行嵌入式需要探索的坐标变换,只有明确机器人的相对位置,我们才能更好的进行更深入的学习!

TF坐标变换实现
广播TF变换
监听TF变换

本次博客,主要通过小乌龟的左边变换来进行深入的TF了解,话不多说,一起来看吧!

ROS TF编程目录ROS TF编程-----小乌龟的坐标变换,如何让一个乌龟跟随着另一个乌龟移动一、设置广播器1、进入工程包commc2、创建广播器程序==broadCaster1.cpp ==3、打开文件==broadCaster1.cpp ==4、将广播器程序写入该文件中二、设置监听器1、在当前目录创建监听器程序==robListener1.cpp ==2、打开文件==robListener1.cpp ==3、将如下监听程序写入该文件中三、修改==CMakeLists.txt==1、进入comm工程包2、打开==CMakeLists.txt==文件3、将如下广播、监听的编译程序添加到文件末尾4、找到CMakeLists.txt文件中的==find_package==函数,添加tf属性;四、创建luanch运行程序1、在当前目录下创建==luanch==文件夹2、进入luanch文件夹3、创建文件==robListener.launch==4、打开文件==robListener.launch==5、将如下代码写入文件中:五、编译程序、程序注册1、编译程序2、编译程序3、程序注册六、进行测试1、新建一个终端,运行ros2、在最开始的终端运行我们的launch文件3、接下来,我们在终端通过电脑键盘控制==小乌龟1==移动,我们会发现==小乌龟2==跟着1移动,如下所示: 一、设置广播器 1、进入工程包commc cd ~/ros/src/comm/src 2、创建广播器程序==broadCaster1.cpp == touch broadCaster1.cpp 3、打开文件==broadCaster1.cpp == gedit broadCaster1.cpp 4、将广播器程序写入该文件中 /** * 该例程产生tf数据,并计算、发布base_laser的位置指令 */ #include #include 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; };

到这里,我们的广播器程序就设置完成,如下所示:
在这里插入图片描述

二、设置监听器 1、在当前目录创建监听器程序==robListener1.cpp == touch robListener1.cpp 2、打开文件==robListener1.cpp == gedit robListener1.cpp 3、将如下监听程序写入该文件中 /** * 该例程监听tf数据,并计算、发布base_laser的位置指令 */ #include #include #include 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; };

到这里,我们的监听程序就写好了,如下:
在这里插入图片描述
接下,我们就修改CMakeLists.txt文件了!

三、修改CMakeLists.txt 1、进入comm工程包 cd ~/ros/src/comm/ 2、打开CMakeLists.txt文件 gedit CMakeLists.txt 3、将如下广播、监听的编译程序添加到文件末尾 add_executable(broadCaster1 src/broadCaster1.cpp) target_link_libraries(broadCaster1 ${catkin_LIBRARIES}) add_executable(robListener1 src/robListener1.cpp) target_link_libraries(robListener1 ${catkin_LIBRARIES}) 4、找到CMakeLists.txt文件中的find_package函数,添加tf属性; tf

如下所示:
在这里插入图片描述
点击保存、关闭,我们的CMakeLists.txt文件就修改完成

四、创建luanch运行程序 1、在当前目录下创建luanch文件夹 mkdir launch 2、进入luanch文件夹 cd launch 3、创建文件robListener.launch touch robListener.launch 4、打开文件robListener.launch gedit robListener.launch 5、将如下代码写入文件中:

如下所示:
在这里插入图片描述
点击保存、关闭,我们的运行程序就创建完成!如下所示:
在这里插入图片描述

五、编译程序、程序注册 1、编译程序

1)、进入ros项目工程包

cd ~/ros 2、编译程序 catkin_make

出现如下界面,我们就编译成功,如果有错误,则我们可以根据错误的提示修改:
在这里插入图片描述

3、程序注册 source ./devel/setup.bash

在这里插入图片描述

六、进行测试 1、新建一个终端,运行ros roscore

在这里插入图片描述

2、在最开始的终端运行我们的launch文件 roslaunch comm robListener.launch

运行后会出现如下界面,则表示运行成功:
在这里插入图片描述

3、接下来,我们在终端通过电脑键盘控制小乌龟1移动,我们会发现小乌龟2跟着1移动,如下所示:

在这里插入图片描述
到这里,我们的实验就成功了,依次关闭终端,结束实验!
以上就是本次博客的全部内容啦,希望通过本次TF编程的学习,可以让学弟学妹们更加了解ros的TF编程!
遇到问题的小伙伴欢迎在评论区留言讨论哦!林君学长耐心给大家解决!这个学长不太冷!
陈一月的又一天编程岁月^ _ ^


作者:陈一月的编程岁月



ros 坐标变换

需要 登录 后方可回复, 如果你还没有账号请 注册新账号
相关文章