Skip to content

开发路线二:Docker ROS 原生开发容器

这条路线不使用 rosbridge。你的代码运行在 ROS1 容器里,直接作为 ROS 节点连接当前 ROS master,使用 rospy/roscpp、自定义 msg/srv、rostopic/rosservice 等原生 ROS 工具。

适合场景:

  • 编写 Python/C++ ROS 节点。
  • 需要使用自定义消息类型,例如 zj_robotupperlimbhandnavigation 等。
  • 需要 rostopic echorosservice callrosmsg show 等 ROS CLI。
  • 需要长期维护一个开发容器或工作空间。

当前可复用镜像

推荐基于现有 demos 镜像:

text
10.51.33.201:30002/navi_project/demos:v1.0.2

当前已确认该镜像内包含:

  • ROS Noetic。
  • /opt/ros/noetic/setup.bash
  • /navi_ws/devel/setup.bash
  • audiohandnavigationsensorupperlimbzj_robot 等 ROS 包/消息类型。

不要直接复用现有 naviai_demos 容器做长期开发;建议新建独立开发容器。

ROS 网络配置

在 Orin 本机运行开发容器:

bash
ROS_MASTER_URI=http://192.168.217.1:11311
ROS_IP=192.168.217.100

在局域网其他服务器运行开发容器:

bash
ROS_MASTER_URI=http://192.168.217.1:11311
ROS_IP=<这台服务器在机器人网络中可被回连的IP>

注意:

  • ROS1 不是单向访问 master 就够了,其他节点还要能回连你的节点 XMLRPC/TCPROS 端口。
  • 推荐使用 network_mode: host
  • ROS_IP 不能写 127.0.0.1
  • 如果其他服务器不在 192.168.217.0/24,需要确保双向路由可达。
  • 当前镜像是 arm64 平台;如果其他服务器是 x86,不能直接按普通方式运行该 arm64 镜像。此时更适合走 rosbridge 路线,或自行准备 x86 ROS Noetic + 消息类型镜像。

必须 source 的环境

进入容器后至少 source:

bash
source /opt/ros/noetic/setup.bash
source /navi_ws/devel/setup.bash

如果你有自己的 catkin 工作空间,还要追加:

bash
source /workspace/ros_client_ws/devel/setup.bash

顺序建议:

bash
source /opt/ros/noetic/setup.bash
source /navi_ws/devel/setup.bash
source /workspace/ros_client_ws/devel/setup.bash

临时容器启动方式

适合一次性调试:

bash
docker run -it --rm \
  --name naviai_ros_client_tmp \
  --network host \
  --privileged \
  --runtime nvidia \
  --entrypoint /bin/bash \
  -e ROS_MASTER_URI=http://192.168.217.1:11311 \
  -e ROS_IP=192.168.217.100 \
  -v /dev:/dev \
  -v /tmp/.X11-unix:/tmp/.X11-unix \
  -v /home/naviai/.Xauthority:/root/.Xauthority \
  -v /home/naviai/navi_project/containers/shared:/shared \
  -v /home/naviai/Desktop/Project:/workspace \
  -w /workspace \
  10.51.33.201:30002/navi_project/demos:v1.0.2

进入后:

bash
source /opt/ros/noetic/setup.bash
source /navi_ws/devel/setup.bash
rostopic list

常驻开发容器 Compose

建议新建独立 compose 文件:

text
/home/naviai/Desktop/Project/Doc/docker-compose.ros-client.yaml

内容:

yaml
services:
  ros_client:
    image: 10.51.33.201:30002/navi_project/demos:v1.0.2
    container_name: naviai_ros_client
    network_mode: host
    privileged: true
    runtime: nvidia
    restart: unless-stopped
    entrypoint: ["/bin/bash", "-lc"]
    command: >
      grep -qxF 'source /opt/ros/noetic/setup.bash' /root/.bashrc || echo 'source /opt/ros/noetic/setup.bash' >> /root/.bashrc;
      grep -qxF 'source /navi_ws/devel/setup.bash' /root/.bashrc || echo 'source /navi_ws/devel/setup.bash' >> /root/.bashrc;
      tail -f /dev/null
    environment:
      ROS_MASTER_URI: http://192.168.217.1:11311
      ROS_IP: 192.168.217.100
      NVIDIA_VISIBLE_DEVICES: all
      NVIDIA_DRIVER_CAPABILITIES: graphics,utility,compute
    volumes:
      - /dev:/dev
      - /tmp/.X11-unix:/tmp/.X11-unix
      - /home/naviai/.Xauthority:/root/.Xauthority
      - /home/naviai/navi_project/containers/shared:/shared
      - /home/naviai/Desktop/Project:/workspace
    working_dir: /workspace
    security_opt:
      - seccomp:unconfined

启动:

bash
docker compose -f docker-compose.ros-client.yaml up -d

进入:

bash
docker exec -it naviai_ros_client bash

停止:

bash
docker compose -f docker-compose.ros-client.yaml down

自动拉起说明:

  • restart: unless-stopped 表示 Docker daemon 重启后会自动恢复该容器。
  • tail -f /dev/null 用来保持开发容器常驻。
  • .bashrc 中自动加入 ROS source,后续 docker exec -it naviai_ros_client bash 进入时会自动加载 ROS 环境。

开发工作空间

推荐目录:

text
/home/naviai/Desktop/Project/ros_client_ws

容器内路径:

text
/workspace/ros_client_ws

创建工作空间:

bash
mkdir -p /workspace/ros_client_ws/src
cd /workspace/ros_client_ws
catkin_make
source devel/setup.bash

创建 Python ROS 包示例:

bash
cd /workspace/ros_client_ws/src
catkin_create_pkg naviai_client rospy std_msgs sensor_msgs zj_robot upperlimb hand
cd /workspace/ros_client_ws
catkin_make
source devel/setup.bash

运行节点:

bash
rosrun naviai_client read_robot_state.py

或者直接运行脚本:

bash
python3 /workspace/scripts/read_robot_state.py

只读验证流程

进入容器后先检查:

bash
echo $ROS_MASTER_URI
echo $ROS_IP
rostopic list
rosnode list

确认消息类型:

bash
rostopic type /zj_humanoid/robot/robot_state
rosmsg show zj_robot/RobotState

订阅状态:

bash
rostopic echo /zj_humanoid/robot/robot_state

查看服务但不调用:

bash
rosservice list
rosservice info /zj_humanoid/robot/basic_info

在局域网其他服务器上使用 Docker 路线

如果要在另一台服务器上跑 ROS 原生开发容器,需要同时满足:

  • 能访问 192.168.217.1:11311
  • ROS master 和其他 ROS 节点能回连该服务器的 ROS_IP
  • 该服务器能拉取或已有 demos:v1.0.2 镜像。
  • 架构兼容。当前镜像为 arm64,如果服务器是 x86,需要另做镜像。

示例环境变量:

yaml
environment:
  ROS_MASTER_URI: http://192.168.217.1:11311
  ROS_IP: <其他服务器在机器人网络中的IP>

如果只是做 Web/业务开发,不需要原生 ROS 节点,局域网其他服务器通常优先走 rosbridge 路线,更简单。

安全边界

Docker 原生路线比 rosbridge 更像“直接加入机器人 ROS 网络”。开发初期只建议只读操作:

bash
rostopic list
rostopic info <topic>
rostopic echo <topic>
rosservice list
rosservice info <service>
rosnode info <node>

不要在未确认安全流程前发布或调用:

  • /cmd_vel/zj_humanoid/cmd_vel/web
  • /zj_humanoid/upperlimb/servoj/*
  • /zj_humanoid/upperlimb/speedj/*
  • /zj_humanoid/upperlimb/servol/*
  • action goal/cancel
  • 模式切换、重启、停止类 service。

优缺点

项目说明
优点原生 ROS;自定义消息/服务支持完整;适合写 rospy/roscpp 节点
缺点需要 ROS 网络双向可达;镜像架构/私有仓库受限;比 rosbridge 更容易误操作实机
推荐用途ROS 节点开发、消息/服务调试、长期机器人应用开发