ROS|乌龟TF变换案例分析

news/2024/5/7 5:21:56/文章来源:https://blog.csdn.net/m0_38052500/article/details/127223158

1. 相关源码内容

1.1 turtle_df_demo.launch

<launch><!-- Turtlesim Node--><node pkg="turtlesim" type="turtlesim_node" name="sim"/><node pkg="turtlesim" type="turtle_teleop_key" name="teleop" output="screen"/><!-- Axes --><param name="scale_linear" value="2" type="double"/><param name="scale_angular" value="2" type="double"/><node name="turtle1_tf_broadcaster" pkg="turtle_tf" type="turtle_tf_broadcaster.py" respawn="false" output="screen" ><param name="turtle" type="string" value="turtle1" /></node><node name="turtle2_tf_broadcaster" pkg="turtle_tf" type="turtle_tf_broadcaster.py" respawn="false" output="screen" ><param name="turtle" type="string" value="turtle2" /></node><node name="turtle_pointer" pkg="turtle_tf" type="turtle_tf_listener.py" respawn="false" output="screen" ></node></launch>
  • turtlesim的功能包中的turtlesim_node,节点名称为sim,以往调用该功能包时,turtlesim_node节点名称通常为turtlesim;
  • turtle_teleop_key可执行文件,之前也有了解过;
  • 定义全局参数,角速度和线速度;这里注意它的type为double,其他的参数类型还有int、string。
  • 执行turtle_tf功能包的发布文件,同时,该节点配备了一个string类型的参数,表示乌龟的名字turtle1/2。
  • 执行turtle_tf功能包的订阅文件

1.2 turtle_tf_broadcaster.py

import rospy
import tf
import turtlesim.msgdef handle_turtle_pose(msg, turtlename):br = tf.TransformBroadcaster()br.sendTransform((msg.x, msg.y, 0),tf.transformations.quaternion_from_euler(0, 0, msg.theta),rospy.Time.now(),turtlename,"world")if __name__ == '__main__':rospy.init_node('tf_turtle')turtlename = rospy.get_param('~turtle') # 出现了!私有名称。rospy.Subscriber('/%s/pose' % turtlename,turtlesim.msg.Pose,handle_turtle_pose,turtlename)rospy.spin()
  • c++中的头文件在python中就成了库;
  • 与roscpp不同的是,① rospy中如果要注册一个订阅者、发布者,并不需要提前创建话柄(ros::NodeHandle n);② roscpp中注册的参数是:话题名称、消息队列(缓冲)、回调函数;rospy中注册的参数是话题名称、消息类型、回调函数、某个参数服务器中的参数。__init__(self, name, data_class, callback=None, callback_args=None, queue_size=None, buff_size=DEFAULT_BUFF_SIZE, tcp_nodelay=False)
  • 回调函数中的sendTransform函数def sendTransform(self, translation, rotation, time, child, parent),平移参数(x, y, z)、旋转参数,欧拉四元数(x, y, z, w)、转换时间、子坐标系的名称、父坐标系的名称。

1.3 turtle_tf_listener.py

import rospyimport math
import tf
import geometry_msgs.msg
import turtlesim.srvif __name__ == '__main__':# 该函数本质上属于服务通信模型中的监听者和通话模型中的发布者。rospy.init_node('tf_turtle')listener = tf.TransformListener()# 阻塞,直到服务可用。 如果您的程序依赖于已在运行的服务,请在初始化代码中使用它rospy.wait_for_service('spawn')# 创建一个服务信息,等待被调用。spawner = rospy.ServiceProxy('spawn', turtlesim.srv.Spawn)# 客户端的服务信息需要的参数。spawner(4, 2, 0, 'turtle2')# 创建发布者,发布的消息是turtle2的移动指令!# queue_size 用于从不同线程异步发布消息的队列大小。 大小为零意味着无限队列,这可能很危险。 当未使用关键字或传递 None 时,所有发布将同步发生并打印警告消息。turtle_vel = rospy.Publisher('turtle2/cmd_vel', geometry_msgs.msg.Twist, queue_size=1)rate = rospy.Rate(10.0)while not rospy.is_shutdown():try:# 查询两个坐标系之间的相对转换关系,该关系是由平移矩阵和旋转矩阵构成。(trans, rot) = listener.lookupTransform('/turtle2', '/turtle1', rospy.Time())except (tf.LookupException, tf.ConnectivityException, tf.ExtrapolationException):continue# 根据平移矩阵计算需要的角速度和线速度。其实这里就可以看出,turtle1如果只是原地旋转,turtle2线速度依旧为0,不会触发运动。angular = 4 * math.atan2(trans[1], trans[0])linear = 0.5 * math.sqrt(trans[0] ** 2 + trans[1] ** 2)# 为消息装载数据。msg = geometry_msgs.msg.Twist()msg.linear.x = linear # TODO: 为什么只赋予给x轴线速度,该线速度表示前行,y则表示乌龟横向移动。msg.angular.z = angularturtle_vel.publish(msg)rate.sleep()
  • rospy.wait_for_service('spawn')之前未见过的语法。表示,阻塞,直到服务可用。 如果您的程序依赖于已在运行的服务,请在初始化代码中使用它。
  • geometry_msgs.Twist消息的数据结构为:
    roser@ubuntu:/opt/ros/melodic/lib/turtle_tf$ rosmsg show geometry_msgs/Twist
    geometry_msgs/Vector3 linearfloat64 xfloat64 yfloat64 z
    geometry_msgs/Vector3 angularfloat64 xfloat64 yfloat64 z
    
  • msg.linear.x = linear # TODO: 为什么只赋予给x轴线速度,该线速度表示前行,y则表示乌龟横向移动。如图所示。
    在这里插入图片描述
    修改turtle_tf_listener.py的相关代码:
    locate listener.py
    cd /opt/ros/melodic/lib/turtle_tf
    sudo chmod 777 turtle_tf_listener.py
    rosed turtle_tf  turtle_tf_listener.py
    
    文件修改后需要重新roslaunch启动文件。
  • 其他的看代码中的注释。

2. 查看参数、节点、话题以及服务

echo "node---------------" &  rosnode list &  wait & echo "params--------------" &  rosparam list & wait & echo "topics----------" &  rostopic list

2.1 节点

roser@ubuntu:~/Documents/catkin_ws$ rosnode list
/rosout
/sim
/teleop
/turtle1_tf_broadcaster
/turtle2_tf_broadcaster
/turtle_pointer
  • rosout是Master标准输出节点;
  • sim是turtlesim_node可执行文件(节点)的名称;
  • 其他节点名称见turtle_tf_demo.launch文件的内容。

2.2 参数

roser@ubuntu:~/Documents/catkin_ws$ rosparam list
// 基础信息
/rosdistro  
/roslaunch/uris/host_ubuntu__39761
/rosversion
/run_id
//角速度和线速度,应该是每个乌龟实例都会应用这两个设置。
/scale_angular
/scale_linear
// 模拟背景
/sim/background_b
/sim/background_g
/sim/background_r
// 两只乌龟的TF广播参数
/turtle1_tf_broadcaster/turtle
/turtle2_tf_broadcaster/turtle
  • /rosdistro——‘melodic’;
  • /roslaunch/uris/host_ubuntu__39761 —— http://ubuntu:39761/
  • /rosversion —— ‘1.14.13’
  • /run_id —— 35a5f89e-477f-11ed-a88e-000c2909fef3
  • /scale_angular —— 2.0
  • /scale_linear —— 2.0
  • /sim/background_b —— 255
  • /sim/background_g —— 86
  • /sim/background_r —— 69
  • /turtle1_tf_broadcaster/turtle —— turtle1
  • /turtle2_tf_broadcaster/turtle —— turtle2

2.3 话题

roser@ubuntu:~/Documents/catkin_ws$ rostopic list -vPublished topics:* /turtle1/color_sensor [turtlesim/Color] 1 publisher* /turtle2/color_sensor [turtlesim/Color] 1 publisher* /rosout [rosgraph_msgs/Log] 5 publishers* /turtle2/pose [turtlesim/Pose] 1 publisher* /rosout_agg [rosgraph_msgs/Log] 1 publisher* /tf [tf2_msgs/TFMessage] 2 publishers* /turtle2/cmd_vel [geometry_msgs/Twist] 1 publisher* /turtle1/cmd_vel [geometry_msgs/Twist] 1 publisher* /turtle1/pose [turtlesim/Pose] 1 publisherSubscribed topics:* /turtle2/pose [turtlesim/Pose] 1 subscriber // 来源于 turtle_tf_broadcaster 订阅pose信息,* /rosout [rosgraph_msgs/Log] 1 subscriber  // 不解释* /tf [tf2_msgs/TFMessage] 1 subscriber* /tf_static [tf2_msgs/TFMessage] 1 subscriber* /turtle2/cmd_vel [geometry_msgs/Twist] 1 subscriber* /turtle1/cmd_vel [geometry_msgs/Twist] 1 subscriber* /turtle1/pose [turtlesim/Pose] 1 subscriber // 来源于 turtle_tf_broadcaster 订阅pose信息,
  • 标准输出需要的两个话题:/rosout和/rosout_agg;
  • 消息turtlesim/Pose,在二维中该pose信息包含三个值
    roser@ubuntu:/opt/ros/melodic/lib/turtle_tf$ rosmsg show turtlesim/Pose
    float32 x
    float32 y
    float32 theta
    float32 linear_velocity
    float32 angular_velocity
    
  • geometry_msgs/Twist的数据结构为:
    geometry_msgs/Vector3 linearfloat64 xfloat64 yfloat64 z
    geometry_msgs/Vector3 angularfloat64 xfloat64 yfloat64 z
    
  • tf2_msgs/TFMessage 的数据结构为:
    geometry_msgs/TransformStamped[] transformsstd_msgs/Header headeruint32 seqtime stampstring frame_idstring child_frame_idgeometry_msgs/Transform transformgeometry_msgs/Vector3 translationfloat64 xfloat64 yfloat64 zgeometry_msgs/Quaternion rotationfloat64 xfloat64 yfloat64 zfloat64 w
    
  • rosgraph_msgs/Log 的数据结构为:
    byte DEBUG=1
    byte INFO=2
    byte WARN=4
    byte ERROR=8
    byte FATAL=16
    std_msgs/Header headeruint32 seqtime stampstring frame_id
    byte level
    string name
    string msg
    string file
    string function
    uint32 line
    string[] topics
    
  • turtlesim/Color 的数据结构:
    uint8 r
    uint8 g
    uint8 b
    

2.4 服务

roser@ubuntu:~/Documents/catkin_ws$ rosservice list
/clear
/kill
/reset
/rosout/get_loggers
/rosout/set_logger_level
/sim/get_loggers
/sim/set_logger_level
/spawn
/teleop/get_loggers
/teleop/set_logger_level
/turtle1/set_pen
/turtle1/teleport_absolute
/turtle1/teleport_relative
/turtle1_tf_broadcaster/get_loggers
/turtle1_tf_broadcaster/set_logger_level
/turtle2/set_pen
/turtle2/teleport_absolute
/turtle2/teleport_relative
/turtle2_tf_broadcaster/get_loggers
/turtle2_tf_broadcaster/set_logger_level
/turtle_pointer/get_loggers
/turtle_pointer/set_logger_level
  • 这里服务的内容不过多介绍,通过rossrv show 和rosservice info可以查看内容。比如:
    roser@ubuntu:/opt/ros/melodic/lib/turtle_tf$ rosservice type /turtle2/teleport_absolute
    turtlesim/TeleportAbsolute
    roser@ubuntu:/opt/ros/melodic/lib/turtle_tf$ rossrv show turtlesim/TeleportAbsolute
    float32 x
    float32 y
    float32 theta
    ---
    roser@ubuntu:/opt/ros/melodic/lib/turtle_tf$ rosservice info /turtle2/teleport_absolute
    Node: /sim
    URI: rosrpc://ubuntu:39859
    Type: turtlesim/TeleportAbsolute
    Args: x y theta
    

3. TF坐标转换

  1. TF树结构是以世界坐标系作为根节点。rosrun tf view_frames
    在这里插入图片描述
  2. 查询两个坐标系之间的变换关系
    rosrun tf tf_echo
roser@ubuntu:~/Documents/catkin_ws$ rosrun tf tf_echo turtle1 turtle2
At time 1665302020.047
- Translation: [0.000, 0.000, 0.000]
- Rotation: in Quaternion [0.000, 0.000, 1.000, -0.006]in RPY (radian) [0.000, 0.000, -3.129]in RPY (degree) [0.000, 0.000, -179.305]roser@ubuntu:~/Documents/catkin_ws$ rosrun tf tf_echo turtle2 turtle1
At time 1665302083.392
- Translation: [0.000, 0.000, 0.000]
- Rotation: in Quaternion [0.000, 0.000, 1.000, 0.006]in RPY (radian) [0.000, -0.000, 3.129]in RPY (degree) [0.000, -0.000, 179.305]

4 补充

  1. 通过rosservice call /turtle2/teleport_absolute 1 1 0.2rosservice call /turtle2/teleport_absolute 10 10 0.2得知,乌龟案例中北京坐标系的原点在左下角。Y轴上,X轴右。

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何快速创建 GCDW 实例

GCDW 实例需云用户注册 GCDW 租户成功后&#xff0c; GBASE 云服务系统给租户分配独 立的实例&#xff0c; 同时创建租户的数据库根用户&#xff0c; 根用户即为该实例的超户&#xff0c; 拥有该实例 的最高权限&#xff0c; 租户可以通过根用户登录自己的实例管理数据&#xf…

Centos7 单机单网卡 RDO 安装 OpenStack

文档 OpenStack 涵盖太多知识量&#xff0c;总是找不到一个称心的官方文档 OpenStack Installation Guide for Red Hat Enterprise Linux and CentOS 这个是中文版的&#xff0c;但是 UPDATED: 2017-06-12 11:14 &#xff0c;很古老了&#xff01;基本概念和思想还是一样的 h…

SiO2/罗丹明B荧光杂化纳米微球/硅钼比核壳结构二氧化硅微球钼酸钙荧光粉的性能

SiO2/罗丹明B荧光杂化纳米微球性能制备&#xff1a; 在甲苯存在下的反相微乳液体系中,将γ-缩水甘油醚氧丙基三甲氧基硅烷(KH560)与罗丹明B进行预反应&#xff1b;再与正硅酸乙酯( TEOS)经原位溶胶-凝胶反应,制备SiO2/罗丹明B荧光杂化纳米微球.通过FTIR、UV-Vis、TEM、TG和光致…

聚焦 | 电力行业国产操作系统迎来大市场,麒麟信安积极承接发展新机遇

近年来&#xff0c;针对信息安全的外部环境不确定性加剧&#xff0c;作为关系到国计民生的电力行业&#xff0c;加速了自主创新的步伐。 从2009年起&#xff0c;电力行业就开始采用拥有自主核心技术的软硬件设施&#xff0c;到如今&#xff0c;整个电力行业已普遍完成了调度自动…

4.<tag-排序和TopK问题的三种典型解法>补充: 面试题 17.14. 最小K个数 + lt.215-数组中的第K个最大元素 dbc

面试题 17.14. 最小K个数 [案例需求] TopK问题很普遍, 解题套路也很简单, 无非就是排序, 运用最基础的排序(如Array.sort(nums))复杂度为nlogn, 或者使用堆, 复杂度为nlogk, 或者在快排的基础上进行减治 详细参见此文: 点我 [思路分析一, 直接排序] 对原数组从小到大排序后取出…

毕业设计 深度学习 机器视觉 车位识别车道线检测 - python opencv

0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过…

Airflow学习笔记

CSDN话题挑战赛第2期 参赛话题&#xff1a;学习笔记 项目中解决的问题 使用airflow调度hive脚本跑批任务 视频教程上整理知识点 学习视频&#xff1a;https://www.bilibili.com/video/BV1V7411K7Gy?p40&vd_sourceb002288652bae647c598ddf77f79a7b8 Airflow基本概念 Airfl…

【VUE2开发20221004】-day1.0

目录测试案例1&#xff1a;Vue常见指令&#xff1a;1、插值表达式2、v-bind指令v-bind指令注意事项简写v-bindv-bind属于单向绑定&#xff08;JS修改->HTML修改&#xff09;3、v-model指令v-model常用标签4、v-for指令5、v-on事件前端开发教程链接 vuejs官方教程 框架&…

刷题笔记-栈帧

例题1 阅读如下C代码片段&#xff08;其中Y表示代码指令地址&#xff09;&#xff1a; void overflow(char* pShellcode, int iLen) { Y1&#xff1a;char buffer[8]; Y2: memcpy(buffer, pShellcode, dwLen); Y3: „„ } Y4: int main() { Y5: „„ Y6: overflow("123…

多处理机的基本概念

本文内容是作者在进行计算机组成原理复习的时候&#xff0c;用王道的视频做笔记或者保存图的内容。后续如果看了其他书或者有其他理解会进行增加内容。 SISD&#xff08;单指令流数据流&#xff09; 特性&#xff1a;各指令序列只能并发、不能并行&#xff0c;每条指令处理一…

Prophet算法

Prophet简介 Prophet是FaceBook公司在2017年开源的一款时间序列建模工具。Prophet的方法是将时间序列看成是关于t的一个函数&#xff0c;用你和函数曲线的方法进行预测&#xff0c;所以这和传统的时间序列模型有本质上的区别&#xff0c;他更倾向于机器学习的建模方式。 Prop…

PO/PI

典型集成场景 PI总体架构

浅学设计模式(二)

目录&#xff1a; &#xff08;1&#xff09;工厂模式 简单工厂&#xff1a; 工厂方法模式&#xff1a; &#xff08;2&#xff09;抽象工厂模式 &#xff08;1&#xff09;工厂模式 简单工厂&#xff1a; 原来的方式使用new&#xff1a; 需要关心细节&#xff0c;如何创建对…

独家分享 圆梦阿里之后,我得到了这份SpringCloud Alibaba源码文档

Spring Cloud Alibaba为分布式应用开发提供了一站式解决方案。它包含开发分布式应用程序所需的所有组件&#xff0c;可以轻松地使用Spring Cloud开发应用程序。 使用Spring Cloud Alibaba&#xff0c;只需添加一些注解和少量配置&#xff0c;即可将Spring Cloud应用连接到Alib…

Spring 4 IOC 相关内容 4.2 bean 实例化 3 实例工厂实例化

Spring 【黑马程序员2022新版SSM框架教程_SpringSpringMVCMaven高级SpringBootMyBatisPlus企业实用开发技术】 4 IOC 相关内容 文章目录Spring4 IOC 相关内容4.2 bean 实例化4.2.5 实例工厂与FactoryBean4.2.6 bean 实例化小结4.2 bean 实例化 4.2.5 实例工厂与FactoryBean …

Python学习笔记(四)——字符串与文本处理2

目录 字符串函数大合集 两端删除函数strip() 删除空白字符 删除两端指定字符 右端删除函数rstrip() 左端删除函数 字符串对齐 返回指定宽度字符串center() 原字符串居中对齐、左对齐、右对齐 字符串开始或结束符判定startswith()、endswith() 内置函数eval()&#x…

web期末作业设计网页 html+css+js制作非物质文化遗产坝漆国漆 2页

&#x1f329;️ 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f482; 作者主页: 【进入主页—&#x1f680;获取更多源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;HTML5网页期末作业 (1000套…

鉴源论坛丨民用飞机机载软件是如何表明适航符合性的

作者 | 蔡喁 上海控安可信软件创新研究院副院长 版块 | 鉴源论坛 观擎 01 机载软件的基本特征 机载计算机在现代飞机各组成部分中占有举足轻重的位置&#xff0c;是现代航空电子系统的基础和核心&#xff0c;其研制、生产和应用水平已成为衡量飞机先进性的重要标志。机载计…

【面试题】Java基础 2

若你困于无风之地&#xff0c;我将为你奏响高空之歌 文章目录一、int 和 Integer 对象1. int 和 Integer 对象的区别2. 变量比较问题&#xff1a;二、反射1. 反射机制定义2. 反射的使用步骤3. 一个小栗子4. 反射的应用一、int 和 Integer 对象 1. int 和 Integer 对象的区别 …

css 特效实现方法

背景渐隐 通过 before 线性渐变遮盖掉一部分图片 视察滚动实现方式&#xff1a; 监听浏览器滚动事件改变各个层的top值 环形进度条 svg circlestroke-dasharray 环绕边框动画 四个单向运动的动画父框overflow: hidden;设置延迟可表现循环 一些旋转曲线的图形 inset背景扩…