企业项目管理、ORK、研发管理与敏捷开发工具平台

网站首页 > 精选文章 正文

ROS2开发实践:ROS工具(launch脚本、TF坐标系、Gazebo等)

wudianyun 2025-07-28 00:46:47 精选文章 4 ℃

上周我们了解了ROS核心(节点、话题、服务、DDS通信协议等),今天讲一下ROS2中的开放工具,包括launch脚本文件、tf坐标系、gazebo仿真平台、rviz可视化平台、rosbag数据记录与回放、rqt模块化可视化工具箱。(原文链接:https://www.eeworld.com.cn/avz9KO0)


launch脚本文件



相较于ROS1来说ROS2的launch文件使用了python语言,使其可以变得更加灵活。同时也可以对各个节点进行更加细致的操作

比如,ROS1的launch文件可能是这样的:

<launch>

<arg

name="model" />

<param

name="robot_description"

textfile="$(find wx_robot_model)/urdf/wx_robot_model.urdf" />

<node

name="joint_state_publisher"

pkg="joint_state_publisher"

type="joint_state_publisher" />

<node

name="robot_state_publisher"

pkg="robot_state_publisher"

type="robot_state_publisher" />

</launch>

而ROS2的launch文件如下

import os



from ament_index_python.packages import get_package_share_directory # 查询功能包路径的方法



from launch import LaunchDescription    # launch文件的描述类

from launch_ros.actions import Node     # 节点启动的描述类





defgenerate_launch_description():# 自动生成launch文件的函数

   rviz_config = os.path.join(          # 找到配置文件的完整路径

      get_package_share_directory('learning_launch'),

'rviz',

'turtle_rviz.rviz'

      )



return LaunchDescription([           # 返回launch文件的描述信息

      Node(                             # 配置一个节点的启动

package='rviz2',               # 节点所在的功能包

         executable='rviz2',            # 节点的可执行文件名

         name='rviz2',                  # 对节点重新命名

         arguments=['-d', rviz_config]  # 加载命令行参数

      )

   ])

可以看得出来ROS2的launch文件更发杂也更加灵活,学会编写launch文件可以实现一键启动等想法

如果想具体了解launch脚本文件的写法和多样的用法可以访问如下两个官方的链接

https://docs.ros.org/en/humble/Tutorials/Launch/Launch-Main.html
https://docs.ros.org/en/humble/Tutorials/Launch/Using-ROS2-Launch-For-Large-Projects.html


tf坐标系



tf坐标系的具体用法有以下这些:

  1. 查看tf树
  2. 查询坐标变换信息
  3. 坐标可视化
  • 静态tf广播
  • 动态tf广播
  • tf监听

接下来演示一下:如何进行海龟跟随
效果如下:

具体的实现代码(python)

#!/usr/bin/env python3

# -*- coding: utf-8 -*-



"""

@作者: 古月居(www.guyuehome.com)

@说明: ROS2 TF示例-通过坐标变化实现海龟跟随功能

"""



import math

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  # 监听坐标变换的监听器类

from geometry_msgs.msg import Twist                       # ROS2 速度控制消息

from turtlesim.srv import Spawn                           # 海龟生成的服务接口

classTurtleFollowing(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)         # 创建一个固定周期的定时器,控制跟随海龟的运动



defon_timer(self):

        from_frame_rel = self.source_frame                         # 源坐标系

        to_frame_rel   = 'turtle2'# 目标坐标系



ifself.turtle_spawning_service_ready:# 如果已经请求海龟生成服务

ifself.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:                                                  # 如果跟随海龟没有生成

ifself.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:                                                      # 如果没有请求海龟生成服务

ifself.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')     # 海龟生成服务器还没准备就绪的提示





defmain(args=None):

    rclpy.init(args=args)                       # ROS2 Python接口初始化

    node = TurtleFollowing("turtle_following")  # 创建ROS2节点对象并进行初始化

    rclpy.spin(node)                            # 循环等待ROS2退出

    node.destroy_node()                         # 销毁节点对象

    rclpy.shutdown()                            # 关闭ROS2 Python接口


gazebo仿真平台



相较于ROS1,ROS2对gazebo惊醒了重新设计与升级;这里只展示如何在官网上下载gazebo,后续的使用则在后面进行展示

参考以下官方链接

https://gazebosim.org/docs/harmonic/install_ubuntu/

#安装依赖项

sudo apt-get update

sudo apt-get install curl lsb-release gnupg

#安装Gazebo Harmonic

sudo curl https://packages.osrfoundation.org/gazebo.gpg --output /usr/share/keyrings/pkgs-osrf-archive-keyring.gpg

echo"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/pkgs-osrf-archive-keyring.gpg] http://packages.osrfoundation.org/gazebo/ubuntu-stable $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/gazebo-stable.list > /dev/null

sudo apt-get update

sudo apt-get install gz-harmonic

#最后安装jazzy gz安装包

sudo apt install ros-jazzy-ros-gz

#需要注意的是:

#根据 Gazebo 官方文档,ROS 2 Jazzy(LTS 版本)仅支持 Gazebo Harmonic(Gazebo 11),而 Ionic 版本(Gazebo 12)与 Jazzy 的兼容性被标记为**(不推荐)**。所以下载的时候要看清楚版本再下载


rviz可视化平台



rviz平台ROS2和ROS1版本的使用方法差不多,所以这里不会过多赘述


rosbag数据记录与回放



同样的ROS1和ROS2的使用方法大差不差

  1. 数据记录rosbag record
  2. 数据回放rosbag play值得注意的是,rosbag可以对图像话题进行录制,然后再会放出来,相当于进行了一次录像操作


rqt模块化可视化工具箱


rqt工具箱主要是这几个方面的使用

rqt安装

sudo apt install ros-jazzy-rqt
  1. 日志显示ros2 run rqt_console rqt_console
  2. 图像显示ros2 run rqt_image_view rqt_image_view
  3. 发布图像话题/服务数据
  4. 绘制数据曲线

  5. 数据包管理

  6. 节点可视化


  7. 最后,希望大家可以学习一下git开发工具,并使用vscode进行开发。
最近发表
标签列表