【ROS2】中级:RViz-构建自定义 RViz 显示

 背景 

在 RViz 中有许多类型的数据已经有现有的可视化。然而,如果有一种消息类型尚未有插件来显示它,那么有两种选择可以在 RViz 中查看它

  1. 将消息转换为另一种类型,例如 visualization_msgs/Marker 。

  2. 编写自定义 RViz 显示。

使用第一个选项,会有更多的网络流量和数据表示的限制。它也快速且灵活。后一种选择在本教程中进行了说明。虽然需要一些工作,但可以带来更丰富的可视化效果。

本教程的所有代码都可以在此存储库 https://github.com/MetroRobots/rviz_plugin_tutorial 中找到。为了查看本教程中编写的插件的增量进展,存储库有不同的分支( step2 , step3 ……),每个分支都可以在您进行时编译和运行。

93b9388f7b6ad90c18d7a49540ba211d.png

cxy@ubuntu2404-cxy:~/ros2_ws$ colcon build --packages-select rviz_plugin_tutorial_msgs
Starting >>> rviz_plugin_tutorial_msgs
Finished <<< rviz_plugin_tutorial_msgs [24.6s]                       


Summary: 1 package finished [24.9s]
cxy@ubuntu2404-cxy:~/ros2_ws$ . install/setup.bash
cxy@ubuntu2404-cxy:~/ros2_ws$ colcon build --packages-select rviz_plugin_tutorial
Starting >>> rviz_plugin_tutorial
Finished <<< rviz_plugin_tutorial [25.8s]                       


Summary: 1 package finished [26.8s]
cxy@ubuntu2404-cxy:~/ros2_ws$ . install/setup.bash
cxy@ubuntu2404-cxy:~/ros2_ws$ ros2 run rviz2 rviz2
[INFO] [1720966890.438943145] [rviz2]: Stereo is NOT SUPPORTED
[INFO] [1720966890.439067206] [rviz2]: OpenGl version: 4.6 (GLSL 4.6)
[INFO] [1720966890.559429080] [rviz2]: Stereo is NOT SUPPORTED

4f07c7cef75a626853d32e590a344d80.png

f15a2ce975353f08f1c4497b3e1456d7.png

Step By Step

 点 2D 消息

我们将使用 rviz_plugin_tutorial_msgs 包中定义的玩具消息: Point2D.msg :

std_msgs/Header header
float64 x
float64 y

基本插件的样板代码

系好安全带,这里有很多代码。您可以使用分支名称 step1 查看此代码的完整版本。

69529cb93af05b89215ce2da5ae940f6.png

头文件 

以下是 point_display.hpp 的内容

// 如果没有定义 RVIZ_PLUGIN_TUTORIAL__POINT_DISPLAY_HPP_,则定义它
#ifndef RVIZ_PLUGIN_TUTORIAL__POINT_DISPLAY_HPP_
#define RVIZ_PLUGIN_TUTORIAL__POINT_DISPLAY_HPP_


// 包含 rviz_common 的消息过滤显示库
#include <rviz_common/message_filter_display.hpp>
// 包含 rviz_plugin_tutorial_msgs 的 Point2D 消息库
#include <rviz_plugin_tutorial_msgs/msg/point2_d.hpp>


// 定义 rviz_plugin_tutorial 命名空间
namespace rviz_plugin_tutorial
{
// 定义 PointDisplay 类,它是 rviz_common::MessageFilterDisplay 类的公共派生类
class PointDisplay
  : public rviz_common::MessageFilterDisplay<rviz_plugin_tutorial_msgs::msg::Point2D>
{
  // 使用 Qt 的元对象系统
  Q_OBJECT


protected:
  // 重写 processMessage 方法,该方法用于处理 Point2D 消息
  void processMessage(const rviz_plugin_tutorial_msgs::msg::Point2D::ConstSharedPtr msg) override;
};
}  // 结束 rviz_plugin_tutorial 命名空间的定义


// 结束 RVIZ_PLUGIN_TUTORIAL__POINT_DISPLAY_HPP_ 的定义
#endif  // RVIZ_PLUGIN_TUTORIAL__POINT_DISPLAY_HPP_
  • 我们正在实现 MessageFilterDisplay 类,该类可用于任何带有 std_msgs/Header 的消息

  • 该类使用我们的 Point2D 消息类型进行模板化。

  • 由于本教程范围之外的原因,您需要在其中使用 Q_OBJECT 宏才能使 GUI 的 QT 部分正常工作。

  • processMessage 是唯一需要实现的方法,我们将在 cpp 文件中实现。

源文件 

point_display.cpp

// 包含 rviz_plugin_tutorial 的 PointDisplay 库
#include <rviz_plugin_tutorial/point_display.hpp>
// 包含 rviz_common 的日志库
#include <rviz_common/logging.hpp>


// 定义 rviz_plugin_tutorial 命名空间
namespace rviz_plugin_tutorial
{
// 定义 PointDisplay 类的 processMessage 方法,该方法用于处理 Point2D 消息
void PointDisplay::processMessage(const rviz_plugin_tutorial_msgs::msg::Point2D::ConstSharedPtr msg)
{
  // 使用 RVIZ_COMMON_LOG_INFO_STREAM 宏打印接收到的消息的帧ID
  RVIZ_COMMON_LOG_INFO_STREAM("We got a message with frame " << msg->header.frame_id);
}
}  // 结束 rviz_plugin_tutorial 命名空间的定义


// 包含 pluginlib 的类列表宏库
#include <pluginlib/class_list_macros.hpp>
// 使用 PLUGINLIB_EXPORT_CLASS 宏导出 PointDisplay 类,使其成为 rviz_common::Display 的插件
PLUGINLIB_EXPORT_CLASS(rviz_plugin_tutorial::PointDisplay, rviz_common::Display)
  • 记录不是严格必要的,但有助于调试。

  • 为了让 RViz 找到我们的插件,我们需要在代码中使用这个 PLUGINLIB 调用

<think>好的,我需要回答用户关于ROS2学习路线的问题。首先,我需要确认用户可能的需求。用户可能是一个刚开始接触ROS2的开发者,或者有一定机器人开发经验但想转向ROS2的人。他们可能希望了解从基础到进阶的系统性学习步骤,以及相关的资源和实践建议。 首先,我应该从ROS2的基础开始,强调其与ROS1的区别,因为这对于有ROS1经验的用户很重要。接着,核心概念如节点、话题、服务、动作等是必须涵盖的。然后,工具和命令行接口的使用,比如ros2 CLI,是实际操作的基础。 接下来,编程部分需要分语言,Python和C++是主要的。用户可能需要选择其中一种或两种都学,因此分开说明比较合适。通信机制深入讲解,包括自定义消息和接口,能帮助用户更好地理解ROS2的数据交换方式。 高级功能如生命周期管理、组件、Launch系统、安全和Docker集成,这些是进阶内容,适合有一定基础的用户。仿真工具如Gazebo和导航2、控制库如ros2_control也是实际项目中常用的,需要提到。 最后,项目实践和社区资源是巩固学习的关键。推荐官方文档和教程,以及参与开源项目,能帮助用户应用所学知识,解决实际问题。 需要注意用户可能对某些术语不熟悉,所以解释时要简明扼要,避免过于技术化。同时,结构要清晰,分步骤说明,让用户能逐步跟进。还要检查是否符合之前的系统指令,比如数学公式的正确格式,但在这个问题中可能用不上,不过要确保LaTeX部分正确,如果有的话。 可能需要验证一些细节,比如ROS2的版本兼容性,当前推荐的工具是否更新,但大体上ROS2的核心概念是稳定的。此外,确保推荐的学习资源仍然有效,比如官方文档链接是否正确,社区资源是否活跃。 总结下来,回答需要分阶段,从基础到高级,涵盖理论、工具、编程、实践和资源,结构清晰,逐步引导用户建立完整的ROS2知识体系。</think>ROS2学习路线可分为**基础→进阶→实战**三个阶段,建议结合理论与实践逐步深入。以下为详细路线: --- ### 一、基础阶段:掌握核心概念与工具链 1. **ROS2基础认知** - 理解ROS2ROS1的核心区别: $$ \text{ROS2} \supset \text{DDS通信} + \text{多语言支持} + \text{实时性增强} $$ - 学习ROS2架构:节点(Node)、话题(Topic)、服务(Service)、动作(Action)等核心概念。 - 安装ROS2推荐版本(如Humble Hawksbill),熟悉`ros2 CLI`命令行工具。 2. **工具链实践** - 使用`colcon`编译工具: ```bash colcon build --symlink-install ``` - 掌握`RQt`可视化工具、`RViz2`三维可视化、`ros2 bag`数据记录与回放。 --- ### 二、进阶阶段:深入通信机制与编程 1. **通信机制实战** - 自定义消息/服务/动作接口(`.msg`, `.srv`, `.action`文件)。 - 理解QoS(服务质量策略)配置,解决网络不稳定问题。 2. **编程语言选择** - **Python**:快速原型开发,学习`rclpy`库。 - **C++**:高性能需求场景,掌握`rclcpp`库与生命周期管理。 3. **关键技能** - 参数服务器(Parameter Server)动态配置。 - 组件化编程(Component)与节点生命周期管理。 - Launch文件编写:实现多节点协同启动。 --- ### 三、高级阶段:系统集成与项目实战 1. **高级功能** - 安全机制:SROS2配置与DDS安全插件。 - 分布式系统:跨设备通信与`ROS_DOMAIN_ID`隔离。 - Docker容器化部署。 2. **仿真与算法** - 使用**Gazebo**或**Ignition**进行物理仿真。 - 学习`Navigation2`(导航栈)、`ros2_control`(控制器框架)。 3. **项目实战** - **初级项目**:构建移动机器人SLAM与路径规划。 - **中级项目**:机械臂运动控制+视觉抓取。 - **高级项目**:多机器人协同或自动驾驶仿真。 --- ### 四、学习资源推荐 1. **官方文档**:[ROS2官方教程](https://docs.ros.org/en/humble/) 2. **书籍**:《Programming with ROS2》、《ROS2机器人开发实战》 3. **社区**:ROS问答社区(https://answers.ros.org)、GitHub开源项目(如TurtleBot4、Nav2) 4. **课程**:Coursera《ROS2 Fundamentals》、Udemy《ROS2 For Beginners》 --- ### 五、避坑指南 1. **版本匹配**:确保ROS2版本与依赖库(如Gazebo、OpenCV)兼容。 2. **调试技巧**:善用`ros2 doctor`检查环境,`--log-level DEBUG`输出详细日志。 3. **性能优化**:避免频繁创建销毁节点,合理使用`Executor`与回调组。 --- 通过以上路线,结合**“学--迭代”**循环(例如:学完通信机制→实现自定义消息传输→优化QoS策略),可逐步构建完整的ROS2开发能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值