——Franka机器人渠道、市场、销售负责
——学术背景来自于哈尔滨工业大学、多伦多大学
全国咨询热线:
400 188 3810
Franka机器人专线
18018175378(同微信)

PNP机器人ROS专题系列之5—ROS2开发实践:ROS工具(launch脚本、TF坐标系、Gazebo、RVIZ、RQT等)

发表时间:2025-08-17 21:22作者:herowuxu

PNP机器人专注具身智能方向, 是Franka战略合作伙伴。

德国慕尼黑—PNP机器人成为Franka Robotics卓越战略伙伴,推动具身智能机器人全球生态

具身智能方向:具身智能技术群

Franka机器人:具身智能方案/渠道/商务咨询


提要:ROS开源生态庞大,社区活跃,驱动、算法、可视化工具即装即用,大幅降低科研门槛;FRANKA机器人、KINOVA等主流机型原生支持ROS/ROS2,接口统一,实验成果可无缝迁移。PNP机器人更新ROS系列教程,从节点通信、MoveIt!到Gazebo仿真,全流程讲解,并附实验室级实例源码,助力机器人、AI、自动化等方向学者快速复现顶会算法,加速论文与原型落地,敬请关注后续深度篇章!

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


launch脚本文件



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

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

  1. <launch>
  2. <arg
  3. name="model" />
  4. <param
  5. name="robot_description"
  6. textfile="$(find wx_robot_model)/urdf/wx_robot_model.urdf" />
  7. <node
  8. name="joint_state_publisher"
  9. pkg="joint_state_publisher"
  10. type="joint_state_publisher" />
  11. <node
  12. name="robot_state_publisher"
  13. pkg="robot_state_publisher"
  14. type="robot_state_publisher" />
  15. </launch>

而ROS2的launch文件如下

  1. import os

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

  3. from launch import LaunchDescription    # launch文件的描述类
  4. from launch_ros.actions import Node     # 节点启动的描述类


  5. defgenerate_launch_description():# 自动生成launch文件的函数
  6.    rviz_config = os.path.join(          # 找到配置文件的完整路径
  7.       get_package_share_directory('learning_launch'),
  8. 'rviz',
  9. 'turtle_rviz.rviz'
  10.       )

  11. return LaunchDescription([           # 返回launch文件的描述信息
  12.       Node(                             # 配置一个节点的启动
  13. package='rviz2',               # 节点所在的功能包
  14.          executable='rviz2',            # 节点的可执行文件名
  15.          name='rviz2',                  # 对节点重新命名
  16.          arguments=['-d', rviz_config]  # 加载命令行参数
  17.       )
  18.    ])

可以看得出来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)

  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-

  3. """
  4. @作者: 古月居(www.guyuehome.com)
  5. @说明: ROS2 TF示例-通过坐标变化实现海龟跟随功能
  6. """

  7. import math
  8. import rclpy                                              # ROS2 Python接口库
  9. from rclpy.node import Node                               # ROS2 节点类
  10. import tf_transformations                                 # TF坐标变换库
  11. from tf2_ros import TransformException                    # TF左边变换的异常类
  12. from tf2_ros.buffer import Buffer                         # 存储坐标变换信息的缓冲类
  13. from tf2_ros.transform_listener import TransformListener  # 监听坐标变换的监听器类
  14. from geometry_msgs.msg import Twist                       # ROS2 速度控制消息
  15. from turtlesim.srv import Spawn                           # 海龟生成的服务接口
  16. classTurtleFollowing(Node):

  17. def__init__(self, name):
  18. super().__init__(name)                                      # ROS2节点父类初始化

  19. self.declare_parameter('source_frame', 'turtle1')           # 创建一个源坐标系名的参数
  20. self.source_frame = self.get_parameter(                     # 优先使用外部设置的参数值,否则用默认值
  21. 'source_frame').get_parameter_value().string_value

  22. self.tf_buffer = Buffer()                                   # 创建保存坐标变换信息的缓冲区
  23. self.tf_listener = TransformListener(self.tf_buffer, self)  # 创建坐标变换的监听器

  24. self.spawner = self.create_client(Spawn, 'spawn')           # 创建一个请求产生海龟的客户端
  25. self.turtle_spawning_service_ready = False# 是否已经请求海龟生成服务的标志位
  26. self.turtle_spawned = False# 海龟是否产生成功的标志位

  27. self.publisher = self.create_publisher(Twist, 'turtle2/cmd_vel', 1) # 创建跟随运动海龟的速度话题

  28. self.timer = self.create_timer(1.0, self.on_timer)         # 创建一个固定周期的定时器,控制跟随海龟的运动

  29. defon_timer(self):
  30.         from_frame_rel = self.source_frame                         # 源坐标系
  31.         to_frame_rel   = 'turtle2'# 目标坐标系

  32. ifself.turtle_spawning_service_ready:# 如果已经请求海龟生成服务
  33. ifself.turtle_spawned:# 如果跟随海龟已经生成
  34. try:
  35.                     now = rclpy.time.Time()                        # 获取ROS系统的当前时间
  36.                     trans = self.tf_buffer.lookup_transform(       # 监听当前时刻源坐标系到目标坐标系的坐标变换
  37.                         to_frame_rel,
  38.                         from_frame_rel,
  39.                         now)
  40. except TransformException as ex:                   # 如果坐标变换获取失败,进入异常报告
  41. self.get_logger().info(
  42.                         f'Could not transform {to_frame_rel} to {from_frame_rel}: {ex}')
  43. return

  44.                 msg = Twist()                                      # 创建速度控制消息
  45.                 scale_rotation_rate = 1.0# 根据海龟角度,计算角速度
  46.                 msg.angular.z = scale_rotation_rate * math.atan2(
  47.                     trans.transform.translation.y,
  48.                     trans.transform.translation.x)

  49.                 scale_forward_speed = 0.5# 根据海龟距离,计算线速度
  50.                 msg.linear.x = scale_forward_speed * math.sqrt(
  51.                     trans.transform.translation.x ** 2 +
  52.                     trans.transform.translation.y ** 2)

  53. self.publisher.publish(msg)                        # 发布速度指令,海龟跟随运动
  54. else:                                                  # 如果跟随海龟没有生成
  55. ifself.result.done():# 查看海龟是否生成
  56. self.get_logger().info(
  57.                         f'Successfully spawned {self.result.result().name}')
  58. self.turtle_spawned = True
  59. else:                                              # 依然没有生成跟随海龟
  60. self.get_logger().info('Spawn is not finished')
  61. else:                                                      # 如果没有请求海龟生成服务
  62. ifself.spawner.service_is_ready():# 如果海龟生成服务器已经准备就绪
  63.                 request = Spawn.Request()                          # 创建一个请求的数据
  64.                 request.name = 'turtle2'# 设置请求数据的内容,包括海龟名、xy位置、姿态
  65.                 request.x = float(4)
  66.                 request.y = float(2)
  67.                 request.theta = float(0)

  68. self.result = self.spawner.call_async(request)     # 发送服务请求
  69. self.turtle_spawning_service_ready = True# 设置标志位,表示已经发送请求
  70. else:
  71. self.get_logger().info('Service is not ready')     # 海龟生成服务器还没准备就绪的提示


  72. defmain(args=None):
  73.     rclpy.init(args=args)                       # ROS2 Python接口初始化
  74.     node = TurtleFollowing("turtle_following")  # 创建ROS2节点对象并进行初始化
  75.     rclpy.spin(node)                            # 循环等待ROS2退出
  76.     node.destroy_node()                         # 销毁节点对象
  77.     rclpy.shutdown()                            # 关闭ROS2 Python接口


gazebo仿真平台



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

参考以下官方链接

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

  1. #安装依赖项
  2. sudo apt-get update
  3. sudo apt-get install curl lsb-release gnupg
  4. #安装Gazebo Harmonic
  5. sudo curl https://packages.osrfoundation.org/gazebo.gpg --output /usr/share/keyrings/pkgs-osrf-archive-keyring.gpg
  6. 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
  7. sudo apt-get update
  8. sudo apt-get install gz-harmonic
  9. #最后安装jazzy gz安装包
  10. sudo apt install ros-jazzy-ros-gz
  11. #需要注意的是:
  12. #根据 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安装
  1. 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. 节点可视化

    最后,希望大家可以学习一下git开发工具,并使用vscode进行开发。


    转载请申请。


    FRANKA机器人因其高精度力控与开放式架构,在学术界广泛应用,成为具身智能与操作研究的主流平台。斯坦福、伯克利、CMU等顶尖实验室构建了丰富的软件生态,ROS、MoveIt 等工具无缝集成,使其在 ICRA、IROS、RSS 等顶会中成为最佳论文常用的验证平台。PNP机器人作为 FRANKA 在国内的官方合作伙伴,负责其技术支持、渠道建设与销售,并基于 FRANKA 开发了一系列生态工具,如遥操作、视觉、移动平台等,具身智能方向如有部署需求,可联系 PNP机器人获取支持。
    图片

    热点文章参考:

    PNP&Franka机器人活动

    WRC具身觉醒:当机器人初步长出“人类”的直觉——2025世界机器人大会热点讨论纪实

    在具身智能火热加持下,看 2025 年机器人学术年会中的热点主题。PNP机器人展示力控、灵巧手捕捉等案例

    具身智能在线活动总结:Franka Robotics与PNP机器人在具身智能领域的技术分享

    具身直播活动:机器人大讲堂联合PNP机器人关于Franka机器人具身智能专题直播讨论

    具身活动总结:PNP机器人在FAIR plus 2025机器人链接会中呈现具身智能机器人数据集和操作等多项技术

    中国具身智能大会:具身智能发展迅速,PNP机器人展出和分享感悟全力控感知特点、操作策略局限以及数据采集等

    PNP具身智能数据集总结

    双臂类人形具身智能方向:一文汇总Franka机器人在科研、医疗等双臂机器人研究案例和双臂方案参考

    机器人数据集:一文汇总机器人数据集RoboDataset的意义与机器人数据采集方法

    机器人数据集:数据集越来越成为重要具身智能方向的基础设施—PNP机器人近期活动总结

    PNP&FRANKA机器人发展

    Franka机器人中国业务全新启航——Franka机器人的10个基本问题,一文掌握归来的力控机器人最新产品和趋势

    技术要点分享:Franka机器人常见的10个问题——硬件篇,一文干货汇总。

    中国具身智能大会:具身智能发展迅速,PNP机器人展出和分享感悟全力控感知特点、操作策略局限以及数据采集等

    机器人操作策略

    斯坦福大学李飞飞携Franka机器人创业空间智能提ReKep

    具身方案和配置:基于“扩散策略”模仿学习训练机器人以及常用配置方案

    OpenVLA:7B 参数开源 VLA模型,可以 HuggingFace下载和微调,支持 Open X-Embodiment


    <<<  END >>>


    关于集智联机器/PNP机器人

    集智联机器人(Plug & Play Robotics),简称PNP机器人。PNP机器人团队成员均来自于ABB、Uninversal Robots(优傲机器人)等国内外机器人行业知名企业,学术背景来自于哈尔滨工业大学、多伦多大学、滑铁卢大学等,具有较强的学术背景。PNP机器人致力于为客户提供从硬件到软件的全方位支持,帮助客户快速实现机器人的部署与应用,提升生产效率和智能化水平


    PNP机器人成立以来,先后获得“江苏省双创人才”、“姑苏领军”、“崇本领军、“吴江领军”等人才领军企业称号,公司具有较强科研能力,公司持续研发投入拥有技术发明等多项专利,是高新技术企业,科技中小企业;得益于推动在具身智能领域的最新技术和落地,PNP机器人获得”2024年中国科研贡献奖“

    PNP机器人在具身智能方向和思灵机器人以及旗下Franka机器人金牌合作,聚焦面向生活和工业场景的单臂/双臂数据采集场景,致力于机器人即插即用(Plug & Play)技术和具身智能通用解决方案。

    www.pnprobotics.com   (PNP机器人官方网站)

    sales@pnprobotics.com (官方邮箱/Email Add.)

    180 1817 5378(微信同号)


    关注具身智能,关注PNP公众号

    图片

    具身智能技术对接/具身群

    180 1817 5378(微信同号)

    图片





Plug & Play Robotics
集智联机器人(苏州)有限公司

联系信息                            联系电话:86 138 1609 4093         联系邮箱:sales@plugplayrobotics.com            联系地址:江苏省苏州市吴江智能制造产业园C1栋