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…...
前置语音群呼与语音机器人群呼哪个更好
最近通过观察自己接到的营销电话,通过语音机器人外呼的量应该有所下降。同时和客户交流获取到的信息,也是和这个情况类似,很多AI机器人群呼的量转向了OKCC前置语音群呼。询问原因,说是前置语音群呼转化更快,AI机器人群…...
『Element Plus の 百科大全』
Element Plus 官网 点击跳转...
P3879 [TJOI2010] 阅读理解- 字典树
题面 分析 将所有单词存入字典树,重点值怎么判断在哪一行出现过,对于字典树查询的判断字符串是否存在的数组可以开成二维,也就是在查询到某个字符串存在后,再通过循环判断每一层是否存在。 代码 #include <bits/stdc.h>…...
upgrade k8s (by quqi99)
作者:张华 发表于:2023-11-17 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明(http://blog.csdn.net/quqi99) 本文只是从网上搜索一些升级k8s的理论学习,下面的步骤未实际测…...
CronExpression
CronTrigger配置格式: 格式: [秒] [分] [小时] [日] [月] [周] [年]序号 说明 是否必填 允许填写的值 允许的通配符 1 秒 是 0-59 , - * / 2 分 是 0-59 , - * / 3 小时 是 0-23 , - * / 4 日 是 1-31 , - * ? / L W 5 月 是 1-12 or JA…...
释放机器人潜力,INDEMIND深耕底层技术
市场转暖,但攘外需要同时安内。 市场降温之后,正迎来拐点 疫情之后,经济逐渐下行,服务机器人的“好日子”也随之结束,整个行业都在动荡中经历渡劫。根据TE智库报告显示,从2022年开始,我国服务…...
【ES6标准入门】JavaScript中的模块Module语法的使用细节:export命令和imprt命令详细使用,超级详细!!!
😁 作者简介:一名大四的学生,致力学习前端开发技术 ⭐️个人主页:夜宵饽饽的主页 ❔ 系列专栏:JavaScript进阶指南 👐学习格言:成功不是终点,失败也并非末日,最重要的是继…...
流量2----2
2...
人工智能发展前景
随着人工智能的快速发展,这个行业对人才的需求也在不断增长。越来越多的有志之士开始关注人工智能,希望通过自学获得相关技能,进而在人工智能领域找到心仪的职业。本文将探讨人工智能职业发展的前景,并为大家提供自学人工智能的途…...
编写程序,要求输入x的值,输出y的值。分别用(1)不嵌套的if语句(2)嵌套的if语句(3)if-else语句(4)switch语句。
编写程序,要求输入x的值,输出y的值。分别用(1)不嵌套的if语句(2)嵌套的if语句(3)if-else语句(4)switch语句。 选择结构是编程语言中常用的一种控制结构&…...
AcWing 4520:质数 ← BFS
【题目来源】https://www.acwing.com/problem/content/4523/【题目描述】 给定一个正整数 X,请你在 X 后面添加若干位数字(至少添加一位数字;添加的数不能有前导0),使得结果为质数,在这个前提下所得的结果应…...
00、计算机视觉入门与调优简介
写在前面 每天更新1篇文章,共更新100篇以上 相关代码会放在gitee上 中间会按进度和反馈安排视频讲解 预计2023-11-11开始推送文章,持续3个月左右 专栏简介 本专栏带你从头开始入门计算机视觉。 内容会比之前写的文章更专业更全面,并且你…...
.L0CK3D来袭:如何保护您的数据免受致命攻击
尊敬的读者: 网络犯罪的威胁日益增长,其中.L0CK3D勒索病毒是一种极具挑战性的数字威胁。为了助您应对这一风险,本文将深入探讨.L0CK3D病毒的狡猾手法、毁灭性影响,提供详实的数据恢复方法,同时为您提供极具实战性的预…...
多媒体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)
接前一篇文章:SELinux零知识学习十四、SELinux策略语言之客体类别和许可(8) 一、SELinux策略语言之客体类别和许可 4. 客体类别许可实例 (3)进程客体类别许可 与文件许可不同,许多进程许可没有直接对应到…...
OpenSign:安全可靠的电子签名解决方案 | 开源日报 No.76
microsoft/Web-Dev-For-Beginners Stars: 71.5k License: MIT 这个开源项目是一个为期 12 周的全面课程,由微软云倡导者团队提供。它旨在帮助初学者掌握 JavaScript、CSS 和 HTML 的基础知识。每一节都包括预习和复习测验、详细的书面指南、解决方案、作业等内容。…...
Linux | 进程间通信
目录 前言 一、进程间通信的基本概念 二、管道 1、管道的基本概念 2、匿名管道 (1)原理 (2)测试代码 (3)读写控制相关问题 a、读端关闭 b、写端关闭 c、读快写慢 d、读慢些快 (4&a…...
Vue.js正式环境中配置多个请求的URL
在Vue.js中,你可以在正式环境中配置多个请求的URL,通常使用一些配置文件或者环境变量的方式。下面是一种常见的配置方式: 1. 创建配置文件:在项目的根目录下,创建一个配置文件,比如可以是config.js&#x…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
