fix
This commit is contained in:
@@ -97,12 +97,13 @@ docker compose -p ros2 -f docker/docker-compose.yml up -d
|
||||
|
||||
```powershell
|
||||
docker run -d -it --name ros2_dev `
|
||||
-v "${PWD}:/root/ros2_ws" `
|
||||
-v "$(Get-Location):/root/ros2_ws" `
|
||||
--network ros2_net `
|
||||
ros2-humble-dev:latest bash
|
||||
```
|
||||
|
||||
> ❗ **一定要带末尾的 `bash`**: 否则容器启动后立刻 `Exited (0)`,因为基础镜像默认 ENTRYPOINT 跑 bash,无 tty 时立刻退出。
|
||||
> ❗ **挂载路径要用 `$(Get-Location)` 而不是 `${PWD}`**: PowerShell 里 `${PWD}` 在 `docker run -v` 这种被引号包裹的 bind mount 上偶尔会被吃掉,导致容器静默退出(`docker ps` 看不到)。`$(Get-Location)` 是更稳的写法。
|
||||
|
||||
**预期输出**:一串 hash(容器 ID),没有报错就行。
|
||||
|
||||
@@ -142,6 +143,8 @@ source /opt/ros/humble/setup.bash
|
||||
ros2 --help | head -5 # 应该输出 ros2 CLI 用法
|
||||
# 或
|
||||
dpkg -l ros-humble-rclcpp | tail -1 # 应该看到已装的 ROS2 humble 版本行
|
||||
# 或
|
||||
colcon info --packages-up-to / 2>/dev/null | head -5 # 应该看到本工作空间元数据
|
||||
```
|
||||
|
||||
**常见错误**:直接输入 `ros2` 提示 `command not found` → 说明你忘了 source。
|
||||
@@ -163,12 +166,18 @@ cd /root/ros2_ws
|
||||
bash scripts/build.sh
|
||||
```
|
||||
|
||||
**方式 B — 手动**:
|
||||
**方式 B — 手动**(**❗ 必先 `source` ROS2**):
|
||||
```bash
|
||||
cd /root/ros2_ws
|
||||
source /opt/ros/humble/setup.bash # ❗ 必先做!否则 C++ 包全挂(找不到 ament_cmake)
|
||||
colcon build --symlink-install
|
||||
```
|
||||
|
||||
> ❗ **`source` 是手动编译的前提**:Dockerfile 把 `source /opt/ros/humble/setup.bash` 写在 `~/.bashrc`,
|
||||
> 但 `docker exec ros2_dev bash -lc 'colcon build'` 跑的是**非交互 login shell**(`-l`),**不读** `~/.bashrc`,
|
||||
> CMake 会报 `Could not find a package configuration file provided by "ament_cmake"`,所有 C++ 包 Failed。
|
||||
> 脚本 `scripts/build.sh` 内部已 source,所以走方式 A 就不会踩这个坑。
|
||||
|
||||
**预期输出**:一堆 `Starting >>> xxx`、`Finished <<< xxx`,最后看到:
|
||||
|
||||
```
|
||||
@@ -230,14 +239,20 @@ ros2 launch bringup pubsub_launch.py
|
||||
|
||||
**预期输出**(每个终端都会一直打印,这是正常的):
|
||||
```
|
||||
[INFO] [py_publisher]: Publishing: "Hello World: 0"
|
||||
[INFO] [py_publisher]: Publishing: "Hello World: 1"
|
||||
...
|
||||
[INFO] [chatter_listener]: I heard: Hello World: 0
|
||||
[INFO] [launch]: Default logging verbosity is set to INFO
|
||||
[INFO] [chatter_publisher-1]: process started with pid [2656]
|
||||
[INFO] [chatter_publisher_cpp-2]: process started with pid [2658]
|
||||
[INFO] [chatter_subscriber-3]: process started with pid [2660]
|
||||
[INFO] [chatter_subscriber_cpp-4]: process started with pid [2662]
|
||||
[chatter_publisher_cpp-2] [INFO] [...]: ChatterPublisher started: rate=2.00 Hz, topic="chatter"
|
||||
[chatter_subscriber-3] [INFO] [...]: recv #0: "Hello from PY, seq=0"
|
||||
[chatter_subscriber_cpp-4] [INFO] [...]: recv #0: "Hello from C++, seq=0"
|
||||
[chatter_subscriber-3] [INFO] [...]: recv #1: "Hello from C++, seq=0" ← 跨语言互通
|
||||
[chatter_subscriber_cpp-4] [INFO] [...]: recv #1: "Hello from PY, seq=1" ← 跨语言互通
|
||||
...
|
||||
```
|
||||
|
||||
**怎么验证 Python ↔ C++ 互通**:默认 launch 会同时启动 py + cpp 的 publisher 和 subscriber,你应该看到 4 个节点在互相通信。
|
||||
**怎么验证 Python ↔ C++ 互通**:默认 launch 会同时启动 py + cpp 的 publisher 和 subscriber,你应该看到 4 个节点在互相通信(`ros2 topic info /chatter -v` 会显示 2 Publisher + 2 Subscription)。
|
||||
|
||||
**怎么停止**:按 `Ctrl+C`(Linux 终端的"取消运行"快捷键)。**Ctrl+C 在 ROS2 节点运行时 = 优雅退出**,不会损坏任何东西。
|
||||
|
||||
@@ -267,6 +282,33 @@ Error response from daemon: Conflict. The container name "/ros2_dev" is already
|
||||
```
|
||||
→ 删掉旧容器: `docker rm -f ros2_dev`,再 `docker run ...`
|
||||
|
||||
### ❌ `ros2 topic info` 显示 Publisher count: 4(应该是 2)
|
||||
**原因**:`bash scripts/launch.sh pubsub_launch forever` 或多次调试后,`ros2 launch` fork 出的 `chatter_publisher_*` 子进程 reparent 到容器 PID 1,不再随 launch 主进程退出。下次启动 launch 又起 2 个,累计 4 个 Publisher。
|
||||
**解决**:
|
||||
```powershell
|
||||
docker exec ros2_dev bash /root/ros2_ws/scripts/clean_ros.sh
|
||||
# 等价于 pkill -9 -f "ros2 launch" + pkill -9 -f chatter
|
||||
```
|
||||
|
||||
### ❌ `docker compose up` 网络冲突
|
||||
```
|
||||
Network ros2_ros2_net Error Error response from daemon:
|
||||
invalid pool request: Pool overlaps with other one on this address space
|
||||
failed to create network ros2_ros2_net
|
||||
```
|
||||
**原因**:compose project 名 `ros2` 让网络名前缀成 `ros2_ros2_net`,但仓库里手动(或上次启动)已经创建了 `ros2_net`(`docker run` 方式),子网 `172.20.0.0/16` 跟 compose 默认 `172.20.0.0/24` 重叠,daemon 拒绝。
|
||||
**解决 1(推荐)**:直接走"方式 B — 手动 docker run",绕开 compose:
|
||||
```powershell
|
||||
docker rm -f ros2_dev
|
||||
docker run -d -it --name ros2_dev -v "$(Get-Location):/root/ros2_ws" --network ros2_net ros2-humble-dev:latest bash
|
||||
```
|
||||
**解决 2**:先删旧网络再 compose up:
|
||||
```powershell
|
||||
docker rm -f ros2_dev
|
||||
docker network rm ros2_net
|
||||
docker compose -p ros2 -f docker/docker-compose.yml up -d
|
||||
```
|
||||
|
||||
### ❌ 构建超时 / 网络问题
|
||||
```
|
||||
failed to fetch ... context deadline exceeded
|
||||
|
||||
Reference in New Issue
Block a user