ROS:tf坐标系广播与监听的编程实现

目录

  • 一、创建功能包
  • 二、创建代码并编译运行(C++)
    • 2.1创建代码
    • 2.2编译
    • 2.3运行

一、创建功能包

创建的 learning_tf 包来进行代码存放和编译

cd ~/catkin_ws/src
catkin_create_pkg learning_tf roscpp rospy tf turtlesim

在这里插入图片描述

二、创建代码并编译运行(C++)

实现一个TF广播器:

定义TF广播器(TransformBroadcaster)
创建坐标变换值
发布坐标变换(sendTransform)

实现一个TF监听器:
定义TF监听器(TransformListener)
查找坐标变换(waitForTransform、lookupTransform)

2.1创建代码

在/master/learning_tf/src文件加下创建turtle_tf_broadcaster.cpp文件和turtle_tf_listener.cpp文件
turtle_tf_broadcaster.cpp
通过TF广播任意两个坐标系之间的位置关系,需要建立一个广播器,然后创建坐标的变换值,将这个变换矩阵的信息广播出去(插入TF tree)

/*** 该例程产生tf数据,并计算、发布turtle2的速度指令*/#include <ros/ros.h>
#include <tf/transform_broadcaster.h>
#include <turtlesim/Pose.h>std::string turtle_name;void poseCallback(const turtlesim::PoseConstPtr& msg)
{// 创建tf的广播器static tf::TransformBroadcaster br;// 初始化tf数据tf::Transform transform;transform.setOrigin( tf::Vector3(msg->x, msg->y, 0.0) );tf::Quaternion q;q.setRPY(0, 0, msg->theta);transform.setRotation(q);// 广播world与海龟坐标系之间的tf数据br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", turtle_name));
}int main(int argc, char** argv)
{// 初始化ROS节点ros::init(argc, argv, "my_tf_broadcaster");// 输入参数作为海龟的名字if (argc != 2){ROS_ERROR("need turtle name as argument"); return -1;}turtle_name = argv[1];// 订阅海龟的位姿话题ros::NodeHandle node;ros::Subscriber sub = node.subscribe(turtle_name+"/pose", 10, &poseCallback);// 循环等待回调函数ros::spin();return 0;
};

turtle_tf_listener.cpp
坐标关系插入TF tree后,树会自动运算变换矩阵,后面就可以用监听器调用了

/*** 该例程监听tf数据,并计算、发布turtle2的速度指令*/#include <ros/ros.h>
#include <tf/transform_listener.h>
#include <geometry_msgs/Twist.h>
#include <turtlesim/Spawn.h>int main(int argc, char** argv)
{// 初始化ROS节点ros::init(argc, argv, "my_tf_listener");// 创建节点句柄ros::NodeHandle node;// 请求产生turtle2ros::service::waitForService("/spawn");ros::ServiceClient add_turtle = node.serviceClient<turtlesim::Spawn>("/spawn");turtlesim::Spawn srv;add_turtle.call(srv);// 创建发布turtle2速度控制指令的发布者ros::Publisher turtle_vel = node.advertise<geometry_msgs::Twist>("/turtle2/cmd_vel", 10);// 创建tf的监听器tf::TransformListener listener;ros::Rate rate(10.0);while (node.ok()){// 获取turtle1与turtle2坐标系之间的tf数据tf::StampedTransform transform;try{listener.waitForTransform("/turtle2", "/turtle1", ros::Time(0), ros::Duration(3.0));listener.lookupTransform("/turtle2", "/turtle1", ros::Time(0), transform);}catch (tf::TransformException &ex) {ROS_ERROR("%s",ex.what());ros::Duration(1.0).sleep();continue;}// 根据turtle1与turtle2坐标系之间的位置关系,发布turtle2的速度控制指令geometry_msgs::Twist vel_msg;vel_msg.angular.z = 4.0 * atan2(transform.getOrigin().y(),transform.getOrigin().x());vel_msg.linear.x = 0.5 * sqrt(pow(transform.getOrigin().x(), 2) +pow(transform.getOrigin().y(), 2));turtle_vel.publish(vel_msg);rate.sleep();}return 0;
};

2.2编译

配置CMakeLists.txt编译规则:
设置需要编译的代码和生成的可执行文件;
设置链接库;
将下面代码拷贝到指定位置:

add_executable(turtle_tf_broadcaster src/turtle_tf_broadcaster.cpp)
target_link_libraries(turtle_tf_broadcaster ${catkin_LIBRARIES})add_executable(turtle_tf_listener src/turtle_tf_listener.cpp)
target_link_libraries(turtle_tf_listener ${catkin_LIBRARIES})

在这里插入图片描述
编译

cd ~/catkin_ws
catkin_make

2.3运行

roscore
rosrun turtlesim turtlesim_node

下面直接在命令行传入参数。
第1个参数:我们在turtle_tf_broadcaster.cpp定义节点时使用了"my_tf_broadcaster"的名字,我们使用__name:=传入新的名字取代"my_tf_broadcaster",这样避免名字重复(因为ROS中节点名字不能重复),这样就可以重复跑程序了。
第2个参数是turtle名称 turtle1 和 turtle2。

rosrun learning_tf turtle_tf_broadcaster __name:=turtle1_tf_broadcaster /turtle1

在这里插入图片描述

rosrun learning_tf turtle_tf_broadcaster __name:=turtle2_tf_broadcaster /turtle2

在这里插入图片描述

rosrun learning_tf turtle_tf_listener

上面完成后就会有一个海龟生成并跑向中间的第1只海龟。
在这里插入图片描述
用键盘控制海龟,同样可以让第2只海龟追着我们跑。

rosrun turtlesim turtle_teleop_key

在这里插入图片描述
参考视屏:古月居ROS入门21讲
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/351392.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

视频裁剪

从一段较长的视频中裁剪某一段(时间自己定)&#xff0c;如图 结合api com.github.yangjie10930:EpMedia:v1.0.1 视频裁剪框架 可以实现可视化视频裁剪。 说不多说上源码&#xff1a;https://gitee.com/kbld/video-edit 视频压缩的可以看看https://blog.csdn.net/qq_35198779…

Android 视频裁剪自定义 View

PlaySeekbar - Github Android 视频裁剪自定义 View - 裁减播放的视频&#xff08;本地视频&#xff09; 功能需求与预览 有个视频裁剪功能&#xff0c;需要自定义 View 具体如下 裁剪选择区域模块&#xff0c;可以自定义最少裁剪时间 当选择低于最少裁剪时间时&#xff0c;…

海外网红营销必备:品牌与海外红人合作的谈判技巧指南

随着社交媒体的飞速发展&#xff0c;海外网红已经成为品牌营销的热门选择。与知名红人合作&#xff0c;可以有效地扩大品牌影响力、提升产品认知度&#xff0c;并吸引目标受众。然而&#xff0c;与红人的谈判过程常常充满挑战&#xff0c;需要品牌营销人员具备一定的技巧和策略…

linux裁剪视频教程,适用于Linux桌面的超简单实用的视频裁剪应用

原标题&#xff1a;适用于Linux桌面的超简单实用的视频裁剪应用 来自&#xff1a;Linux迷 https://www.linuxmi.com/video-trimmer-linux.html 您可能已经知道一些适用于Linux 的最佳免费视频编辑器&#xff0c;但并不是每个人都需要那些提供的所有功能。 有时&#xff0c;您只…

Opencv 把视频裁剪成指定帧率的图像集

目的&#xff1a; 视频 FPS30&#xff0c;需要把视频裁剪成 FPS3 的图像集&#xff0c;即两分钟的视频裁剪出360张图像。 FPS&#xff1a; 每秒传输帧数(Frames Per Second)FPS 也可以理解为我们常说的“刷新率&#xff08;单位为Hz&#xff09;”&#xff0c;例如我们常在游戏…

android中slider控件,VideoRangeSlider视频裁剪控件

最近项目中需要用到裁剪视频操作的控件,本着不要重复造轮子的精神,在Github上找了个遍都没有发现有可用的。那就只好自己动手做了。目前已经开源到Github,欢迎Start,issue。 基本用法引入依赖repositories {maven { url "https://jitpack.io"} } dependencies {c…

android mp4 画面裁剪,说说Android的视频裁剪(三)

有一段时间没有更新博客了。 最近有人在我的博客中跟我说mp4Parse不能裁剪mov视频&#xff0c;问我有没有其他的解决方案&#xff0c;所以这次我更新了一下自己的项目&#xff1a;Android-Video-Trimmer&#xff0c;使用ffmpeg来实现视频的裁剪。 FFmpeg是为大家所熟悉的处理视…

android mp4 画面裁剪,说说Android的视频裁剪(二)

有关视频裁剪我在前面一篇博客中只是做了简单的说明,主要涉及到的知识准备在这篇博客中拿出来说一下。有兴趣的可以fork我的视频裁剪的项目源码,一起学习进步。 Github:https://github.com/iknow4/Android-Video-Trimmer 视频裁剪页如下图所示: 图上面的视频播放用是VideoV…

FFmpeg 视频裁剪

FFmpeg 视频裁剪 一、下载 FFmpeg二、安装 FFmpeg三、裁剪在bin文件夹 下找到ffmpeg文件找到要裁剪的视频文件&#xff0c;这里是input.mp4 三、视频录制软件 一、下载 FFmpeg FFmpeg Windows 可执行文件官方下载地址&#xff1a; FFmpeg Windows Builds 这里提供了多个版本…

如何裁剪视频?这两个简单方法你们还不快来学

不知道大家会不会遇到这种情况&#xff0c;比如有的时候拍完视频&#xff0c;感觉视频有些画面边缘出现瑕疵&#xff0c;想把它裁剪掉&#xff0c;但是不知道视频怎么裁剪画面大小&#xff1f;其实这个很简单&#xff0c;我们只需要使用一些工具就可以轻松实现裁剪画面大小的操…

leetcode701. 二叉搜索树中的插入操作(java)

二叉搜索树中的插入操作 leetcode701. 二叉搜索树中的插入操作题目描述 递归解题解题思路代码演示 二叉树专题 leetcode701. 二叉搜索树中的插入操作 原题链接&#xff1a; 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problem…

级差制系统开发模式逻辑详解

在所有的直销模式中&#xff0c;级差制其实是最公平的一种&#xff0c;因为它的主旨就是多劳多得&#xff0c;给每个人的机会都是平等的&#xff0c;尤其是对于那些能力强肯努力的直销员来说&#xff0c;完全可以拿到自己应得的报酬&#xff0c;而且这个报酬相当可观。 级差制模…

魔兽跟随字符串

魔兽跟随字符串 打11跟随&#xff0c;打22自动跟随 !TwvuRnUrq4)lck4axcw6sOCpKcU5KBYHJTRxL6lVSwBKwzVxL1AwTkj(OiAFUW13lfk0xk9HwOV02hUFonT9(x0zgjzRCxmCpCScXmZo7mFZS7md3LhWzl5Sy8di1f2uvMKZgDrWGZg6Zzj6mlt9sjFORhNz1rxln5kDgW7(4UhYz5Y0KXAvMLZ(0rbbJoNZUDussU0Yh2fmRk…

Weka的下载与安装

一、安装Weka 1、进入官网 https://www.cs.waikato.ac.nz/ml/weka/ 。 2、在Getting started中点击Download&#xff0c;再选择合适的版本下载即可。我选择的是Windows 64bit without JVM的版本。 3、安装Weka。 4、进入安装目录&#xff0c;将data文件夹复制粘贴至方便使用的…

wmi_exporter+Prometheus+Grafana

wmi_exporterPrometheusGrafana 原文地址&#xff1a; CSDN&#xff1a;NRlovestudy&#xff1a;Windows 下搭建 wmi_exporterPrometheusGrafana 服务器性能监控平台 wmi_exporter&#xff08;Windows&#xff09; / node_exporter &#xff08;Linux&#xff09; 是用来做数据…

WEKA数据集

WEKA数据集&#xff1a; WEKA所处理的数据集是一个.arff&#xff08;attribute relation file&#xff09;为后缀名的二维表。这是一种ASCII文本文件。以%开始的行是注释。 表中具体的内容&#xff1a; relation文件名称 attribute属性名和具体的属性值 data后为每个实例对应的…

wamp安装composer

一、下载 打开链接&#xff1a;https://docs.phpcomposer.com/00-intro.html 在导航路径里找到“使用安装程序”&#xff1a; 点击入门后就回出现如下界面&#xff1a;找到“使用安装程序”并单击 点击即可下载 二、安装 1、下载后直接双击安装&#xff0c;直接Next。 2、通…

WeKa 数据集

今天找weka官方数据集差点被自己蠢哭&#xff0c;写个博客纪念一下。最近在学习weka的基本操作&#xff0c;来训练自己的数据进行分类等操作&#xff0c;网上找了一个视频Weka讲解视频 YouTobe视频 “https://www.youtube.com/watch?vLcHw2ph6bss&listPLm4W7_iX_v4NqPUjc…

wago edz 下载_用电子枪制造的WeakAuras Wago.io桥

wago edz 下载 弱光环伴侣 (WeakAuras-Companion) The bridge between WeakAuras and wago.io. WeakAuras和wago.io之间的桥梁。 View Demo 查看演示 Download Source 下载源 安装 (Installation) Require WeakAuras version > 2.11-beta2 Install last executable from ht…

astar插件下载 就行_怀旧服插件:简约清爽界面推荐,MangUI、NDui、ShadowUF安装与设置...

前言 最近由于工作原因,外加上犯懒,有一段时间没关注魔兽上的事儿,平时下班偶尔打打本野外逛一逛啥的 前一阵国服知名盗贼玩家uc卖插件的事儿闹得沸沸扬扬,6月9日,uc发了道歉的视频,才引起了我的兴趣,先就事论事来说,不管他这个插件原创度有多少,拿出来卖钱也是不合适…