为了探索TF编程中的坐标变换,我们需要了解小乌龟(机器人)头部坐标系相对于全局坐标系的关系是什么样的?机器人夹取的物体相对于机器人中心坐标系的位置?机器人中心坐标系相对于全局坐标系的位置?
这些是我们在进行嵌入式需要探索的坐标变换,只有明确机器人的相对位置,我们才能更好的进行更深入的学习!
TF坐标变换实现
广播TF变换
监听TF变换
本次博客,主要通过小乌龟的左边变换来进行深入的TF了解,话不多说,一起来看吧!
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;
};
到这里,我们的广播器程序就设置完成,如下所示:
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文件了!
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文件就修改完成
mkdir launch
2、进入luanch文件夹
cd launch
3、创建文件robListener.launch
touch robListener.launch
4、打开文件robListener.launch
gedit robListener.launch
5、将如下代码写入文件中:
如下所示:
点击保存、关闭,我们的运行程序就创建完成!如下所示:
1)、进入ros项目工程包
cd ~/ros
2、编译程序
catkin_make
出现如下界面,我们就编译成功,如果有错误,则我们可以根据错误的提示修改:
source ./devel/setup.bash
六、进行测试
1、新建一个终端,运行ros
roscore
2、在最开始的终端运行我们的launch文件
roslaunch comm robListener.launch
运行后会出现如下界面,则表示运行成功:
到这里,我们的实验就成功了,依次关闭终端,结束实验!
以上就是本次博客的全部内容啦,希望通过本次TF编程的学习,可以让学弟学妹们更加了解ros的TF编程!
遇到问题的小伙伴欢迎在评论区留言讨论哦!林君学长耐心给大家解决!这个学长不太冷!
陈一月的又一天编程岁月^ _ ^