ROS2 + C++ 常用工具(自用笔记)

系列文章目录

留空



前言

自用


常用工具介绍

Launch、rosbag2、RQT、RVIZ2和Gazebo。

(1)Launch启动文件

  • 作用:在ROS2中,当需要同时启动多个节点(即程序或进程)时,使用launch文件可以简化操作。
  • 特点:通过在一个文件中定义多个节点的启动命令和相关参数,可以实现多个节点的快速启动和配置。这极大提高了工作效率,并允许开发者在项目中更灵活地管理节点。

(2)rosbag2记录仪

  • 作用:rosbag2是ROS 2的一个工具,用于录制和回放ROS 2系统中的消息(数据)。
  • 特点
    录制与回放:可以录制话题数据,并在需要时回放。
    灵活性:支持多种存储后端,如mcap或sqlite3,可根据需求选择不同的存储方式。

(3)RQT工具

  • 作用:RQT是ROS 2的一个图形用户界面(GUI)工具,用于可视化ROS系统的各个方面。
  • 特点
    直观性:提供了一个直观的界面,让开发者能够方便地查看和管理ROS 2节点、话题、服务、参数等。
    插件化:RQT支持插件机制,开发者可以根据自己的需求编写和集成新的插件,从而扩展其功能。

(4)RVIZ2数据可视化工具

  • 作用:RVIZ2是ROS 2中的一个数据可视化工具,用于将机器人感知到的数据(如图像、点云、地图等)以直观的方式显示出来。
  • 特点
    灵活性:RVIZ2支持多种数据类型和可视化方式,可以根据需求进行配置和调整。
    可扩展性:通过插件机制,开发者可以添加新的数据类型和可视化插件,以满足不同的应用需求。

(5)Gazebo仿真工具

  • 作用:Gazebo是一个开源的3D机器人模拟器,用于在虚拟环境中模拟机器人的行为和性能。对于机器人开发人员来说,Gazebo是一个非常重要的工具,因为它可以在不实际构建机器人硬件的情况下进行测试和验证。
  • 特点
    真实物理仿真:Gazebo可以模拟真实世界的物理行为,如重力、碰撞等。
    多传感器模拟:Gazebo支持多种传感器的模拟,如相机、激光雷达等。
    ROS集成:Gazebo与ROS 2无缝集成,使得在仿真环境中进行测试和验证变得非常方便。

一、Launch启动文件

手动启动和关闭多个ROS 2节点效率低下且容易出错。

使用launch文件来管理和启动ROS 2节点,通过一次命令 启动多个节点配置它们的参数

通俗易懂版解释

假设你有一个ROS 2的工作空间,其中有两个节点:li4_node 和wang2_node。这两个节点都位于learning_topic这个包中。

现在,你想要同时启动这两个节点,但不想每次都手动输入命令。所以,你使用了ROS 2的启动文件功能。

你创建了一个launch.py文件。当你运行这个启动文件时,ROS2会自动读取这个文件,并执行generate_launch_description()函数。
这个函数告诉ROS2:“嘿,我需要启动learning_topic包中的li4_node和wang2_node节点。”

然后,ROS 2就会按照你的指示,同时启动这两个节点。这样,你就不需要每次都手动输入命令来启动它们了。

首先,我们需要创建一个launch.py文件
在这里插入图片描述
这次提前把CmakeLists.txt写好,因为代码都是固定不变的。

#launch文件
install(DIRECTORY launch
  DESTINATION share/${PROJECT_NAME})

这段代码的意思是“在构建和安装过程中,让launch目录中的所有文件都被复制到ROS包的share目录中,并以包名为子目录”。
这样,当你或其他人使用ros launch命令来启动你的ROS节点时,它们就能找到正确的启动文件了。

放个完整代码

#(1)导入库
from launch import LaunchDescription
from launch_ros.actions import Node

#(2)定义启动描述生成函数
def generate_launch_description():
    #(3)创建节点描述
    li4_node = Node(
        package="learning_topic",
        executable="li4_node"
    )

    wang2_node =Node(
        package="learning_topic",
        executable="wang2_node",
        parameters=[{'param_money': 20}]
    )

    #(4)生成启动描述
    launch_topic = LaunchDescription([li4_node,wang2_node])
    #(5)返回启动描述
    return launch_topic

开始编写!!

1. 启动多个节点

编写launch文件的步骤:
(1)导入库
(2)定义启动描述生成函数
(3)创建节点描述
(4)生成启动描述
(5)返回启动描述

(1)导入库

from launch import LaunchDescription
from launch_ros.actions import Node
  • LaunchDescription:这是launch库中的一个类,用于创建和管理一个启动描述。启动描述是一组配置参数,用于启动ROS
    2中的节点和其它资源。它是用于描述一个或多个ROS节点的启动配置的。
  • Node:这是launch_ros.actions模块中的一个类,用于定义一个ROS 2节点的启动参数。

(2)定义启动描述生成函数

def generate_launch_description():

定义了一个名为generate_launch_description的启动描述生成函数,这个函数将生成并返回一个启动描述。

(3)创建节点描述

    li4_node = Node(
        package="learning_topic",
        executable="li4_node"
    )

    wang2_node =Node(
        package="learning_topic",
        executable="wang2_node"
    )

创建了一个名为li4_node的节点对象(wang2_node同理)

  • package参数指定了节点所在的ROS 2包名,这里是learning_topic
  • executable参数指定了要执行的可执行文件名,这里是li4_node

(4)生成启动描述

    launch_topic = LaunchDescription([li4_node,wang2_node])

创建了一个LaunchDescription对象,命名为launch_topic
这个对象包含了一个节点列表,列表中包含了之前创建的li4_nodewang2_node两个节点。

(5)返回启动描述

    return launch_topic

最后,这个函数返回了生成的启动描述。这样,当ROS 2的启动文件被调用时,它就会知道需要启动哪些节点。

编译运行一下,打开一个终端

colcon build
source install/setup.sh
ros2 launch learning_topic topic_launch.py

在这里插入图片描述

2. 配置节点参数

想要在launch文件中配置节点的参数,有一个很重要的前提,节点要有“参数”。具体看:ROS2 + C++ 参数(自用笔记)

这里我们简单带过一下

wang2_node节点里声明和创建参数

//补充 声明参数
this->declare_parameter("param_money", 5);

//补充 设置参数
money.data = this->get_parameter("param_money").as_int();

在这里插入图片描述
在这里插入图片描述
然后,我们就可以在lacunch文件里配置参数啦

wang2_node =Node(
   package="learning_topic",
   executable="wang2_node",
   parameters=[{'param_money': 20}]
)

这里把稿费升到20元

最后,编译测试一下有没有成功

在这里插入图片描述


二、rosbag2记录仪

这里我们以小说话题为例

1.录制

(1)打开一个终端,打开工作空间

cd towm_ws

(2)输入录制命令

模版:

  • 记录一个话题 ros2 bag record /话题名称
  • 记录多个话题 ros2 bag record 话题名称1 话题名称2
  • 记录所有话题 ros2 bag record -a
  • 自定义命名输出文件名称 ros2 bag record -o 文件名 话题名称

我们就记录一个话题

ros2 bag record /no_time

在这里插入图片描述

(3)打开另一个终端,开启李四作者节点

source install/setup.sh
ros2 run learning_topic li4_node

在这里插入图片描述
然后,就会自动被记录下来啦(出现红色框,就是正在记录)

在这里插入图片描述
crtl+c停止记录

(3)查看记录文件

打开工作空间文件夹,可以看见多出一个rosbag文件
在这里插入图片描述
点进去,xxx.db3这个就是刚刚记录话题内容的文件
在这里插入图片描述
我们用命令行查看一下此文件的信息

cd rosbag2_2024_06_03-16_36_39
ros2 bag info rosbag2_2024_06_03-16_36_39

在这里插入图片描述
以下文件各个信息的解释:

  • Files:rosbag2_2024_06_03-16_36_39_0.db3
    这是被查询的rosbag文件的名称。它使用了一个日期和时间戳作为名称的一部分,以便更容易地识别录制的时刻。
  • Bag size:24.0 KiB
    这是rosbag文件的大小,表示为千字节(Kibibyte,简称KiB)。
  • Storage id: sqlite3
    这表示rosbag使用的存储后端是SQLite3数据库。
    SQLite3是一个轻量级的、自包含的、无服务器的、零配置的、事务性的SQL数据库引擎。
  • Duration:38.996s
    这是rosbag中数据录制的总时长,即从第一个消息到最后一个消息的时间间隔。在这,录制了大约39秒的数据。
  • Start: Jun 3 2024 16:37:16.242 (1717403836.242)
    这是rosbag中第一个消息的时间戳。它给出了日期(2024年6月3日)、时间(16:37:16)和具体的秒和微秒(.242秒)。
    括号中的数字是时间戳的Unix时间格式(自1970年1月1日以来的秒数)。
  • End: Jun 3 2024 16:37:55.238(1717403875.238)
    这是rosbag中最后一个消息的时间戳。
  • Messages: 14
    这个输出中没有直接显示“Messages”的数量,但从“Topic information”部分可以推断出至少有一个话题上有14条消息。
  • Topic information: Topic: /no_time | Type: std_msgs/msg/String | Count: 14
    这是rosbag中包含的一个话题的名称/no_time,消息类型是std_msgs/msg/String,发布到/no_time话题的消息数量有14条消息。

总的来说,这个rosbag文件记录了大约39秒的数据,包含一个话题/no_time,该话题上有14条std_msgs/msg/String类型的消息。

2.播放

(1)打开一个终端

ros2 topic echo /no_time

执行这个命令后,可以看到终端中打印出所有通过/no_time主题发布的最新消息。如果/no_time这个主题上有消息发布,在终端中就能看到这些消息的内容。如果没有消息发布,那么终端可能会保持静默,直到有消息到达。
在这的主要作用:播放bag文件时,能够看到消息被重新发布并打印出来。

(2)打开另一个终端

ros2 bag play rosbag2_2024_06_03-16_36_39_0.db3

这个命令用于回放一个之前录制的rosbag文件。
在这里插入图片描述


三、RQT工具

RQT(ROS Qt)是一个基于Qt框架的图形用户界面(GUI)工具集,用于ROS(Robot Operating System)系统的监控和调试。它通过插件的方式提供了丰富的界面工具,使得用户能够以图形化的方式管理和分析ROS系统中的节点、主题、服务等。

RQT插件介绍

  • rqt_graph:用于显示ROS通信架构的图形化工具,可以清晰地看到各个节点之间的连接关系。
  • rqt_plot:用于绘制曲线图,可以实时显示话题数据的变化。
  • rqt_console:用于查看ROS系统的日志信息,帮助开发者进行调试。
  • rqt_topic:允许用户订阅和查看ROS主题的消息,提供了一个直观的消息查看界面。
  • rqt_service_caller:提供了一个图形化界面来调用ROS服务。
  • rqt_param:用于管理和查看ROS参数服务器中的参数。
  • rqt_reconfigure:允许用户动态地重新配置节点的参数。
  • rqt_dep:展示了ROS节点之间的依赖关系。

我们现在使用 rqt_graph来查看话题节点之间的关系。

(1)运行话题节点

cd towm_ws
source install/setup.sh
ros2 launch learning_topic topic_launch.py

(2)打开rqt工具

rqt_graph

在这里插入图片描述

我们可以直观的看见,李四通过小说话题发布小说,王二订阅此小说。王二又通过收费话题发布费用,李四订阅此话题来查看收费。

目前只使用了此功能,以后用到其他的再添加。


四、RVIZ2数据可视化工具

暂时没用到,用到后再添加
在这里插入图片描述

五、Gazebo仿真工具

Gazebo就像一个超级逼真的虚拟现实游戏,但它不是为了娱乐,而是为了帮助我们设计、测试和模拟机器人。你不需要真实购买机器人和昂贵的传感器,只需要在电脑里“画”出你的机器人模型,并告诉Gazebo这个机器人有哪些传感器和电机。

当你把这一切都设置好后,Gazebo就会为你创建一个虚拟的“世界”,你的机器人会在这个世界里“生活”。在这个世界里,你的机器人就像真的一样,它的电机可以转动,传感器可以感知环境。而所有这些电机转动的数据、传感器感知的数据,都会通过ROS2发送出来,就像真实机器人做的那样。

所以,我们可以通过Gazebo和ROS2,不仅可以节省大量的金钱,还能加快你的研究和开发速度。

这里用两轮差速小车demo来体验一下

第一步: 下载安装Gazebo

sudo apt install gazebo

第二步: 安装ROS2的两轮差速功能包

sudo apt install ros-humble-gazebo-*

第三步: 运行两轮差速功能包

gazebo /opt/ros/humble/share/gazebo_plugins/worlds/gazebo_ros_diff_drive_demo.world 

第四步: 查看/demo/cmd_demo话题

ros2 topic list -t

在这里插入图片描述
第五步: 让小车动起来

ros2 topic pub /demo/cmd_demo geometry_msgs/msg/Twist "{linear: {x: 0.2,y: 0,z: 0},angular: {x: 0,y: 0,z: 0}}"

在这里插入图片描述
在这里插入图片描述
还可以改一下参数,让小车返回

ros2 topic pub /demo/cmd_demo geometry_msgs/msg/Twist "{linear: {x: -1,y: 0,z: 0},angular: {x: 0,y: 0,z: 0}}"

在这里插入图片描述


总结

自用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值