当年学ROS的时候,我犯过一个特别蠢的错:把网上所有“常用命令”抄在笔记本上,背了两天,结果一上真机还是懵。后来才明白,命令不是靠背的,而是靠“场景驱动”去理解的。你只有在排查话题不更新、节点反复崩溃、TF树对不齐、bag回放时间轴错乱的时候,把这些命令真正用一遍,它们才会变成你的肌肉记忆。
这篇东西我很早就想写了,起因是群里太多人问“ROS常用命令有哪些”,然后有人甩一张几十条命令的截图。说真的,列表没错,但它缺少一个东西:每条命令到底该在什么故障现场用。所以我按自己的调试经验,把ROS1环境里最高频的命令重新梳理了一遍。没装好ROS的可以先去看一键安装的教程,我这里默认你已经能在终端里跑通roscore,下面直接进入干货。
1. 装完环境后先别急着跑Demo:几条“地基”级命令帮你确认本体状态
1.1 roscore、ROS_MASTER_URI 和节点注册:ROS分布式架构的第一道门槛
很多人跑完教程,看到新终端窗口就习惯性敲 rosrun,结果等半天找不到节点,报错还没看明白。这里最容易被忽略的是:ROS 不是单进程软件,它默认是个“主从式”通信架构。所有节点要先到 ROS Master 那里注册自己,然后才能互相发现、收发话题。
确认 Master 是否活着,命令非常简单:
bash复制roscore
它会启动一个 rosout、一个 master,还有一个参数服务器。正常启动后在另一个终端里可以用:
bash复制rosnode list
如果能看到 /rosout,至少说明Master在跑。要是看到 ERROR: unable to communicate with master,先看 ROS_MASTER_URI 环境变量对不对:
bash复制echo $ROS_MASTER_URI
常见输出是 http://localhost:11311。如果换成了别的IP,或者本地调试时多个终端彼此设置不一致,节点就根本注册不到同一个Master上。这点在多机分布式跑机器人时尤其容易出事,主从机都要指向同一台机器的同一个端口。
1.2 rospack与rosversion:先搞清楚你现在用的是哪个ROS发行版
每个ROS发行版对应的系统环境不一样。Kinetic对应Ubuntu16.04,Melodic对应Ubuntu18.04,Noetic对应Ubuntu20.04。你拿Melodic的教程跑到Noetic环境里,部分的包源、Python版本都会不兼容。
常用排查命令是:
bash复制rosversion -d
它会直接输出当前shell环境中ROS的版本名。如果输出为空,说明你当前终端的ROS环境没有source过。这时候需要手动来源一下:
bash复制source /opt/ros/noetic/setup.bash
发行版名写不熟没关系,用 ls /opt/ros/ 看看到底装了哪个目录:
bash复制ls /opt/ros/
能看到 noetic 或 melodic 之类的目录。这个做法在排查环境问题时比翻设置文件快得多。
1.3 source环境变量这件事:为什么你每次开终端都要执行同一句话
ROS装好后,终端里默认不会自动加载ROS路径,必须执行:
bash复制source /opt/ros/noetic/setup.bash
很多教程会让你把它写进 ~/.bashrc 文件。但有个细节值得单独拎出来:当你创建了自己的工作空间后,还需要再 source 一份 devel/setup.bash,而且这个source必须放在ROS系统setup之后。
我自己吃过这个亏。只source了系统的ROS环境,然后运行 rosrun 我自己写的包 节点,发现老是提示找不到包。因为系统ROS环境只知道 /opt/ros/noetic/share 下的包,不知道你 ~/catkin_ws/devel 里的包。执行 rospack find 包名 找不到,rosrun 自然也就没了下文。
正确的叠加逻辑是:
bash复制source /opt/ros/noetic/setup.bash
source ~/catkin_ws/devel/setup.bash
这里的 ~/catkin_ws 是我自己的工作空间,你换成自己的路径就行。顺手可以用 echo $ROS_PACKAGE_PATH 查看当前包搜索路径,如果能看到你的工作空间目录,那说明source成功。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 工作空间与功能包:catkin命令用不好,后面写代码全是泪
2.1 catkin_create_pkg的正确姿势:依赖不是越多越好
创建一个新功能包的命令非常固定:
bash复制cd ~/catkin_ws/src
catkin_create_pkg my_robot_pkg roscpp rospy std_msgs
这条命令会生成 my_robot_pkg 目录,里面带着 CMakeLists.txt、package.xml 和两个代码目录。很多新手会漏掉最后的依赖参数,创建出来的包几乎是空的,后面写节点前又要手动往 package.xml 里补 <depend> 标签,特别麻烦。
所以创建包之前最好想清楚这包大概要用到什么接口。常用的依赖项我列了一个快速参考表:
| 依赖包名 | 典型用途 |
|---|---|
| roscpp | 用C++写ROS节点 |
| rospy | 用Python写ROS节点 |
| std_msgs | 标准消息,比如String、Int32 |
| sensor_msgs | 传感器数据,比如Image、LaserScan、Imu |
| geometry_msgs | 几何消息,比如Pose、 |
