0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何对机器人静态TF广播进行管理

麦辣鸡腿堡 来源:古月居 作者:古月居 2023-11-22 17:31 次阅读

静态TF广播

我们说TF的主要作用是对坐标系进行管理,那就管理一个试试呗?

坐标变换中最为简单的应该是相对位置不发生变化的情况,比如你家的房子在哪个位置,只要房子不拆,这个坐标应该就不会变化。

机器人系统中也很常见,比如激光雷达和机器人底盘之间的位置关系,安装好之后基本不会变化。

在TF中,这种情况也称之为静态TF变换,我们来看看在程序中该如何实现?

运行效果

启动终端,运行如下命令:

$ ros2 run learning_tf static_tf_broadcaster$ ros2 run tf2_tools view_frames

可以看到当前系统中存在两个坐标系,一个是world,一个是house,两者之间的相对位置不会发生改变,通过一个静态的TF对象进行维护。

图片

代码解析

来看下在代码中是如何创建坐标系并且发布静态变换的。

learning_tf/static_tf_broadcaster.py

#!/usr/bin/env python3# -*- coding: utf-8 -*-"""@作者: 古月居(www.guyuehome.com)@说明: ROS2 TF示例-广播静态的坐标变换"""import rclpy                                                                 # ROS2 Python接口from rclpy.node import Node                                                  # ROS2 节点类from geometry_msgs.msg import TransformStamped                               # 坐标变换消息import tf_transformations                                                    # TF坐标变换库from tf2_ros.static_transform_broadcaster import StaticTransformBroadcaster  # TF静态坐标系广播器类class StaticTFBroadcaster(Node):    def __init__(self, name):        super().__init__(name)                                                  # ROS2节点父类初始化        self.tf_broadcaster = StaticTransformBroadcaster(self)                  # 创建一个TF广播器对象        static_transformStamped = TransformStamped()                            # 创建一个坐标变换的消息对象        static_transformStamped.header.stamp = self.get_clock().now().to_msg()  # 设置坐标变换消息的时间戳        static_transformStamped.header.frame_id = 'world'                       # 设置一个坐标变换的源坐标系        static_transformStamped.child_frame_id  = 'house'                       # 设置一个坐标变换的目标坐标系        static_transformStamped.transform.translation.x = 10.0                  # 设置坐标变换中的X、Y、Z向的平移        static_transformStamped.transform.translation.y = 5.0                            static_transformStamped.transform.translation.z = 0.0        quat = tf_transformations.quaternion_from_euler(0.0, 0.0, 0.0)          # 将欧拉角转换为四元数(roll, pitch, yaw)        static_transformStamped.transform.rotation.x = quat[0]                  # 设置坐标变换中的X、Y、Z向的旋转(四元数)        static_transformStamped.transform.rotation.y = quat[1]        static_transformStamped.transform.rotation.z = quat[2]        static_transformStamped.transform.rotation.w = quat[3]        self.tf_broadcaster.sendTransform(static_transformStamped)              # 广播静态坐标变换,广播后两个坐标系的位置关系保持不变def main(args=None):    rclpy.init(args=args)                                # ROS2 Python接口初始化    node = StaticTFBroadcaster("static_tf_broadcaster")  # 创建ROS2节点对象并进行初始化    rclpy.spin(node)                                     # 循环等待ROS2退出    node.destroy_node()                                  # 销毁节点对象    rclpy.shutdown()

完成代码的编写后需要设置功能包的编译选项,让系统知道Python程序的入口,打开功能包的setup.py文件,加入如下入口点的配置:

entry_points={        'console_scripts': [            'static_tf_broadcaster = learning_tf.static_tf_broadcaster:main',        ],    },

经过这段代码,两个坐标系的变化是描述清楚了,到了使用的时候,我们又该如何查询呢?

TF监听

我们再来学习下如何查询两个坐标系之间的位置关系。

运行效果

启动一个终端,运行如下节点,就可以在终端中看到周期显示的坐标关系了。

$ ros2 run learning_tf tf_listener

图片

代码解析

这个节点中是如何查询坐标关系的,我们来看下代码

learning_tf/tf_listener.py

#!/usr/bin/env python3# -*- coding: utf-8 -*-"""@作者: 古月居(www.guyuehome.com)@说明: ROS2 TF示例-监听某两个坐标系之间的变换"""import rclpy                                              # ROS2 Python接口库from rclpy.node import Node                               # ROS2 节点类import tf_transformations                                 # TF坐标变换库from tf2_ros import TransformException                    # TF左边变换的异常类from tf2_ros.buffer import Buffer                         # 存储坐标变换信息的缓冲类from tf2_ros.transform_listener import TransformListener  # 监听坐标变换的监听器类class TFListener(Node):    def __init__(self, name):        super().__init__(name)                                      # ROS2节点父类初始化        self.declare_parameter('source_frame', 'world')             # 创建一个源坐标系名的参数        self.source_frame = self.get_parameter(                     # 优先使用外部设置的参数值,否则用默认值            'source_frame').get_parameter_value().string_value        self.declare_parameter('target_frame', 'house')             # 创建一个目标坐标系名的参数        self.target_frame = self.get_parameter(                     # 优先使用外部设置的参数值,否则用默认值            'target_frame').get_parameter_value().string_value        self.tf_buffer = Buffer()                                   # 创建保存坐标变换信息的缓冲区        self.tf_listener = TransformListener(self.tf_buffer, self)  # 创建坐标变换的监听器        self.timer = self.create_timer(1.0, self.on_timer)          # 创建一个固定周期的定时器,处理坐标信息    def on_timer(self):        try:            now = rclpy.time.Time()                                 # 获取ROS系统的当前时间            trans = self.tf_buffer.lookup_transform(                # 监听当前时刻源坐标系到目标坐标系的坐标变换                self.target_frame,                self.source_frame,                now)        except TransformException as ex:                            # 如果坐标变换获取失败,进入异常报告            self.get_logger().info(                f'Could not transform {self.target_frame} to {self.source_frame}: {ex}')            return        pos  = trans.transform.translation                          # 获取位置信息        quat = trans.transform.rotation                             # 获取姿态信息(四元数)        euler = tf_transformations.euler_from_quaternion([quat.x, quat.y, quat.z, quat.w])        self.get_logger().info('Get %s -- > %s transform: [%f, %f, %f] [%f, %f, %f]'           % (self.source_frame, self.target_frame, pos.x, pos.y, pos.z, euler[0], euler[1], euler[2]))def main(args=None):    rclpy.init(args=args)                       # ROS2 Python接口初始化    node = TFListener("tf_listener")            # 创建ROS2节点对象并进行初始化    rclpy.spin(node)                            # 循环等待ROS2退出    node.destroy_node()                         # 销毁节点对象    rclpy.shutdown()                            # 关闭ROS2 Python接口

完成代码的编写后需要设置功能包的编译选项,让系统知道Python程序的入口,打开功能包的setup.py文件,加入如下入口点的配置:

entry_points={        'console_scripts': [            'static_tf_broadcaster = learning_tf.static_tf_broadcaster:main',            'tf_listener = learning_tf.tf_listener:main',        ],    },

好啦,大家现在对TF的基本使用有所了解了。我们继续挑战两只海龟跟随的案例。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 机器人
    +关注

    关注

    210

    文章

    28187

    浏览量

    206418
  • 坐标系
    +关注

    关注

    0

    文章

    29

    浏览量

    7280
  • 程序
    +关注

    关注

    116

    文章

    3773

    浏览量

    80833
  • ROS
    ROS
    +关注

    关注

    1

    文章

    276

    浏览量

    16963
收藏 人收藏

    评论

    相关推荐

    机器人餐厅

    机器人、地面送餐机器人、空中传菜机器人、迎宾机器人等20个各式机器人。它们长相色彩各异,个头1.3至1.6米不等,可以呈现10多种面部表情,
    发表于 07-26 09:11

    什么是工业机器人

    机械手之间有防护墙隔开,操作者可通过观察窗或闭路电视对从机械手操作机进行有效的监视,主从机械手系统的出现为机器人的产生为近代机器人的设计与制造作了铺垫。1954年美国戴沃尔最早提出了工业机器人
    发表于 01-19 10:58

    机器人视觉——机器人的“眼睛”

    目前产业机器人仅能在严格定义的结构化环境中执行预定指令动作,缺乏对环境的感知与应变能力,这极大地限制了机器人的应用。利用机器人的视觉控制,不需要预先对产业机器人的运动轨迹
    发表于 01-23 15:02

    【MiCOKit申请】智能管理机器人(家庭广泛使用)

    申请理由:目前,人们大多数处于工作的忙碌中,待在家里的时间是很短的,家里有很多东西需要去实时管理维护,我们不可能每天工作时回家,那要怎么办呢?当然,使用一台智能管理机器人便可,我们可以通过互联网在
    发表于 08-09 17:57

    语义机器人

    客服机器人系统、智能硬件和机器人的对话系统建设,能让人机对话的过程变得更加自然流畅;另外还可以接入类似幼儿教育、听广播、订机票等外部服务,功能可以无限扩展。
    发表于 03-10 16:52

    辰汉-如何实现服务机器人的运算与控制

    的核心系统。摄像头采集视频图像,会对图像中的事物进行一些简单的判别,比如识别人脸,对静态事物的图像采集也能让机器人辨别障碍物,或者计算出静态事物的大致几何图形甚至尺寸,对动态事物的图像
    发表于 06-09 17:18

    机器人、协作机器人和移动机器人,你分的清楚吗

    、激光扫描仪等。目的是把机器人与人分开。所有安全性都可以根据机械安全标准ISO 13849和IEC 62061(IEC 61508的机械解释)进行设计COBOT表示协作机器人。它们是被设计为与人交互
    发表于 10-30 11:33

    工业机器人的技术原理

    及以太网的联网功能。可用于机器人控制器之间和机器人控制器同上位机的通讯,便于对机器人生产线进行监控、诊断和管理。  工业
    发表于 11-23 10:40

    机器人系统是什么?

    机器人的移动通常是从管理机器人总体任务进度的中央处理器发出位置变化请求时开始的。导航系统通过制定行程计划或轨迹以开始执行位置变化请求。行程计划需考虑可用路径、已知障碍位置、机器人能力及
    发表于 09-10 10:44

    使用旅游机器人需要注意哪些问题?

    决消费者的咨询问题,机器人就是一个很好的载体。机器人甚至可以把客户基本的需求都解决了。  如今的人脸识别越来越成熟,机器人的人脸识别也会成为标配,因而,机器人可以通过人脸识别对访客
    发表于 06-12 17:04

    机器人是什么?

    自主机器人。这些都是机器人的智能艺术。除了这个被广泛接受的分类,机器人可以根据它们的运动方式和工作环境进行分类,如轮式机器人、腿式
    发表于 03-31 10:31

    轮式机器人怎么样

    ,人类友好型机器人开始在实体店进行实时盘点,这使得超市能够减少每种产品的货架空间,并增加给定时间内可以携带的库存量。轮式机器人甚至可以进军宾馆,提供从入住到客房服务的接待服务。 对于这些轮式
    发表于 11-09 07:49

    扫地机器人系统的解决方案分享

    扫地机器人典型应用是四节锂电池串联使用。电池管理分为电池保护以及充电管理两个部分。如下图所示, 电池保护部分一般会设计在电池包里面,针对电池在各种工况下的异常情况进行诊断和保护。 充电
    发表于 11-10 06:05

    Redzone Robotics的Solo机器人进行管道检测

    Redzone Robotics的Solo机器人是完全自主的下水道管道检测机器人,可以节省成本并限制道路封闭,从而节省成本。
    的头像 发表于 11-28 06:57 3244次阅读

    机器人TF电机要求有哪些

    TF电机在机器人应用中非常多,如机器人的关节活动、行走、各种动作等等都是需要微型电机来驱动的。抛开大型的机器人不说,小型的机器人就需要用到
    发表于 06-25 18:40 1338次阅读