Ubuntu 22.04 + ROS2 Humble 环境下设计图形化交互界面

在 Ubuntu 22.04 + ROS2 Humble 环境下设计图形化交互界面,有多种选择,从快速搭建原型到深度定制应用。以下是几种主流方法及其具体安装和使用步骤。


1. rqt -- ROS2 官方图形化工具框架

rqt 是基于 Qt 的插件化 GUI 框架,允许您通过拖拽插件快速构建界面,也支持开发自定义插件。

安装

bash 复制代码
sudo apt update
sudo apt install ros-humble-rqt*  # 安装所有常用 rqt 插件

使用

  • 启动 rqt

    bash 复制代码
    source /opt/ros/humble/setup.bash
    rqt
  • 加载插件 :通过菜单栏 Plugins 选择所需插件(如话题监视、参数动态配置等)。

  • 开发自定义插件

    1. 创建 ROS2 包(Python):

      bash 复制代码
      ros2 pkg create my_rqt_plugin --build-type ament_python --dependencies rqt_gui rqt_gui_py
    2. 编写插件类(继承 rqt_gui_py.Plugin)并实现 setup 方法。

    3. setup.py 中添加 entry_points,例如:

      python 复制代码
      entry_points={
          'console_scripts': [
              'my_rqt_plugin = my_rqt_plugin.my_module:main',
          ],
      }
    4. 编译并运行:

      bash 复制代码
      colcon build --packages-select my_rqt_plugin
      source install/setup.bash
      rqt --force-discover  # 重新扫描插件

      之后在 Plugins 菜单中即可找到您的插件。


2. RViz2 -- 3D 可视化工具

RViz2 是 ROS2 的 3D 可视化工具,主要用于显示机器人模型、传感器数据、地图等。您可以通过配置文件定制界面,也可以开发自己的显示插件。

安装

bash 复制代码
sudo apt install ros-humble-rviz2

使用

  • 启动 RViz2

    bash 复制代码
    source /opt/ros/humble/setup.bash
    rviz2
  • 加载显示项 :点击左下角 Add 按钮,选择要显示的数据类型(如 RobotModel、LaserScan 等)。

  • 保存配置 :通过 File -> Save Config As 保存 .rviz 文件,下次可直接加载。

  • 开发自定义显示插件 :需要 C++ 开发,参考 ROS2 RViz 插件教程


3. Foxglove Studio -- 现代跨平台可视化工具

Foxglove Studio 是一款功能强大的可视化工具,支持 ROS2 桥接,界面现代,支持布局定制、实时数据回放、扩展开发等。

安装

  • AppImage 方式 (推荐,免安装):

    1. Foxglove 官网 下载 Linux AppImage。

    2. 赋予执行权限并运行:

      bash 复制代码
      chmod +x Foxglove-Studio-*.AppImage
      ./Foxglove-Studio-*.AppImage
  • 通过 apt 安装 (Ubuntu 22.04 可用):

    bash 复制代码
    sudo apt install -y software-properties-common
    sudo add-apt-repository ppa:foxglove/studio
    sudo apt update
    sudo apt install foxglove-studio

使用

  1. 启动 Foxglove Studio
  2. 连接 ROS2
    • 确保 ROS2 环境已 source(source /opt/ros/humble/setup.bash)。

    • 在 Foxglove 中点击 "Open connection",选择 "Rosbridge" 或 "ROS2"。

    • 如果选择 Rosbridge,需先在终端启动 rosbridge:

      bash 复制代码
      ros2 run rosbridge_server rosbridge_websocket

      然后在 Foxglove 中输入 ws://localhost:9090 连接。

  3. 添加面板:通过左侧面板库拖拽各种面板(如 3D、Plot、Image 等),并订阅相应话题。
  4. 保存布局:可将布局保存为 JSON 文件,方便复用。

4. Qt + ROS2(C++) -- 自定义 GUI 应用

如果您需要完全定制化的界面,可以使用 Qt5/Qt6 结合 ROS2 C++ 库开发独立应用。

安装依赖

bash 复制代码
sudo apt install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools \
                 libqt5svg5-dev libqt5websockets5-dev
# 确保 ROS2 Humble 已安装(桌面完整版)

创建 ROS2 包并集成 Qt

  1. 创建功能包

    bash 复制代码
    ros2 pkg create my_qt_app --build-type ament_cmake --dependencies rclcpp std_msgs
    cd my_qt_app
  2. 修改 CMakeLists.txt

    cmake 复制代码
    find_package(Qt5 REQUIRED COMPONENTS Core Widgets)
    set(QT_LIBS Qt5::Widgets)
    
    add_executable(my_qt_app src/main.cpp)
    target_link_libraries(my_qt_app ${QT_LIBS} rclcpp::rclcpp)
    ament_target_dependencies(my_qt_app rclcpp std_msgs)
    install(TARGETS my_qt_app DESTINATION lib/${PROJECT_NAME})
  3. 编写 Qt 界面代码 (如 src/main.cpp):

    cpp 复制代码
    #include <QApplication>
    #include <QPushButton>
    #include <rclcpp/rclcpp.hpp>
    
    int main(int argc, char *argv[]) {
        rclcpp::init(argc, argv);
        QApplication app(argc, argv);
    
        QPushButton button("Hello ROS2");
        button.show();
    
        auto node = std::make_shared<rclcpp::Node>("qt_node");
        // 添加 ROS2 逻辑,例如定时器、订阅等
    
        return app.exec();
    }
  4. 编译与运行

    bash 复制代码
    colcon build --packages-select my_qt_app
    source install/setup.bash
    my_qt_app

5. PyQt5 / PySide2 + rclpy -- Python 快速开发

使用 Python 和 Qt 绑定库可以快速开发界面,并通过 rclpy 与 ROS2 交互。

安装 PyQt5 和 ROS2 Python 依赖

bash 复制代码
sudo apt install python3-pyqt5  # 或 pip install PyQt5
# ROS2 Humble 的 Python 客户端已默认安装

编写示例应用

  1. 创建 Python 脚本 (如 my_gui.py):

    python 复制代码
    import sys
    from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton
    import rclpy
    from std_msgs.msg import String
    
    class MainWindow(QMainWindow):
        def __init__(self):
            super().__init__()
            self.node = rclpy.create_node('gui_node')
            self.pub = self.node.create_publisher(String, 'chatter', 10)
    
            button = QPushButton("Publish Hello")
            button.clicked.connect(self.publish_hello)
            self.setCentralWidget(button)
    
        def publish_hello(self):
            msg = String()
            msg.data = "Hello from GUI"
            self.pub.publish(msg)
    
    def main():
        rclpy.init()
        app = QApplication(sys.argv)
        window = MainWindow()
        window.show()
    
        # 需要定期调用 rclpy.spin_once 处理 ROS 事件
        timer = app.startTimer(100)  # 每100ms触发一次
        def process_ros():
            rclpy.spin_once(window.node, timeout_sec=0)
        app.timerEvent = lambda event: process_ros()
    
        sys.exit(app.exec_())
        rclpy.shutdown()
    
    if __name__ == '__main__':
        main()
  2. 运行

    bash 复制代码
    source /opt/ros/humble/setup.bash
    python3 my_gui.py

    同时可启动一个订阅者查看消息:

    bash 复制代码
    ros2 topic echo /chatter

补充说明

  • 环境设置 :使用任何 ROS2 命令前,务必 source ROS2 环境(source /opt/ros/humble/setup.bash)。
  • 工作空间 :若开发自定义包,建议创建工作空间(如 ~/ros2_ws)并在其中构建。
  • 调试 :可使用 ros2 run 或直接运行可执行文件。
相关推荐
柏木乃一2 小时前
Linux线程(2)线程的优点和缺点/线程异常/posix线程库原理
linux·运维·服务器·c++·线程·posix
2301_808414382 小时前
Linux的权限
linux·运维·服务器
witAI2 小时前
**即梦仿真人剧2025推荐,沉浸式情感交互新体验**据
python·交互
wbs_scy2 小时前
从零手搓实现 Linux 简易 Shell:内建命令 + 环境变量 + 程序替换全解析
linux·运维·服务器
Hello World . .2 小时前
Linux:TCP并发服务器实现
linux·运维·服务器
IT枫斗者2 小时前
CentOS 7 一键部署 K8s 1.23 + Rancher 2.7 完整指南
java·linux·spring boot·后端·kubernetes·centos·rancher
江湖有缘2 小时前
基于华为openEuler搭建Coolmonitor监控服务
linux·华为云·openeuler
the sun342 小时前
Linux上位机开发中的串口termios库函数使用
linux·运维·服务器
XerCis2 小时前
Linux内网环境无法访问外网的情况下安装程序
linux·运维·服务器