Appearance
开发路线二:Docker ROS 原生开发容器
这条路线不使用 rosbridge。你的代码运行在 ROS1 容器里,直接作为 ROS 节点连接当前 ROS master,使用 rospy/roscpp、自定义 msg/srv、rostopic/rosservice 等原生 ROS 工具。
适合场景:
- 编写 Python/C++ ROS 节点。
- 需要使用自定义消息类型,例如
zj_robot、upperlimb、hand、navigation等。 - 需要
rostopic echo、rosservice call、rosmsg 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。audio、hand、navigation、sensor、upperlimb、zj_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 节点开发、消息/服务调试、长期机器人应用开发 |