适用于 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观察。