ROS TF编程-----小乌龟的坐标变换,如何让一个乌龟跟随着另一个乌龟移动
为了探索TF编程中的坐标变换,我们需要了解小乌龟(机器人)头部坐标系相对于全局坐标系的关系是什么样的?机器人夹取的物体相对于机器人中心坐标系的位置?机器人中心坐标系相对于全局坐标系的位置?
这些是我们在进行嵌入式需要探索的坐标变换,只有明确机器人的相对位置,我们才能更好的进行更深入的学习!
TF坐标变换实现
广播TF变换
监听TF变换
本次博客,主要通过小乌龟的左边变换来进行深入的TF了解,话不多说,一起来看吧!
ROS TF编程目录
ROS TF编程-----小乌龟的坐标变换,如何让一个乌龟跟随着另一个乌龟移动
一、设置广播器
1、进入工程包commc
2、创建广播器程序==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、新建一个终端,运行ros
2、在最开始的终端运行我们的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 <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;
};

到这里,我们的广播器程序就设置完成,如下所示:

二、设置监听器
1、在当前目录创建监听器程序==robListener1.cpp ==
touch robListener1.cpp

2、打开文件==robListener1.cpp ==
gedit robListener1.cpp

3、将如下监听程序写入该文件中

/**
 * 该例程监听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;
};

到这里,我们的监听程序就写好了,如下:

接下,我们就修改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属性;

如下所示:

点击保存、关闭,我们的CMakeLists.txt文件就修改完成

四、创建luanch运行程序
1、在当前目录下创建luanch文件夹
mkdir launch

2、进入luanch文件夹
cd launch

3、创建文件robListener.launch
touch robListener.launch

4、打开文件robListener.launch
gedit robListener.launch

5、将如下代码写入文件中:

<launch>
	<!-- 海龟仿真器 -->
	<node pkg="turtlesim" type="turtlesim_node" name="sim"/>
 
	<!-- 键盘控制 -->
	<node pkg="turtlesim" type="turtle_teleop_key" name="teleop" output="screen"/>
 
	<!-- 两只海龟的tf广播 -->
	<node pkg="comm" type="broadCaster1" args="/turtle1" name="turtle1_tf_broadcaster"/>
	<node pkg="comm" type="broadCaster1" args="/turtle2" name="turtle2_tf_broadcaster"/>
 
	<!-- 监听tf广播,并且控制turtle2移动 -->
	<node pkg="comm" type="robListener1"  name="listener"/>
 
</launch>

如下所示:

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

五、编译程序、程序注册

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编程!
遇到问题的小伙伴欢迎在评论区留言讨论哦!林君学长耐心给大家解决!这个学长不太冷!
陈一月的又一天编程岁月^ _ ^