【ROS1】Noetic 开发工作流程与常用命令

适用于 ROS1 Noetic (Ubuntu 20.04),以 catkin 工作空间 + roscpp C++ 为例。

界面开发使用 Qt Designer + Qt5 (C++),依赖:qtbase5-dev、qttools5-dev、PyQt5(已装)。


一、环境准备(每次开终端必做)

bash 复制代码
source /opt/ros/noetic/setup.bash          # 加载 ROS 系统环境
source ~/catkin_ws/devel/setup.bash        # 加载自己工作空间环境(编译后才有)

建议把这两行写进 ~/.bashrc,以后新终端自动生效。


二、创建工作空间 & 功能包

bash 复制代码
# 1. 创建工作空间
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws
catkin_make                                # 初次编译,生成 build/ devel/

# 2. 进入 src 创建功能包(roscpp + std_msgs 依赖)
cd ~/catkin_ws/src
catkin_create_pkg hello_world roscpp std_msgs

三、编写代码 → 编译循环

bash 复制代码
# 编辑 CMakeLists.txt / package.xml / src/*.cpp 后编译
cd ~/catkin_ws
catkin_make                                # 全量编译

# 只编译指定包(加快速度)
catkin_make --only-pkg-with-deps hello_world

# 或者用 catkin 工具
catkin build hello_world

每次新建/修改可执行文件后,记得在 CMakeLists.txt 里加 add_executable(...),

并重新 source devel/setup.bash。


四、运行与调试(多终端)

终端 1 --- 启动 ROS 主节点:

bash 复制代码
roscore

终端 2 --- 运行你的节点:

bash 复制代码
source ~/catkin_ws/devel/setup.bash
rosrun hello_world hello_world_node

终端 3 --- 观察话题:

bash 复制代码
rostopic list                   # 列出所有话题
rostopic echo /hello_topic      # 实时查看话题消息
rostopic hz /hello_topic        # 查看发布频率
rostopic info /hello_topic      # 查看话题的发布者/订阅者

五、常用调试 / 可视化工具

bash 复制代码
rosnode list                       # 列出运行中的节点
rosnode info /hello_world_node     # 查看某节点详细信息
rosnode kill /hello_world_node     # 关闭指定节点

roswtf                             # ROS 系统健康检查
rqt_graph                          # 图形化显示节点/话题连接关系
rqt_console                        # 查看日志(INFO/WARN/ERROR)
rqt_plot                           # 绘制数值话题曲线

rosrun rqt_console rqt_console     # 或逐个启动

日志与包目录:

bash 复制代码
roscd hello_world                  # 直接跳转到包目录
roslaunch hello_world xxx.launch   # 用 launch 文件启动(roscore + 节点一起)

六、Qt Designer 界面开发(widgets / 图形化节点)

工具链已安装:designer、qtbase5-dev、qttools5-dev、uic、PyQt5。

适用于给 ROS 节点做图形界面(控制面板、数据可视化、参数调节等)。

6.1 检查工具链

bash 复制代码
designer --version                 # Qt Designer
which uic && uic --version         # .ui -> C++ 头文件
python3 -c "import PyQt5.QtCore as c; print(c.PYQT_VERSION_STR)"   # PyQt5(Python 路线)

6.2 用 Designer 画界面

bash 复制代码
designer

新建 MainWindow → 拖控件(QLabel、QPushButton、QTextEdit 等)→

保存到包的 ui/ 目录,例如 hello_gui/ui/mainwindow.ui。

6.3 路线 A:C++ + Qt5 + catkin(推荐,依赖已装)

CMakeLists.txt 关键片段(AUTOUIC 自动把 .ui 编译成 C++):

cmake 复制代码
cmake_minimum_required(VERSION 3.0.2)
project(hello_gui)

set(CMAKE_AUTOUIC ON)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
add_compile_options(-std=c++14)

find_package(catkin REQUIRED COMPONENTS roscpp std_msgs)
find_package(Qt5 REQUIRED COMPONENTS Widgets)
catkin_package()

include_directories(${catkin_INCLUDE_DIRS})

add_executable(hello_gui_node
  src/main.cpp
  src/mainwindow.cpp
  src/mainwindow.h
  ui/mainwindow.ui
)
target_link_libraries(hello_gui_node
  ${catkin_LIBRARIES}
  Qt5::Widgets
)

src/main.cpp 中同时初始化 ROS 与 Qt:

cpp 复制代码
#include <QApplication>
#include <ros/ros.h>
#include "mainwindow.h"

int main(int argc, char** argv)
{
  ros::init(argc, argv, "hello_gui_node");
  QApplication app(argc, argv);
  MainWindow w;
  w.show();
  return app.exec();
}

构建运行:

bash 复制代码
cd ~/catkin_ws && catkin_make --only-pkg-with-deps hello_gui
source devel/setup.bash
rosrun hello_gui hello_gui_node

6.4 路线 B:Python + PyQt5 + rospy(快速原型)

python 复制代码
#!/usr/bin/env python3
from PyQt5 import uic, QtWidgets
import rospy, sys

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()
        uic.loadUi("ui/mainwindow.ui", self)          # 直接加载 .ui
        # self.pushButton.clicked.connect(self.on_click)

if __name__ == "__main__":
    rospy.init_node("hello_gui_node")
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    app.exec_()

6.5 无需编译即可预览 .ui

bash 复制代码
pyuic5 -x ui/mainwindow.ui -o ui_preview.py && python3 ui_preview.py   # Python 预览
uic ui/mainwindow.ui -o ui_mainwindow.h                                # 生成 C++ 头文件

说明:designer 中 Ctrl+R 可实时预览界面,无需编译整个工程。


七、rosbag 录制 / 回放(调试利器)

bash 复制代码
rosbag record -a                        # 录制所有话题
rosbag record /hello_topic              # 录制指定话题
rosbag info xxx.bag                     # 查看 bag 信息
rosbag play xxx.bag                     # 回放
rosbag play xxx.bag -r 2                # 2 倍速回放

八、完整开发流程(浓缩版)

复制代码
① source 环境
   └→ source /opt/ros/noetic/setup.bash
   └→ source ~/catkin_ws/devel/setup.bash

② 改代码 (src/*.cpp + CMakeLists.txt [+ ui/*.ui ------ Qt Designer])

③ 编译
   └→ cd ~/catkin_ws && catkin_make

④ 运行
   └→ 终端1: roscore
   └→ 终端2: rosrun hello_world hello_world_node(或 hello_gui / *_gui)

⑤ 调试
   └→ rostopic echo / rqt_graph / rqt_console / rosbag

⑥ 排错
   └→ roswtf / rosnode info / 看日志

九、常见问题速查

现象 排查命令 / 解决
rosrun 找不到包 忘了 source devel/setup.bash
端口 11311 被占用 已有 roscore 在跑,pkill roscore 后重来
编译报找不到头文件 检查 target_link_libraries / find_package 依赖
节点间无法通信 roswtf、检查 ROS_MASTER_URI / ROS_IP
改了 CMake 没生效 删 build/ devel/ 后重新 catkin_make
Qt 报 /usr/bin/ld: cannot find -lQt5Widgets 未链接 Qt5::Widgets,检查 find_package(Qt5 ...) 与 target_link_libraries
找不到 ui_mainwindow.h CMAKE_AUTOUIC 未开或 .ui 未加入 add_executable 源列表
界面启动崩溃 / 无显示 无 GUI 时需 export DISPLAY=:0,或远程用 ssh -X
Designer 中文乱码 修改字体,或代码中设置编码为 UTF-8
uic 命令找不到 安装 sudo apt install qttools5-dev-tools

十、升级为工程化(可选)

当节点变多后,用 launch 文件 替代手动 roscore + rosrun:

bash 复制代码
roslaunch hello_world hello_world.launch

GUI 节点在 launch 中也可一并启动;需要图形化调试时配合 rqt_graph 观察。

相关推荐
云深麋鹿42 分钟前
C++ | 基于红黑树实现mymap与myset
开发语言·c++
傲世仙尊2 小时前
string增删查改-insert-erase-replace与find加substr组合技
c++
·present·4 小时前
CSAPP(lecture 3)
c++
别动我齐刘海4 小时前
机器人 C++ / 系统联调补强2——异常处理、Protobuf
linux·c++·人工智能·学习·算法·机器学习·机器人
basketball6164 小时前
C++ 中字符串与常见类型的转换总结
开发语言·c++
等我调个Bug5 小时前
C++智能指针通俗讲解
开发语言·c++
承渊政道5 小时前
Linux网络学习【传输层协议UDP】
linux·网络·网络协议·学习·ubuntu·udp
kyle~7 小时前
时间同步 --- PTP 与 Scheduled Action Command
c++·数码相机·机器人·传感器