当前位置: 首页 > news >正文

ROS 学习应用篇(八)ROS中的坐标变换管理之tf广播与监听的编程实现


偶吼吼胜利在望,冲冲冲

老规矩新建功能包

工作空间目录下/src下开启终端输入

catkin_create_pkg learning_tf roscpp rospy tf turtlesim

如何实现tf广播

引入库

 c++                                                                                python  

pose是订阅的消息类型,之前在的订阅那一节我们已经介绍过了。

初始化节点

  c++                                                                                python  

这里python没有设定主函数,直接就在主函数定义段内嵌套了节点的定义,可以发现c++觉python这时候定义的节点名称是不一样的,C++定义的节点名叫my_tf_boradcaster,PYthon的叫 turtle_tf_boradcaster。

海龟位姿话题的订阅

 c++                                                                                python   

话题名的获取

话题的订阅就是需要使用到回调函数的,特别的是这一次的目的是输出向量额坐标系变换时候的平移矩阵和旋转矩阵,所以我们需要定义两条消息。那么就是turtle1和turtle2两个话题消息,我们可以发现在python中利用占位符以及turtlename=rospy.get_param('~turtle'),通过获取参数的方式就可以得到这两个海龟的话题名,而c++则需要turtle_name = argv[1];的方式获取送入的参数名字在加上/pose做区分,二者所检索的话题名都是turtlei/pose。

命名空间

python这句代码的意思是获取turtle的私有命名空间,如果没有~就是全局命名空间。

命名空间的学习见以下链接:

【精选】ROS中节点、话题、参数重命名以及全局、相对、私有命名空间(示例+代码)_ros2 节点 全局变量_肥肥胖胖是太阳的博客-CSDN博客

 argv[1]

对照着看会发现argc是输入参数的个数,argv是具体的输入的参数,数数方式吃从后向前数。

回调函数

有订阅就要有回调函数,这才是重中之重。

创建TF广播器(TransformBroadcaster)

 c++                                                                                python  

数据广播

 c++                                                                                python   

在数据广播出去之前,我们需要初始化数据,定义数据

初始化tf数据

 c++                                                                                python   

这一部分 c++的detOrigin是像transform中传入平移矩阵T,q是由平移矩阵计算出的欧拉角向量,setRotation则是像transform中传入欧拉向量角,此时就得到了旋转平移矩阵transform。

python的就更简单, 这一句的意思就是计算旋转平移矩阵transform。

广播数据

观察上面的代码可以发现两者都有一个time.now()这是输出实时时间用以区分。

 循环等待回调函数

在回调函数需要的消息进来之前,需要执行等待代码

 c++                                                                                python   

监听器的实现

在前面我们已经将两只海龟相对于世界坐标系的位置广播出去了,下面我们需要监听到二者的位置,在计算二者间的旋转平移矩阵。

引入库

这里面roslib是用来导入功能包的,咱也不知道为啥监听器的实现python代码需要多一个链接功能包的语句,所以这暂时是一个遗留问题。

/spawn是创建小海龟客户端的服务类型,这一次python用到的包真的好多。

初始化ROS节点

创建客户端

这一部分就是客户端的代码,生成第二只小海龟

等待/spawn服务指令

创建客户端

这里可以发现srv的数据并没有传入,这因为srv是自带封装好的初始数据的,之前在学习客户端建立的时候,我们初始化了srv并送入了一写数据,这里不送入使用自带的数据也不会报错,不同的是python中是需要指定起始点位置和名称的。

创建发布器

我们在监听到消息后需要发布出去,所以需要先在监听器外层建立一个发布器。

创建监听器

 

延时等待

准备工作做好之后就开始延时等待。

循环

数据监听

这句代码的意思是如果节点开启才执行while循环里的代码。

相较于python监听transform数据来说,c++多了一个等待3秒的代码,catch和except后面都是报错输出。

数据计算与发布

延时循环

 

主函数调用

由于python是直接在主循环里面写的,所以就不用指定主函数了。

CMakeList.txt

编译

工作空间开启终端输入

catkin_make

roscore

rosrun turtlesim turtlesim_node

rosrun learning_tf turtle_tf_broadcaster __name:=turtle1_tf_broadcaster /turtle1

rosrun learning_tf turtle_tf_broadcaster __name:=turtle2_tf_broadcaster /turtle2

% 这两行代码中,__name是更改节点的名字广播器程序节点的名字在C++中是my_tf_boradcaster,PYthon的叫 turtle_tf_boradcaster。但是如果我们要广播两次的话,就需要对节点的名字进行更改避免冲突,这其实就像是函数调用一样,在设定函数的时候的参数值在使用的使用我们要输入不同的名字以避免冲突。

如果不改名字的化就会提示节点名字冲突。后面的turtle1是需要的输入变量。

rosrun learning_tf turtle_tf_listener % 前几句一直没有反应,只有到这一句开始才会建立海龟,开始追随,不停地发布turtle1的位置给turtle2,然后turtle2再运动,这就是跟随的基本原理,我们知道发布是在监听代码中进行的,发布的消息名称一直是turtle2,也就是给turtle2发运动位置消息。也就是说这个消息是直接发个小海龟2的!。换个思路我们可以turtle1的位置发布给turtle2也是可以实现同样的效果的。额,他好像就是这么实现的哈。把1的位置广播出去然后发布给2.

不对,是广播的两只乌龟的位置,然后给turtle2发布的指令是它往1走的方向。

rosrun turtlesim turtle_teleop_key  % 这个是键盘控制按键,2会跟着1走。

至于python代码的执行如下两行代码需要变更成如下的语句

rosrun learning_tf turtle_tf_broadcaster.py __name:=turtle1_tf_broadcaster _turtle:=turtle1

rosrun learning_tf turtle_tf_broadcaster.py __name:=turtle2_tf_broadcaster _turtle:=turtle2

相关文章:

ROS 学习应用篇(八)ROS中的坐标变换管理之tf广播与监听的编程实现

偶吼吼胜利在望,冲冲冲 老规矩新建功能包 工作空间目录下/src下开启终端输入 catkin_create_pkg learning_tf roscpp rospy tf turtlesim 如何实现tf广播 引入库 c python …...

计算机算法分析与设计(23)---二分搜索算法(C++)

文章目录 1. 算法介绍2. 代码编写 1. 算法介绍 1. 二分搜索(英语:binary search),也称折半搜索(英语:half-interval search)、对数搜索(英语:logarithmic search&#xf…...

前置语音群呼与语音机器人群呼哪个更好

最近通过观察自己接到的营销电话,通过语音机器人外呼的量应该有所下降。同时和客户交流获取到的信息,也是和这个情况类似,很多AI机器人群呼的量转向了OKCC前置语音群呼。询问原因,说是前置语音群呼转化更快,AI机器人群…...

『Element Plus の 百科大全』

Element Plus 官网 点击跳转...

P3879 [TJOI2010] 阅读理解- 字典树

题面 分析 将所有单词存入字典树&#xff0c;重点值怎么判断在哪一行出现过&#xff0c;对于字典树查询的判断字符串是否存在的数组可以开成二维&#xff0c;也就是在查询到某个字符串存在后&#xff0c;再通过循环判断每一层是否存在。 代码 #include <bits/stdc.h>…...

upgrade k8s (by quqi99)

作者&#xff1a;张华 发表于&#xff1a;2023-11-17 版权声明&#xff1a;可以任意转载&#xff0c;转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明(http://blog.csdn.net/quqi99) 本文只是从网上搜索一些升级k8s的理论学习&#xff0c;下面的步骤未实际测…...

CronExpression

CronTrigger配置格式: 格式: [秒] [分] [小时] [日] [月] [周] [年]序号 说明 是否必填 允许填写的值 允许的通配符 1 秒 是 0-59 , - * / 2 分 是 0-59 , - * / 3 小时 是 0-23 , - * / 4 日 是 1-31 , - * ? / L W 5 月 是 1-12 or JA…...

释放机器人潜力,INDEMIND深耕底层技术

市场转暖&#xff0c;但攘外需要同时安内。 市场降温之后&#xff0c;正迎来拐点 疫情之后&#xff0c;经济逐渐下行&#xff0c;服务机器人的“好日子”也随之结束&#xff0c;整个行业都在动荡中经历渡劫。根据TE智库报告显示&#xff0c;从2022年开始&#xff0c;我国服务…...

【ES6标准入门】JavaScript中的模块Module语法的使用细节:export命令和imprt命令详细使用,超级详细!!!

&#x1f601; 作者简介&#xff1a;一名大四的学生&#xff0c;致力学习前端开发技术 ⭐️个人主页&#xff1a;夜宵饽饽的主页 ❔ 系列专栏&#xff1a;JavaScript进阶指南 &#x1f450;学习格言&#xff1a;成功不是终点&#xff0c;失败也并非末日&#xff0c;最重要的是继…...

流量2----2

2...

人工智能发展前景

随着人工智能的快速发展&#xff0c;这个行业对人才的需求也在不断增长。越来越多的有志之士开始关注人工智能&#xff0c;希望通过自学获得相关技能&#xff0c;进而在人工智能领域找到心仪的职业。本文将探讨人工智能职业发展的前景&#xff0c;并为大家提供自学人工智能的途…...

编写程序,要求输入x的值,输出y的值。分别用(1)不嵌套的if语句(2)嵌套的if语句(3)if-else语句(4)switch语句。

编写程序&#xff0c;要求输入x的值&#xff0c;输出y的值。分别用&#xff08;1&#xff09;不嵌套的if语句&#xff08;2&#xff09;嵌套的if语句&#xff08;3&#xff09;if-else语句&#xff08;4&#xff09;switch语句。 选择结构是编程语言中常用的一种控制结构&…...

AcWing 4520:质数 ← BFS

【题目来源】https://www.acwing.com/problem/content/4523/【题目描述】 给定一个正整数 X&#xff0c;请你在 X 后面添加若干位数字&#xff08;至少添加一位数字&#xff1b;添加的数不能有前导0&#xff09;&#xff0c;使得结果为质数&#xff0c;在这个前提下所得的结果应…...

00、计算机视觉入门与调优简介

写在前面 每天更新1篇文章&#xff0c;共更新100篇以上 相关代码会放在gitee上 中间会按进度和反馈安排视频讲解 预计2023-11-11开始推送文章&#xff0c;持续3个月左右 专栏简介 本专栏带你从头开始入门计算机视觉。 内容会比之前写的文章更专业更全面&#xff0c;并且你…...

.L0CK3D来袭:如何保护您的数据免受致命攻击

尊敬的读者&#xff1a; 网络犯罪的威胁日益增长&#xff0c;其中.L0CK3D勒索病毒是一种极具挑战性的数字威胁。为了助您应对这一风险&#xff0c;本文将深入探讨.L0CK3D病毒的狡猾手法、毁灭性影响&#xff0c;提供详实的数据恢复方法&#xff0c;同时为您提供极具实战性的预…...

多媒体ffmpeg学习教程

多媒体ffmpeg 目前比较流行的音视频文件为:MP4 flv m3u8 ffmpeg ffmpeg ffplay ffprobe ffserverffmpeg -i INPUT -vf "split [main][tmp]; [tmp] cropiw:ih/2:0:0, vflip [flip];[main][flip] overlay0:H/2" OUTPUTffmpeg -i 2022.mp4 -vcodec mpeg4 -b:…...

SELinux零知识学习十五、SELinux策略语言之客体类别和许可(9)

接前一篇文章&#xff1a;SELinux零知识学习十四、SELinux策略语言之客体类别和许可&#xff08;8&#xff09; 一、SELinux策略语言之客体类别和许可 4. 客体类别许可实例 &#xff08;3&#xff09;进程客体类别许可 与文件许可不同&#xff0c;许多进程许可没有直接对应到…...

OpenSign:安全可靠的电子签名解决方案 | 开源日报 No.76

microsoft/Web-Dev-For-Beginners Stars: 71.5k License: MIT 这个开源项目是一个为期 12 周的全面课程&#xff0c;由微软云倡导者团队提供。它旨在帮助初学者掌握 JavaScript、CSS 和 HTML 的基础知识。每一节都包括预习和复习测验、详细的书面指南、解决方案、作业等内容。…...

Linux | 进程间通信

目录 前言 一、进程间通信的基本概念 二、管道 1、管道的基本概念 2、匿名管道 &#xff08;1&#xff09;原理 &#xff08;2&#xff09;测试代码 &#xff08;3&#xff09;读写控制相关问题 a、读端关闭 b、写端关闭 c、读快写慢 d、读慢些快 &#xff08;4&a…...

Vue.js正式环境中配置多个请求的URL

在Vue.js中&#xff0c;你可以在正式环境中配置多个请求的URL&#xff0c;通常使用一些配置文件或者环境变量的方式。下面是一种常见的配置方式&#xff1a; 1. 创建配置文件&#xff1a;在项目的根目录下&#xff0c;创建一个配置文件&#xff0c;比如可以是config.js&#x…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式&#xff0c;可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...