# alphadog_ros_ctl **Repository Path**: chenxin852/alphadog_ros_ctl ## Basic Information - **Project Name**: alphadog_ros_ctl - **Description**: 蔚蓝机器狗dev版本使用ros1 bridge连通ROS Humble和ROS Noetic,实现Joystick手柄遥控操作机器狗。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-08-18 - **Last Updated**: 2025-10-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 蔚蓝 AlphaDog Dev ROS 1 / ROS 2 通信桥接方案 ## 1. 总览 本仓库针对蔚蓝智能科技(weilan)的 AlphaDog Dev开发者版本,旨在解决在外部计算单元(如外挂 PC 或 香橙派 Orange Pi 或 Nvidia Jetson 等开发板)上,使用 ROS 2 环境进行开发并控制原生 ROS 1 机器狗的需求。 核心解决方案是利用 `ros1_bridge`,将机器狗自带的、闭源的 ROS 1 环境与本地的 ROS 2 Humble 环境无缝打通,从而让开发者可以使用最新的 ROS 2 工具链和生态来驱动机器狗。 ## 2. 仓库结构 本仓库采用“一体式”结构,将 ROS 1 和 ROS 2 的相关工作区都包含在一个统一的 Git 仓库中进行管理。 ``` ros_ws/ ├── doc/ # 详细的教程与说明文档 ├── README.md # 当前文件 ├── ros1_ws/ # ROS 1 Catkin 工作区 │ └── dog_msgs_ws/ # 存放与机器狗通信所需的【原始】ROS 1 消息/服务/动作包 ├── ros2_ws/ # ROS 2 Colcon 工作区 (用于存放上层应用节点) │ └── src/ │ └── alphadog_joystick_controller/ # 一个使用 ROS 2 编写的手柄节点示例 └── ros1_bridge_ws/ # ros1 bridge Colcon 工作区 (用于存放桥接核心组件),它包含了**所有**需要被 `ros1_bridge` 在编译时知晓的 ROS 2 包,包括: └── src/ ├── dog_msg_ws/ # 存放从 ROS 1 迁移并适配了 ROS 2 规范的【修改版】消息包 ├── ros1_bridge/ # [Git Submodule] 支持 Action 桥接的增强版 ros1_bridge └── bridge_mapping/ # 为增强版 bridge 提供手动映射规则的包 ``` * **`doc/`**: 包含了本次实践中沉淀下来的两份终极指南,详细描述了如何在 Ubuntu 22.04 上从源码编译 ROS 1 Noetic,以及如何配置 `ros1_bridge` 的所有细节。 * **`ros1_ws/`**: 包含与机器狗通信所需的**原始** ROS 1 接口包。 > **[核心原则]** 由于机器狗节点是闭源的,此工作区内的接口定义**必须保持原始状态**,以确保与机器狗通信时 MD5 sum 校验一致。 * **`ros2_ws/`**: 包含所有 ROS 2 相关代码。 * `dog_msg_ws/`: 存放了从 `ros1_ws` 迁移过来的接口包。这些包的接口定义文件 (`.msg`, `.srv`, `.action`) **已被修改** ,以符合 ROS 2 的严格规范(如字段名小写、`time` 类型替换等)。 * `ros1_bridge/`: 我们没有使用官方的 `ros1_bridge`,而是采用了一个社区维护的、功能更强大的分支。这个分支解决了官方版本对 Action 支持不完善以及其他一些限制。 * `bridge_mapping/`: 这是“增强版”网桥的“翻译词典”。由于 `ros_alphadog` 包名不符合 `_msgs` 后缀的自动映射规则,且 ROS 1 与 ROS 2 的接口定义因规范不同而存在差异,我们利用这个包中的 `.yaml` 文件来**手动**告诉网桥如何进行精确的包级别和字段级别映射。 * `alphadog_joystick_controller/`: 一个完整的 ROS 2 功能包,演示了如何使用 `rclpy` 和 `ActionClient` API,通过桥接后的接口来发送指令控制机器狗。 ## 3. 核心挑战与解决方案 本仓库的配置解决了在非标准环境下桥接复杂闭源系统的几个核心挑战: 1. **在 Ubuntu 22.04 上运行 ROS 1 Noetic**: 通过源码编译并修复多个兼容性问题,实现了 ROS 1 在非官方支持的系统上的稳定运行。 2. **桥接闭源 ROS 1 节点**: 解决了因修改接口定义而导致的 MD5 sum 不匹配问题。方案是:保持 ROS 1 接口原始,修改 ROS 2 接口,并利用手动映射规则来弥合差异。 3. **克服 `ros1_bridge` 的限制**: * **包名后缀问题**: `ros_alphadog` 包名不以 `_msgs` 结尾,通过 `bridge_mapping` 包中的包级别映射规则解决。 * **Action 支持问题**: 使用了社区的增强版 `ros1_bridge` 分支,并通过 `bridge_mapping` 中的动作级别( `action_fields_1_to_2`)和字段级别映射来解决。 * **固定长度数组问题**: 确认了 `ros1_bridge` 无法处理固定长度数组,并通过在编译时“隐藏”相关服务/消息来绕过。 ## 4. 快速上手指南 #### 步骤 0: 先决条件 1. **操作系统**: Ubuntu 22.04 LTS。 2. **ROS 2**: 已安装 ROS 2 Humble Hawksbill (Desktop)。 3. **ROS 1**: 已按照 `doc/` 目录下的教程,在你的系统上(例如 `/opt/ros/noetic`)成功从源码编译并安装了 ROS 1 Noetic。 4. **Git**: 已安装 `git`。 #### 步骤 1: 克隆与初始化 ```zsh git clone ros_ws cd ros_ws # 初始化并拉取所有 Git Submodule (ros1_bridge 和 bridge_mapping) git submodule update --init --recursive ``` #### 步骤 2: 编译 ROS 1 工作区 这一步是为了确保你的 ROS 1 环境包含了与机器狗兼容的、原始的自定义消息。 ```zsh # 在一个 source 了 ROS 1 Noetic 主环境的终端里操作 source /opt/ros/noetic/setup.zsh cd ros1_ws/dog_msgs_ws catkin_make ``` > 注意:此处的 `catkin_make` 也可以使用 `catkin_make_isolated --install`,根据你的 ROS 1 工作区配置而定。 #### 步骤 3: 编译桥接核心工作区中的 ROS 2 依赖 (`ros1_bridge_ws`) 编译 ROS 2 版本的自定义消息和映射规则包。 ```zsh # 打开一个全新的终端。 # 在一个 source 了 ROS 2 Humble 主环境的终端里操作 source /opt/ros/humble/setup.zsh cd ros1_bridge_ws colcon build --symlink-install --packages-skip ros1_bridge ``` #### 步骤 4: 编译 `ros1_bridge` 这是最关键的一步,编译网桥本身。**必须在配置正确的“混合环境”中进行**。 1. **打开一个全新的终端**。 2. **严格按顺序 `source` 环境**: ```zsh # 1. Source 你的 ROS 1 工作区 source /ros_ws/ros1_ws/dog_msgs_ws/devel/setup.zsh # 2. Source 你的 ROS 2 工作区 source /ros_ws/ros1_bridge_ws/install/setup.zsh ``` 3. **运行编译**: ```zsh cd /ros_ws/ros1_bridge_ws colcon build --packages-select ros1_bridge --cmake-force-configure ``` ## 5. 运行与验证 * 首先在本地`~/.zshrc`或`~/.bashrc`中需要包括以下内容: ```zsh export ROS_MASTER_URI=http://10.10.10.10:11311 # 固定内容,机器狗默认 export ROS_IP=<本机连接机器狗WIFI后分配的IP> ``` * **终端 A (ROS 1)**: 启动 `roscore` 和机器狗的 ROS 1 驱动节点,**启动机器狗后会自动运行**。 ```zsh source /ros_ws/ros1_ws/dog_msgs_ws/devel/setup.zsh roscore # 在新标签页中启动机器狗驱动 ``` * **终端 B (网桥)**: 启动 `ros1_bridge`。 ```zsh # 使用编译网桥时的那个“混合环境” source /ros_ws/ros1_ws/dog_msgs_ws/devel/setup.zsh source /ros_ws/ros1_bridge_ws/install/setup.zsh ros2 run ros1_bridge dynamic_bridge --bridge-all-topics ``` * **终端 C**: 编译ROS 2 Joystick控制器。 ```zsh cd /ros_ws/ros2_ws source /opt/ros/humble/setup.zsh colcon build ``` * **终端 D (ROS 2 控制器)**: 启动你的手柄控制器。 ```zsh source /ros_ws/ros2_ws/install/setup.zsh ros2 launch alphadog_joystick_controller joystick_launch.py ``` 此时,你应该能通过手柄,经由 ROS 2 -> `ros1_bridge` -> ROS 1 的链路来控制机器狗了。 ## 6. 详细文档 关于如何在 Ubuntu 22.04 上从零开始编译 ROS 1 Noetic,以及本仓库中所有 `ros1_bridge` 编译问题的详细排查记录,请参考 `doc/` 目录下的教程文档。 ## 7. 致谢 本仓库中使用的 `ros1_bridge` 及其 `bridge_mapping` 方案,基于社区开发者 **[Doug Smith](https://github.com/smith-doug)** 的杰出工作。