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

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

3天内不再提示

机器人坐标系Launch文件解析

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

Launch文件解析

先来看下刚才运行的launch文件,里边启动了四个节点,分别是:

  • 小海龟仿真器
  • 海龟1的坐标系广播
  • 海龟2的坐标系广播
  • 海龟跟随控制

其中,两个坐标系的广播复用了turtle_tf_broadcaster节点,通过传入的参数名修改维护的坐标系名称。

learning_tf/launch/turtle_following_demo.launch.py

from launch import LaunchDescriptionfrom launch.actions import DeclareLaunchArgumentfrom launch.substitutions import LaunchConfigurationfrom launch_ros.actions import Nodedef generate_launch_description():    return LaunchDescription([        Node(            package='turtlesim',            executable='turtlesim_node',            name='sim'        ),        Node(            package='learning_tf',            executable='turtle_tf_broadcaster',            name='broadcaster1',            parameters=[                {'turtlename': 'turtle1'}            ]        ),        DeclareLaunchArgument(            'target_frame', default_value='turtle1',            description='Target frame name.'        ),        Node(            package='learning_tf',            executable='turtle_tf_broadcaster',            name='broadcaster2',            parameters=[                {'turtlename': 'turtle2'}            ]        ),        Node(            package='learning_tf',            executable='turtle_following',            name='listener',            parameters=[                {'target_frame': LaunchConfiguration('target_frame')}            ]        ),     ])

坐标系动态广播

海龟1和海龟2在world坐标系下的坐标变换,在turtle_tf_broadcaster节点中实现,除了海龟坐标系的名字不同之外,针对两个海龟的功能是一样的。

learning_tf/turtle_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 import TransformBroadcaster           # TF坐标变换广播器from turtlesim.msg import Pose                     # turtlesim小海龟位置消息class TurtleTFBroadcaster(Node):    def __init__(self, name):        super().__init__(name)                                # ROS2节点父类初始化        self.declare_parameter('turtlename', 'turtle')        # 创建一个海龟名称的参数        self.turtlename = self.get_parameter(                 # 优先使用外部设置的参数值,否则用默认值            'turtlename').get_parameter_value().string_value        self.tf_broadcaster = TransformBroadcaster(self)      # 创建一个TF坐标变换的广播对象并初始化        self.subscription = self.create_subscription(         # 创建一个订阅者,订阅海龟的位置消息            Pose,            f'/{self.turtlename}/pose',                       # 使用参数中获取到的海龟名称            self.turtle_pose_callback, 1)    def turtle_pose_callback(self, msg):                              # 创建一个处理海龟位置消息的回调函数,将位置消息转变成坐标变换        transform = TransformStamped()                                # 创建一个坐标变换的消息对象        transform.header.stamp = self.get_clock().now().to_msg()      # 设置坐标变换消息的时间戳        transform.header.frame_id = 'world'                           # 设置一个坐标变换的源坐标系        transform.child_frame_id = self.turtlename                    # 设置一个坐标变换的目标坐标系        transform.transform.translation.x = msg.x                     # 设置坐标变换中的X、Y、Z向的平移        transform.transform.translation.y = msg.y        transform.transform.translation.z = 0.0        q = tf_transformations.quaternion_from_euler(0, 0, msg.theta) # 将欧拉角转换为四元数(roll, pitch, yaw)        transform.transform.rotation.x = q[0]                         # 设置坐标变换中的X、Y、Z向的旋转(四元数)        transform.transform.rotation.y = q[1]        transform.transform.rotation.z = q[2]        transform.transform.rotation.w = q[3]        # Send the transformation        self.tf_broadcaster.sendTransform(transform)     # 广播坐标变换,海龟位置变化后,将及时更新坐标变换信息def main(args=None):    rclpy.init(args=args)                                # ROS2 Python接口初始化    node = TurtleTFBroadcaster("turtle_tf_broadcaster")  # 创建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',            'turtle_tf_broadcaster = learning_tf.turtle_tf_broadcaster:main',            'tf_listener = learning_tf.tf_listener:main',        ],    },

海龟跟随

坐标系都正常广播了,接下来我们就可以订阅两只海龟的位置关系,并且变换成速度指令进行控制啦。

learning_tf/turtle_following.py

#!/usr/bin/env python3# -*- coding: utf-8 -*-"""@作者: 古月居(www.guyuehome.com)@说明: ROS2 TF示例-通过坐标变化实现海龟跟随功能"""import mathimport 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  # 监听坐标变换的监听器类from geometry_msgs.msg import Twist                       # ROS2 速度控制消息from turtlesim.srv import Spawn                           # 海龟生成的服务接口class TurtleFollowing(Node):    def __init__(self, name):        super().__init__(name)                                      # ROS2节点父类初始化        self.declare_parameter('source_frame', 'turtle1')           # 创建一个源坐标系名的参数        self.source_frame = self.get_parameter(                     # 优先使用外部设置的参数值,否则用默认值            'source_frame').get_parameter_value().string_value        self.tf_buffer = Buffer()                                   # 创建保存坐标变换信息的缓冲区        self.tf_listener = TransformListener(self.tf_buffer, self)  # 创建坐标变换的监听器        self.spawner = self.create_client(Spawn, 'spawn')           # 创建一个请求产生海龟的客户端        self.turtle_spawning_service_ready = False                  # 是否已经请求海龟生成服务的标志位        self.turtle_spawned = False                                 # 海龟是否产生成功的标志位        self.publisher = self.create_publisher(Twist, 'turtle2/cmd_vel', 1) # 创建跟随运动海龟的速度话题        self.timer = self.create_timer(1.0, self.on_timer)         # 创建一个固定周期的定时器,控制跟随海龟的运动    def on_timer(self):        from_frame_rel = self.source_frame                         # 源坐标系        to_frame_rel   = 'turtle2'                                 # 目标坐标系        if self.turtle_spawning_service_ready:                     # 如果已经请求海龟生成服务            if self.turtle_spawned:                                # 如果跟随海龟已经生成                try:                    now = rclpy.time.Time()                        # 获取ROS系统的当前时间                    trans = self.tf_buffer.lookup_transform(       # 监听当前时刻源坐标系到目标坐标系的坐标变换                        to_frame_rel,                        from_frame_rel,                        now)                except TransformException as ex:                   # 如果坐标变换获取失败,进入异常报告                    self.get_logger().info(                        f'Could not transform {to_frame_rel} to {from_frame_rel}: {ex}')                    return                msg = Twist()                                      # 创建速度控制消息                scale_rotation_rate = 1.0                          # 根据海龟角度,计算角速度                msg.angular.z = scale_rotation_rate * math.atan2(                    trans.transform.translation.y,                    trans.transform.translation.x)                scale_forward_speed = 0.5                          # 根据海龟距离,计算线速度                msg.linear.x = scale_forward_speed * math.sqrt(                    trans.transform.translation.x ** 2 +                    trans.transform.translation.y ** 2)                self.publisher.publish(msg)                        # 发布速度指令,海龟跟随运动            else:                                                  # 如果跟随海龟没有生成                if self.result.done():                             # 查看海龟是否生成                    self.get_logger().info(                        f'Successfully spawned {self.result.result().name}')                    self.turtle_spawned = True                                     else:                                              # 依然没有生成跟随海龟                    self.get_logger().info('Spawn is not finished')        else:                                                      # 如果没有请求海龟生成服务            if self.spawner.service_is_ready():                    # 如果海龟生成服务器已经准备就绪                request = Spawn.Request()                          # 创建一个请求的数据                request.name = 'turtle2'                           # 设置请求数据的内容,包括海龟名、xy位置、姿态                request.x = float(4)                request.y = float(2)                request.theta = float(0)                self.result = self.spawner.call_async(request)     # 发送服务请求                self.turtle_spawning_service_ready = True          # 设置标志位,表示已经发送请求            else:                self.get_logger().info('Service is not ready')     # 海龟生成服务器还没准备就绪的提示def main(args=None):    rclpy.init(args=args)                       # ROS2 Python接口初始化    node = TurtleFollowing("turtle_following")  # 创建ROS2节点对象并进行初始化    rclpy.spin(node)                            # 循环等待ROS2退出    node.destroy_node()                         # 销毁节点对象    rclpy.shutdown()                            # 关闭ROS2 Python接口

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

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

    关注

    212

    文章

    28910

    浏览量

    209658
  • 仿真器
    +关注

    关注

    14

    文章

    1020

    浏览量

    84154
  • 坐标系
    +关注

    关注

    0

    文章

    29

    浏览量

    7406
  • ROS
    ROS
    +关注

    关注

    1

    文章

    281

    浏览量

    17253
收藏 人收藏

    相关推荐

    工业机器人常用坐标系介绍

    坐标系:为确定机器人的位置和姿态而在机器人或空间上进行的位置指标系统。
    发表于 02-19 12:03 3.4w次阅读
    工业<b class='flag-5'>机器人</b>常用<b class='flag-5'>坐标系</b>介绍

    abb机器人工具坐标系问题

    各位大佬请教一下,abb机器人工具坐标系用四点法,六点法,手动输入等方式标定出的工具坐标系的Z方向与实际工具的长度不符,实际工具长度越长坐标系z方向的差距越大。比如实际工具400mm
    发表于 08-07 11:11

    机器人坐标系的建立

    机器人的电机传动控制坐标系是怎样确定的,是基于什么控制原理,学习机器人的控制理论有哪些比较经典的书籍,求大神指导?
    发表于 06-10 17:03

    介绍坐标系机器人之间的纽带即连杆坐标系

    介绍坐标系以及它们之间的变换关系,数学的意味还是很浓的。讲了那么多的公式和规律,它们要怎么用在机器人上呢?这篇文章将介绍坐标系机器人之间的纽带即连杆
    发表于 09-01 06:17

    机器人坐标系标定方法研究

    针对借助激光跟踪仪标定机器人所涉及的坐标系统一问题,对基于空间几何法拟合建立的基坐标系机器人理论基坐标系的转换关系进行了研究,提出了一种基
    发表于 03-07 10:43 2次下载

    关于工业机器人的四类坐标系概述

    在我们工业机器人定义中,有四类坐标系,他们分别是轴坐标系、世界坐标系、工具坐标系、基座坐标系
    的头像 发表于 10-05 17:43 2.8w次阅读

    机器人4大坐标系讲解

    任何机器人都离不开基坐标系,也是机器人TCP在三维空间运动空间所必须的基本坐标系(面对机器人前后:X轴 ,左右:Y轴, 上下:Z轴)。
    的头像 发表于 05-14 09:56 2.3w次阅读
    <b class='flag-5'>机器人</b>4大<b class='flag-5'>坐标系</b>讲解

    带你来剖析机器人坐标系吧!

    大地坐标系:大地坐标系是以大地作为参考的直角坐标系。在多个机器人联动的和带有外轴的机器人会用到,90%的大地
    的头像 发表于 05-09 15:49 4959次阅读

    机器人坐标系用法和算法原理

    一般都会定义机器人第一轴的旋转轴为基坐标系Z轴,旋转中心即是坐标系原点,X和Y的方向是的电机零点确定,所以只要你不更换电机的零点和机械结构,单个机器人里这个基
    发表于 05-11 15:57 2114次阅读
    <b class='flag-5'>机器人</b><b class='flag-5'>坐标系</b>用法和算法原理

    机器人坐标系选择指令和操作步骤

    在编程操作过程中,为了确定机器人的空间位置以及姿态的变化,需要建立合适的工具和用户坐标系。工具坐标系用于确定每个工具中心点(TCP)的位置和工具姿势。
    发表于 05-12 14:43 2347次阅读
    <b class='flag-5'>机器人</b><b class='flag-5'>坐标系</b>选择指令和操作步骤

    世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的关系

    相机的成像过程涉及到四个坐标系:世界坐标系、相机坐标系、图像坐标系、像素坐标系。这篇博客介绍相机的成像过程,以及四个
    的头像 发表于 07-03 10:30 1.2w次阅读
    世界<b class='flag-5'>坐标系</b>、相机<b class='flag-5'>坐标系</b>、图像<b class='flag-5'>坐标系</b>、像素<b class='flag-5'>坐标系</b>之间的关系

    焊接机器人坐标系有哪几种

      焊接机器人是一种自动化设备,用于进行焊接操作。为了确保焊接过程的准确性和效率,焊接机器人需要在三维空间中进行定位和控制。这涉及到使用不同的坐标系,以便机器人能够精确地执行任务。本文
    的头像 发表于 10-18 15:17 1185次阅读
    焊接<b class='flag-5'>机器人</b><b class='flag-5'>坐标系</b>有哪几种

    深度剖析机器人的四大坐标系

    大地坐标系:大地坐标系是以大地作为参考的直角坐标系。在多个机器人联动的和带有外轴的机器人会用到,90%的大地
    发表于 11-13 11:24 1850次阅读
    深度剖析<b class='flag-5'>机器人</b>的四大<b class='flag-5'>坐标系</b>

    机器人中都有哪些坐标系

    坐标系是我们非常熟悉的一个概念,也是机器人学中的重要基础,在一个完整的机器人系统中,会存在很多坐标系,这些坐标系之间的位置关系该如何管理?
    的头像 发表于 11-22 17:20 1729次阅读
    <b class='flag-5'>机器人</b>中都有哪些<b class='flag-5'>坐标系</b>

    机器人坐标系管理TF跟随功能解析

    .py** ros2 run turtlesim turtle_teleop_key 看到的效果和ROS自带的例程相同。 原理解析 在两只海龟的仿真器中,我们可以定义三个坐标系,比如仿真器的全局参考叫做
    的头像 发表于 11-22 17:35 782次阅读
    <b class='flag-5'>机器人</b><b class='flag-5'>坐标系</b>管理TF跟随功能<b class='flag-5'>解析</b>