机器人Linux开发命令速查手册:从环境搭建到ROS2部署全覆盖
导读:SSH连板卡调驱动、colcon编译ROS2节点、Docker隔离仿真环境、git管理算法代码——机器人开发从底层驱动到上层部署,每个环节都绕不开终端。本手册覆盖Linux基础、Git版本控制、Vim快速编辑、Docker容器化、ROS2全流程五大模块,附思维导图总览、场景速查表和故障排查决策树,从嵌入式调参到多机协作一册搞定。
命令全景图
mindmap
root((机器人Linux<br/>开发命令))
Linux基础
文件目录
ls
cd
mkdir
cp
mv
rm
查看搜索
cat
less
tail -f
grep
find
权限管理
chmod
chown
系统进程
free
ps
top
kill
网络
ip addr
ping
ssh
scp
压缩解压
tar
zip
管道重定向
|
>
>>
Git版本控制
配置
git config
仓库
git init
git clone
提交
git add
git commit
分支
git branch
git checkout
git merge
远程
git push
git pull
回退
git reset
git stash
Vim编辑器
模式切换
i
ESC
:
光标移动
hjkl
gg
G
编辑
yy
dd
u
保存退出
:wq
:q!
Docker容器
镜像
docker pull
docker build
docker images
容器
docker run
docker exec
docker ps
docker stop
GPU
nvidia-smi
--gpus all
编排
docker compose
ROS2机器人
环境
source setup.bash
ROS_DOMAIN_ID
编译
colcon build
ros2 pkg create
通信
topic
service
action
调试
ros2 bag
rviz2
rqt_graph
ros2 doctor
1. Linux 基础命令
mindmap
root((Linux<br/>基础命令))
文件目录
ls -la
pwd
cd ~
mkdir -p
touch
cp -r
mv
rm -rf
查看搜索
cat
less
tail -f
head -n
grep -rn
grep -i
find
which
whereis
权限管理
chmod +x
chmod 755
chown
系统进程
free -h
df -h
ps aux
htop
kill -9
dmesg
uname -r
uptime
网络
ip addr
ping
nmcli
curl
wget
ssh
scp
压缩解压
tar -zcvf
tar -zxvf
zip
unzip
管道重定向
|
>
>>
tee
1.1 文件目录
| 命令 | 用途 | 示例 |
|---|---|---|
ls -la |
查看目录(含隐藏文件+权限) | ls -la /dev/ttyUSB* |
pwd |
显示当前路径 | — |
cd ~ && cd - |
回家目录,再切回上一个 | — |
mkdir -p |
递归创建多级目录 | mkdir -p src/robot/include |
touch |
创建空文件 | touch main.cpp |
cp -r |
递归复制目录 | cp -r src/ backup/ |
mv |
移动或重命名 | mv old_name new_name |
rm -rf |
删除目录(慎用,先ls确认路径) |
rm -rf build/ install/ log/ |
1.2 文件查看与搜索
| 命令 | 用途 | 示例 |
|---|---|---|
cat |
查看全部内容 | cat /proc/cpuinfo |
less |
分页查看大文件(q退出) | less /var/log/syslog |
tail -f |
实时跟踪日志 | tail -f /var/log/syslog |
head -n N |
查看前N行 | head -n 20 build.log |
nl |
带行号查看 | nl CMakeLists.txt |
grep -rn |
递归搜索+行号 | grep -rn "error" src/ |
grep -i |
忽略大小写搜索 | grep -i "warning" build.log |
find |
按文件名查找 | find . -name "*.launch.py" |
which |
确认命令路径 | which ros2 && which colcon |
whereis |
查找命令及man路径 | whereis gcc |
1.3 权限管理
| 命令 | 用途 | 示例 |
|---|---|---|
chmod +x |
添加可执行权限 | chmod +x deploy.sh |
chmod 755 |
设置标准目录权限 | chmod 755 ~/ros2_ws/ |
chown |
改文件/设备归属 | sudo chown $USER:$USER /dev/ttyUSB0 |
嵌入式调试常用:串口设备默认属root/dialout组,把自己加入dialout组:
sudo usermod -aG dialout $USER
1.4 系统与进程
| 命令 | 用途 | 示例 |
|---|---|---|
free -h |
查看内存用量 | — |
df -h |
查看磁盘用量 | df -h /home |
ps aux \| grep |
查找进程 | ps aux \| grep ros |
top / htop |
实时进程监控 | — |
kill -9 PID |
强制结束进程 | kill -9 12345 |
dmesg \| tail |
查看内核日志(插拔设备必用) | dmesg \| tail -20 |
uname -r |
查看内核版本 | — |
lsb_release -a |
查看Ubuntu发行版 | — |
uptime |
系统运行时长+负载 | — |
1.5 网络
| 命令 | 用途 | 示例 |
|---|---|---|
ip addr show |
查看本机IP | — |
ping |
测试连通性 | ping 192.168.170.128 |
nmcli |
NetworkManager管理 | nmcli device wifi connect "SSID" password "pwd" |
curl -I |
测试HTTP服务是否在线 | curl -I http://localhost:11311 |
wget |
下载文件 | wget https://example.com/file.tar.gz |
ssh |
远程连接 | ssh hello@192.168.170.128 |
scp |
远程拷贝 | scp build/*.deb user@robot:/tmp/ |
1.6 压缩解压
| 命令 | 用途 |
|---|---|
tar -zcvf archive.tar.gz dir/ |
打包压缩 |
tar -zxvf archive.tar.gz -C /tmp/ |
解压到指定目录 |
zip -r archive.zip dir/ |
压缩为zip |
unzip archive.zip -d /tmp/ |
解压zip |
1.7 管道与重定向
| 符号 | 用途 | 示例 |
|---|---|---|
\| |
管道:前命令输出=后命令输入 | ros2 topic list \| grep scan |
> |
覆盖写入文件 | colcon build > build.log 2>&1 |
>> |
追加写入文件 | echo "export ROS_DOMAIN_ID=42" >> ~/.bashrc |
2>&1 |
错误输出合并到标准输出 | colcon build 2>&1 \| tee build.log |
tee |
同时输出到屏幕和文件 | ros2 launch pkg demo.launch.py 2>&1 \| tee run.log |
2. Git 版本控制
2.1 基础配置与仓库
# 全局配置(仅首次)
git config --global user.name "linuxros"
git config --global user.email "dev@linuxros.com"
git config --list # 查看当前配置
# 仓库操作
git init # 初始化本地仓库
git clone git@github.com:user/repo.git # 克隆远程仓库
2.2 日常提交流程
git status # 随时查看状态(养成习惯)
git add src/new_node.cpp # 添加指定文件(别用 git add .)
git commit -m "feat: add lidar driver" # 提交到本地
2.3 分支管理
git branch # 查看本地分支
git branch -a # 查看所有分支(含远程)
git checkout -b feat/gazebo-sim # 创建并切换到新分支
git switch feat/gazebo-sim # 切换分支(Git 2.23+)
git merge feat/gazebo-sim # 合并到当前分支
git branch -d feat/gazebo-sim # 删除已合并分支
2.4 远程同步
git remote add origin git@github.com:user/repo.git
git push -u origin main # 首次推送并关联上游
git pull --rebase origin main # 拉取更新(rebase保持历史线性)
git fetch --all # 获取所有远程分支
2.5 版本回退与暂存
git log --oneline -10 # 看最近10条提交
git log --graph --oneline --all # 图形化查看分支历史
git diff HEAD~1 src/ # 查看本次改动
git diff --staged # 查看已暂存的改动
git reset --hard HEAD~1 # 回退到上一个版本(慎用!)
git checkout -- src/broken.cpp # 撤销单个文件修改
git stash # 暂存当前修改
git stash pop # 恢复暂存的修改
git stash list # 查看暂存列表
2.6 Git 分支工作流
flowchart LR
subgraph 分支策略["🟢 分支策略"]
direction TB
M1["main 主分支"]
M2["git checkout -b \nfeat/lidar"]
M3["开发: vim + build"]
M4["git commit -m"]
M5["git push origin \nfeat/lidar"]
M6["git checkout main"]
M7["git merge feat/lidar"]
M8(["✅ 合并完成\n删除分支"])
M1 --> M2 --> M3 --> M4 --> M5 --> M6 --> M7 --> M8
end
subgraph 异常处理["🔴 异常处理"]
direction TB
E1["编译失败"]
E2["git diff 查改动"]
E3["git checkout -- file\n撤销修改"]
E4("重新修改")
E1 --> E2 --> E3 --> E4
E4 -.->|"返回"| M3
end
M3 -.->|"编译失败"| E1
style M1 fill:#E3F2FD,stroke:#1976D2
style M8 fill:#E8F5E9,stroke:#388E3C
style E1 fill:#FFEBEE,stroke:#D32F2F
style E3 fill:#FFEBEE,stroke:#D32F2F
3. Vim 编辑器速查
机器人开发中最常见场景:远程SSH改
.bashrc、调launch参数、修CMakeLists.txt
3.1 模式切换
| 操作 | 效果 |
|---|---|
i |
光标前进入插入模式 |
a |
光标后进入插入模式 |
o |
下一行进入插入模式 |
ESC |
返回普通模式 |
: |
进入底线命令模式 |
3.2 光标移动
| 操作 | 效果 |
|---|---|
h/j/k/l |
左/下/上/右 |
0 / $ |
行首 / 行尾 |
gg / G |
文档开头 / 末尾 |
:N |
跳到第N行 |
Ctrl+f / Ctrl+b |
向下/向上翻页 |
3.3 编辑操作
| 操作 | 效果 |
|---|---|
yy → p |
复制当前行并粘贴到下一行 |
nyy |
复制n行 |
dd |
删除/剪切当前行 |
ndd |
删除/剪切n行 |
x |
删除光标处字符 |
u |
撤销 |
Ctrl+r |
重做 |
3.4 搜索与保存
| 操作 | 效果 |
|---|---|
/关键词 |
向下搜索,n 下一个,N 上一个 |
:w |
保存 |
:q |
退出 |
:wq |
保存并退出 |
:q! |
强制不保存退出 |
:set nu |
显示行号 |
:set paste |
粘贴模式(避免缩进错乱) |
3.5 Vim 三种模式切换
flowchart LR
N["🔵 普通模式 Normal\n(hjkl移动 / gg/G跳转)"] -->|"i / a / o"| I["🟢 插入模式 Insert\n(编辑内容)"]
I -->|"ESC"| N
N -->|":"| C["🟣 命令模式 Command\n(:w / :q / :set nu)"]
C -->|"ESC / 回车执行"| N
I -->|"ESC → :"| C
style N fill:#E3F2FD,stroke:#1976D2
style I fill:#E8F5E9,stroke:#388E3C
style C fill:#F3E5F5,stroke:#7B1FA2
4. Docker 容器
ROS2版本共存、Gazebo依赖冲突、环境隔离——Docker解决90%的"我这能跑你那不行"
4.1 服务与镜像
# 服务管理
sudo systemctl start docker # 启动Docker服务
sudo systemctl enable docker # 开机自启
sudo systemctl status docker # 查看服务状态
# 镜像操作
docker pull osrf/ros:humble-desktop-full # ROS2 Humble官方镜像(完整版~2.5G)
docker pull osrf/ros:jazzy-desktop # ROS2 Jazzy官方镜像
docker images # 查看本地镜像列表
docker rmi old_image:v1 # 删除镜像
docker build -t my_robot:v1 . # 从Dockerfile构建自定义镜像
4.2 容器操作
# 创建并运行容器(开发模式)
docker run -dit --name ros_dev \
--network host \ # 网络host模式(ROS2 DDS通信必需)
-v /home/$USER/code:/workspace \ # 挂载代码目录
-v /tmp/.X11-unix:/tmp/.X11-unix \ # X11转发(GUI应用)
-e DISPLAY=$DISPLAY \
osrf/ros:humble-desktop-full
# 常用操作
docker ps # 查看运行中容器
docker ps -a # 查看所有容器(含已停止)
docker start ros_dev # 启动已停止的容器
docker exec -it ros_dev bash # 进入容器bash
docker logs -f ros_dev # 实时日志
docker stop ros_dev && docker rm ros_dev # 停止并删除容器
4.3 GPU支持
# 安装nvidia-container-toolkit后
docker run --gpus all ... # 容器内使用全部GPU
docker run --gpus '"device=0"' ... # 指定GPU设备
# 验证:容器内执行 nvidia-smi
4.4 数据与编排
docker cp ros_dev:/workspace/log ./ # 容器→宿主机拷贝文件
docker cp ./config.yaml ros_dev:/workspace/ # 宿主机→容器拷贝文件
# Docker Compose
docker compose up -d # 后台启动多容器
docker compose down # 停止并清理
docker compose ps # 查看compose容器状态
docker compose logs -f # 查看compose日志
4.5 Dockerfile 最佳实践
# 多阶段构建:构建阶段 vs 运行阶段
FROM osrf/ros:humble-desktop-full AS builder
WORKDIR /ws
COPY src/ src/
RUN . /opt/ros/humble/setup.sh && colcon build
FROM osrf/ros:humble-ros-core
COPY --from=builder /ws/install /ws/install
# 最终镜像不包含编译依赖,体积小得多
4.6 Docker 容器生命周期
flowchart TB
A(["docker pull 拉取镜像"]) --> B["docker build\n构建自定义镜像"]
B --> C["docker images\n查看本地镜像"]
C --> D["docker run -d\n创建并启动容器"]
D --> E["docker ps\n容器运行中"]
E --> F["docker exec -it\n进入容器操作"]
F --> G{"任务完成?"}
G -->|"是"| H["docker stop\n停止容器"]
G -->|"否"| F
H --> I["docker ps -a\n容器已停止"]
I --> J{"需要重启?"}
J -->|"是"| K["docker start\n重新启动"]
K --> E
J -->|"否"| L["docker rm\n删除容器"]
L --> M(["docker rmi\n删除镜像"])
style A fill:#E3F2FD,stroke:#1976D2
style D fill:#E8F5E9,stroke:#388E3C
style E fill:#E8F5E9,stroke:#388E3C
style G fill:#FFF8E1,stroke:#F57C00
style J fill:#FFF8E1,stroke:#F57C00
style H fill:#FFEBEE,stroke:#D32F2F
style L fill:#FFEBEE,stroke:#D32F2F
5. ROS2 机器人命令
所有命令以
ros2开头。查帮助:ros2 --help→ros2 <command> --help→ros2 <command> <verb> -h
mindmap
root((ROS2<br/>机器人命令))
环境加载
source setup.bash
ROS_DOMAIN_ID
编译与包管理
colcon build
--symlink-install
--packages-select
ros2 pkg create
ros2 pkg list
ros2 pkg executables
节点
ros2 run
ros2 node list
ros2 node info
Topic 话题
ros2 topic list
ros2 topic echo
ros2 topic info
ros2 topic hz
ros2 topic pub
Interface 接口
ros2 interface list
ros2 interface show
ros2 interface proto
Service 服务
ros2 service list
ros2 service call
Action 动作
ros2 action list
ros2 action send_goal
Parameter 参数
ros2 param list
ros2 param get
ros2 param set
ros2 param dump
Launch 启动
ros2 launch
--debug
Bag 录制回放
ros2 bag record
ros2 bag play
ros2 bag info
可视化调试
rviz2
rqt_graph
rqt_plot
tf2_echo
系统诊断
ros2 doctor
ros2 daemon
ros2 lifecycle
ros2 component
5.1 环境加载
# 每个新终端都要source(建议写到 ~/.bashrc)
source /opt/ros/humble/setup.bash # 或 /opt/ros/jazzy/setup.bash
source install/setup.bash # 加载工作空间
# ROS_DOMAIN_ID:多组机器通信隔离(默认0,范围0-232)
export ROS_DOMAIN_ID=42
echo "export ROS_DOMAIN_ID=42" >> ~/.bashrc
5.2 编译与包管理
colcon build --symlink-install # 编译工作空间(Python改后自动生效)
colcon build --packages-select my_pkg # 只编译指定包
colcon build --packages-up-to my_pkg # 编译指定包及其依赖
colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release # Release模式编译
ros2 pkg create --build-type ament_cmake my_cpp_pkg # 创建C++包
ros2 pkg create --build-type ament_python my_py_pkg # 创建Python包
ros2 pkg list # 查看所有包
ros2 pkg list | grep my_ # 过滤自己的包
ros2 pkg executables my_pkg # 查看包的可执行文件
ros2 pkg prefix my_pkg # 查看包安装路径
5.3 节点
ros2 run my_pkg my_node # 运行节点
ros2 run my_pkg my_node --ros-args -r __node:=new_name # 重命名节点
ros2 node list # 查看运行中节点
ros2 node info /my_node # 查看节点拓扑(发布/订阅/服务)
5.4 话题 Topic
ros2 topic list # 查看所有话题
ros2 topic list -t # 同时显示消息类型
ros2 topic echo /scan # 实时打印话题数据
ros2 topic echo /scan --no-arr # 不打印数组内容(精简输出)
ros2 topic info /scan # 查看话题类型+发布者+订阅者
ros2 topic info /scan -v # 详细模式
ros2 topic hz /scan # 查看发布频率
ros2 topic bw /scan # 查看带宽占用
ros2 topic find geometry_msgs/msg/Twist # 按消息类型查找话题
ros2 topic pub /cmd_vel geometry_msgs/msg/Twist \
"{linear: {x: 0.5}, angular: {z: 0.1}}" -r 10 # 以10Hz发布速度指令
5.5 接口 Interface
ros2 interface list # 查看所有接口(msg/srv/action)
ros2 interface list -m # 只看消息类型
ros2 interface show std_msgs/msg/String # 查看消息结构定义
ros2 interface show nav2_msgs/action/NavigateToPose # 查看动作定义
ros2 interface proto geometry_msgs/msg/Twist # 查看消息模板(方便写pub命令)
5.6 服务 Service
ros2 service list # 查看所有服务
ros2 service list -t # 同时显示服务类型
ros2 service type /clear # 查看服务类型
ros2 service call /reset std_srvs/srv/Empty "{}" # 调用无参数服务
ros2 service call /add_two_ints example_interfaces/srv/AddTwoInts \
"{a: 3, b: 5}" # 调用带参数服务
5.7 动作 Action
ros2 action list # 查看所有动作
ros2 action list -t # 同时显示动作类型
ros2 action info /navigate_to_pose # 查看动作详情
ros2 action send_goal /navigate_to_pose \
nav2_msgs/action/NavigateToPose "{pose: {...}}" --feedback # 发送目标+查看反馈
5.8 参数 Parameter
ros2 param list # 查看所有节点参数
ros2 param list /my_node # 查看指定节点参数
ros2 param get /my_node use_sim_time # 获取参数值
ros2 param set /my_node linear_scale 1.5 # 动态修改参数(无需重编译)
ros2 param dump /my_node # 导出参数为YAML
ros2 param dump /my_node --output-dir ./ # 导出到文件
ros2 param describe /my_node param_name # 查看参数描述(约束、范围等)
5.9 Launch 启动文件
ros2 launch my_pkg demo.launch.py # 启动launch文件
ros2 launch my_pkg demo.launch.py use_sim:=true # 传参
ros2 launch --debug my_pkg demo.launch.py # 调试模式(暂停等待调试器连接)
5.10 数据录制与回放 Bag
ros2 bag record -a # 录制所有话题
ros2 bag record -o my_session /scan /tf # 录制指定话题,指定输出名
ros2 bag info my_session/ # 查看bag信息
ros2 bag play my_session/ # 回放数据
ros2 bag play my_session/ --rate 0.5 # 半速回放
ros2 bag play my_session/ -l # 循环回放
5.11 可视化与调试
rviz2 # 3D可视化(点云/轨迹/TF/模型)
rqt_graph # 节点-话题关系图
rqt_plot # 话题数据曲线图
ros2 run tf2_ros tf2_echo map base_link # 查看两个坐标系间变换
ros2 run tf2_tools view_frames # 生成TF树PDF
5.12 系统诊断与管理
ros2 doctor # 全面系统诊断(别名 ros2 wtf)
ros2 doctor --report # 输出完整报告
ros2 doctor --report-fail # 只看失败项
ros2 daemon status # 守护进程状态
ros2 daemon stop # 停止守护进程(网络切换后重置缓存)
ros2 lifecycle list # 查看受控节点列表
ros2 lifecycle set /node configure # 将节点状态设为configure
ros2 lifecycle set /node activate # 激活节点
ros2 component types # 查看可用组件类型(高性能容器模式)
5.13 ROS2 三种通信机制对比
flowchart LR
subgraph Topic["🔵 Topic 话题\n(发布/订阅 · 多对多)"]
direction TB
T1["Publisher\n发布者节点"]
T2["/scan 话题"]
T3["Subscriber A\n订阅者A"]
T4["Subscriber B\n订阅者B"]
T1 -->|"publish"| T2
T2 -->|"subscribe"| T3
T2 -->|"subscribe"| T4
end
subgraph Service["🟢 Service 服务\n(请求/响应 · 一对一)"]
direction TB
S1["Client\n客户端节点"]
S2["/add_two_ints\n服务"]
S3["Server\n服务端节点"]
S1 -->|"request"| S2
S2 -->|"request"| S3
S3 -->|"response"| S2
S2 -->|"response"| S1
end
subgraph Action["🟣 Action 动作\n(目标/反馈/结果 · 长任务)"]
direction TB
A1["Client\n客户端节点"]
A2["/navigate_to_pose\n动作服务器"]
A3["Server\n服务端节点"]
A1 -->|"send_goal"| A2
A2 -->|"goal"| A3
A3 -->|"feedback\n(进度更新)"| A2
A2 -->|"feedback"| A1
A3 -->|"result"| A2
A2 -->|"result"| A1
end
style T2 fill:#E3F2FD,stroke:#1976D2
style S2 fill:#E8F5E9,stroke:#388E3C
style A2 fill:#F3E5F5,stroke:#7B1FA2
6. 场景速查表
每个典型场景对应一组命令,按执行顺序排列
| 场景 | 命令链 | 说明 |
|---|---|---|
| 首次克隆→运行 | git clone → colcon build --symlink-install → source install/setup.bash → ros2 launch |
四步走通 |
| 远程改bug | ssh user@ip → vim src/bug.cpp → colcon build --packages-select pkg → ros2 run pkg node |
改完即跑 |
| 查话题数据 | ros2 topic list → ros2 topic info /topic -v → ros2 topic echo /topic |
三步定位 |
| 录制→回放调试 | ros2 bag record /sensor → ros2 bag info → ros2 bag play → rviz2 |
离线复现 |
| Docker环境分发 | docker build -t img . → docker push → 同事 docker pull → docker run |
一次构建到处跑 |
| 查进程+清理 | ps aux \| grep ros → 记下PID → kill -9 PID → ros2 node list 确认 |
僵尸进程清理 |
| 编译失败排查 | grep -rn "error" build.log → rosdep check --from-paths src → apt search ros-humble-xxx |
错误→依赖→安装 |
| 新包开发 | ros2 pkg create → vim src/node.cpp → colcon build --packages-select pkg → ros2 run pkg node → ros2 topic echo /out |
创建→编码→编译→运行→验证 |
7. 开发工作流全景
flowchart TB
subgraph P1["① 环境准备"]
A(["ssh连接开发机"]) --> B["git clone 拉代码"]
B --> C["source /opt/ros/ setup.bash"]
C --> D["docker run 启动容器"]
end
subgraph P2["② 开发编码"]
E["vim 改源码/配置"]
F["git add + commit"]
G["git push 推送"]
D --> E
E --> F --> G
end
subgraph P3["③ 编译构建"]
H["colcon build 编译"]
I{"编译成功?"}
H --> I
I -->|"是"| J["source install/ setup.bash"]
I -->|"否"| K["grep -rn error \n查日志定位"]
K --> E
end
subgraph P4["④ 运行调试"]
L["ros2 launch 启动"]
M["ros2 topic echo \n看数据"]
N["ros2 bag record \n录包"]
O["rviz2 + rqt_graph \n可视化"]
P{"数据正常?"}
Q(["✅ 调试完成"])
end
G --> H
J --> L
L --> M --> N --> O --> P
P -->|"是"| Q
P -->|"否"| E
style A fill:#E3F2FD,stroke:#1976D2
style I fill:#FFF8E1,stroke:#F57C00
style P fill:#FFF8E1,stroke:#F57C00
style K fill:#FFEBEE,stroke:#D32F2F
style Q fill:#E8F5E9,stroke:#388E3C
8. 常见问题排查
8.0 故障排查决策树
flowchart TB
S(["遇到问题"]) --> Q1{"ros2 命令\n找不到?"}
Q1 -->|"是"| A1["source setup.bash\n检查 ~/.bashrc"]
Q1 -->|"否"| Q2{"colcon build\n编译失败?"}
Q2 -->|"是"| A2["1. grep -rn error\n2. rosdep check\n3. apt search 补依赖"]
Q2 -->|"否"| Q3{"Docker容器\n无GPU?"}
Q3 -->|"是"| A3["安装 nvidia-container-toolkit\ndocker run --gpus all"]
Q3 -->|"否"| Q4{"多机通信\n不通?"}
Q4 -->|"是"| A4["1. 检查 ROS_DOMAIN_ID\n2. ping 对方IP\n3. ros2 doctor"]
Q4 -->|"否"| Q5{"串口设备\n无权限?"}
Q5 -->|"是"| A5["sudo usermod -aG dialout\n或 sudo chmod 666"]
Q5 -->|"否"| Q6{"节点启动\n立即崩溃?"}
Q6 -->|"是"| A6["dmesg | tail -20\n查看内核日志\n检查依赖库 ldd"]
Q6 -->|"否"| D(["✅ 提交issue\n或 ros2 doctor --report"])
style S fill:#E3F2FD,stroke:#1976D2
style A1 fill:#E8F5E9,stroke:#388E3C
style A2 fill:#E8F5E9,stroke:#388E3C
style A3 fill:#E8F5E9,stroke:#388E3C
style A4 fill:#E8F5E9,stroke:#388E3C
style A5 fill:#E8F5E9,stroke:#388E3C
style A6 fill:#E8F5E9,stroke:#388E3C
style D fill:#FFF8E1,stroke:#F57C00
8.1 ros2: command not found
根源:没source环境。每个新终端都要:
source /opt/ros/humble/setup.bash
source install/setup.bash
一劳永逸:写到 ~/.bashrc:
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
echo "source ~/ros2_ws/install/setup.bash" >> ~/.bashrc
8.2 Docker容器内无GPU
前提:宿主机 nvidia-smi 能正常输出。
# 1. 安装nvidia-container-toolkit
sudo apt install nvidia-container-toolkit
# 2. 运行时加 --gpus 参数
docker run --gpus all ...
# 3. 容器内验证
docker exec -it ros_dev nvidia-smi
8.3 colcon build 找不到依赖
# 1. 先检查缺失的依赖
rosdep check --from-paths src --ignore-src
# 2. rosdep自动安装
rosdep install --from-paths src --ignore-src -r -y
# 3. 如果rosdep也不知道,手动搜索
apt search ros-humble- | grep xxx
确保
package.xml和CMakeLists.txt中声明的依赖正确。首次用sudo rosdep init && rosdep update初始化rosdep。
8.4 ROS2多机通信不通
# 1. 确认两台机器 ROS_DOMAIN_ID 一致
echo $ROS_DOMAIN_ID
# 2. 确认能ping通
ping <对方IP>
# 3. 诊断
ros2 doctor --report
# 4. 如果用了Docker,确保 network_mode: host
8.5 串口设备无权限
# 把自己加入dialout组(重启后生效)
sudo usermod -aG dialout $USER
# 临时方案:直接改权限
sudo chmod 666 /dev/ttyUSB0
# 验证
ls -la /dev/ttyUSB*
9. 常用工具速记
| 工具 | 用途 | 一行启动 |
|---|---|---|
| rviz2 | 3D可视化 | rviz2 |
| rqt_graph | 节点话题关系图 | rqt_graph |
| rqt_plot | 实时数据曲线 | rqt_plot |
| Gazebo | 物理仿真 | gazebo --verbose |
| ros2 doctor | 系统诊断 | ros2 doctor --report |
| htop | 交互式进程监控 | htop |
| ncdu | 磁盘空间分析 | ncdu ~/ |
| tmux | 终端多路复用 | tmux new -s ros |
看到这还不点赞?今晚代码必跑飞。看完不转发?Bug跟你到白头。推荐给朋友,一起被坑到永久。评论区见,谁是今天的最强显眼包?👻