IB_Robot 项目 OpenHarmony 板端 ROS 2 第三方包交叉编译与部署实战指南
具身智能机器人人工智能大模型模型推理服务本地部署计算机视觉ROS【免费下载链接】IB_RobotSave the code of IB-Robot, an AI robot execution framework developed by openEuler Embedded for embodied intelligence scenarios. It includes references to the forked version of tensormsg, references to lerobot fork, code references to the lerobot_ros2:ros2_ws branch, as well as some code related to development usability.项目地址https://gitcode.com/openeuler/IB_Robot点击查看免费下载本文面向需要在 OpenHarmony aarch64 板端BQ3588HM / RoboPi / RK3588为 IB_Robot 机器人运行时部署第三方 ROS 2 包如usb_cam、camera_ros、nav2等的开发者。以.agents/skills/oh-cross-build-ros-pkg技能文档为主线结合仓库内的 交叉编译构建脚本、板端环境脚本 与 launch builder 源码 展开完整覆盖“可行性评估 → clone 源码 → Docker 交叉编译 → 修复归属 → 产物验证 → 部署 → 板端验证 → runtime 问题修复”全链路以及部署后如何接入 IB Robot launch 系统并深入讲解ros2_control/controller_manager在 musl 环境下的关键 mutex 补丁。何时使用本流程本技能解决的核心问题是把不在 IB_Robot 源码树内的第三方 ROS 2 Humble 标准包移植并部署到 OpenHarmony 板端。典型触发场景包括用户希望为板端新增一个 IB_Robot 源码树之外的 ROS 2 包用户提出“移植 XX 包到板端”“板端编译 XX”“cross-compile XX for OH”等需求板端缺少某个外设驱动camera、lidar 等目标包是一个标准的 ROS 2 Humble 包。不要使用本流程的场景应改用其他专项编译 IB_Robot / RoboFrame 自己的包inference_service、robot_config等——应使用oh-build-roboframe技能其底层脚本即仓库中的 build_roboframe_oh.sh板端连接、文件传输、SSH 配置——使用oh-access技能.agents/skills/oh-access/SKILL.md运行 RKNN 推理——参见 docs/OpenHarmony_EmbodiedAI_RKNN_Inference.md。交叉编译架构总览整条链路由x86_64 Ubuntu 22.04 主机与OpenHarmony aarch64 板端组成中间以 Docker 构建容器衔接Host (x86_64 Ubuntu 22.04) -- Docker container (voxelsky/ohos-ros-humble-builder:v0.1.5) | Cross-compiles with OHOS SDK toolchain | Outputs aarch64 ELF binaries linked against musl | -- OH_CUSTOM_ROOT/ -- ibrobot_oh_ws/src/package/ ← source -- ibrobot_oh_ws/install/package/ ← build output -- install/ ← OH ROS 2 Humble runtime (sysroot) -- ohos-robot-toolchain/18/native/ ← OHOS SDK sysroot板端通过hdc file send接收可部署的install/package/目录。仓库中的 build_roboframe_oh.sh 是本架构在 RoboFrameIB_Robot工作区中的落地实现其默认环境变量与上述目录约定一一对应OH_CUSTOM_ROOToh_build_root/custom_build_root OH_CUSTOM_WS${OH_CUSTOM_ROOT}/ibrobot_oh_ws OH_CUSTOM_SRC${OH_CUSTOM_WS}/src OH_CUSTOM_TOOLCHAIN_ROOT${OH_CUSTOM_ROOT}/ohos-robot-toolchain OH_CUSTOM_IMAGEvoxelsky/ohos-ros-humble-builder:v0.1.5 OH_CUSTOM_CONTAINER_NAMEibrobot-oh-build OH_CUSTOM_PREFIX/data/roboframe/install # on-device install prefix OH_BOARD_ROS_PREFIX/data/install # on-device ROS 2 Humble prefix OH_CUSTOM_CPUaarch64从脚本实现看OH_CUSTOM_ROOT同时以两个挂载点/mnt/ohos与/mnt/ohos/tmp注入容器WS_ROOT/mnt/ohos/tmp、OHOS_SDK/mnt/ohos/tmp/ohos-robot-toolchain/18是容器内的固定环境变量见 build_roboframe_oh.sh。前置条件主机侧一次性准备通常已完成组件主机路径用途OH build rootoh_build_root/custom_build_root/存放全部构建产物OH ROS 2 Humble runtimebuild_root/install/交叉编译 sysrootOHOS SDKbuild_root/ohos-robot-toolchain/18/native/编译器 sysrootDocker builder imagevoxelsky/ohos-ros-humble-builder:v0.1.5构建环境HDC 板端访问hdc -t board_ip:8710部署传输通道板端侧组件板端路径用途OH ROS 2 runtime/sys_prod/robot/install/sys_prod/robot/out基础 ROS 2 库ROS env 脚本/data/roboframe/scripts/robooh_1.0.1.env环境初始化IB Robot install/data/roboframe/installIB Robot 各包setup.sh链/data/roboframe/install/setup.sh包发现板端环境脚本 robooh_1.0.1.env 的源码进一步印证了板端路径布局它通过LD_PRELOAD注入系统 libpython/sys_prod/robot/out/lib/libpython3.12.so.1.0将PATH、LD_LIBRARY_PATH、PYTHONPATH、AMENT_PREFIX_PATH全部指向/sys_prod/robot/...与/data/roboframe/install/...并将ROS_LOG_DIR、HOME重定向到可写的/data目录——因为 OpenHarmony rootfs 是只读的。八步交叉编译标准流程完整的可行性评估、clone、Docker 交叉编译、修复 ownership、验证构建产物、部署到板端、板端验证、修复 runtime 问题等八个步骤详见技能参考文档 references/step-by-step.md。Step 1包可行性评估构建前先核对包依赖grep -E build_depend|exec_depend|depend pkg/package.xml已知兼容纯 C/C 包、使用标准消息类型的 ROS 2 nodelet、依赖rclcpp/rclpy 通用消息的包。已知问题包依赖 CUDA/GPU 的包内含 x86_64 内联汇编的包需要 Qt/GTK GUI 的包硬依赖 glibc 的包OpenHarmony 使用musl libc。库依赖检查清单如果包依赖/sys_prod/robot/out/lib/与/sys_prod/robot/install/lib/之外的库必须先交叉编译该库。板端常见的预装库包括libavcodec、libavformat、libswscaleffmpeglibopencv_*OpenCVlibv4l2V4L2标准 ROS 2 Humble 库Step 2Clone 包源码# 工作区源码目录 OH_WS_SRCbuild_root/ibrobot_oh_ws/src # clone 目标包--depth 1 加速必要时指定分支 git clone --depth 1 -b branch repo_url ${OH_WS_SRC}/package_name例如usb_camgit clone --depth 1 -b main usb_cam仓库地址 ${OH_WS_SRC}/usb_cam。Step 3Docker 交叉编译使用 OH builder 镜像执行交叉编译OH_CUSTOM_ROOTbuild_root # e.g., oh_build_root/custom_build_root OH_IMAGEvoxelsky/ohos-ros-humble-builder:v0.1.5 PACKAGEpackage_name # e.g., usb_cam docker run --rm -i \ -e WS_ROOT/mnt/ohos/tmp \ -e OHOS_SDK/mnt/ohos/tmp/ohos-robot-toolchain/18 \ --name ibrobot-oh-build \ -v ${OH_CUSTOM_ROOT}:/mnt/ohos \ -v ${OH_CUSTOM_ROOT}:/mnt/ohos/tmp \ ${OH_IMAGE} \ bash -lc set -euo pipefail export OHOS_CPUaarch64 export OHOS_SDK/mnt/ohos/tmp/ohos-robot-toolchain/18 build-ros-humble --custom \ --wd /mnt/ohos/tmp/ibrobot_oh_ws \ --custom-prefix /data/roboframe/install \ --colcon-args --packages-select ${PACKAGE} 关键 flag 说明--custom启用 OHOS SDK 交叉编译模式--custom-prefix /data/roboframe/install设置安装前缀以匹配板端部署路径--packages-select只构建目标包及工作区内的依赖。仓库中的 build_roboframe_oh.sh 以完全相同的方式组织容器内构建命令build_command_string生成set -euo pipefailexport OHOS_CPU${OH_CUSTOM_CPU}build-ros-humble --custom ...并额外支持--sdk-tar、--sysdeps-tar、--humble-tar等参数来准备 SDK、sysdeps 覆盖层与 Humble runtime。Step 4修复构建产物所有权如需Docker 以 root 运行需修复构建产物归属docker run --rm \ -v ${OH_CUSTOM_ROOT}:/mnt/ohos \ ${OH_IMAGE} \ sh -c chown -R $(id -u):$(id -g) /mnt/ohos/ibrobot_oh_ws/install /mnt/ohos/ibrobot_oh_ws/build /mnt/ohos/ibrobot_oh_ws/log || true这一做法与 build_roboframe_oh.sh 中的normalize_runtime_bundle_ownership完全一致后者通过docker_cmd run --rm -v ${OH_CUSTOM_ROOT}:/mnt/ohos执行同样的 chown。Step 5验证构建产物# 检查二进制类型 —— 必须为 aarch64 musl file ${OH_CUSTOM_ROOT}/ibrobot_oh_ws/install/${PACKAGE}/lib/*/$(basename ${PACKAGE}_node_exe || echo *)预期输出ELF shared object, 64-bit LSB arm64, dynamic (/lib/ld-musl-aarch64.so.1)。注意OpenHarmony 板端的动态链接器是/lib/ld-musl-aarch64.so.1而非 glibc 的/lib/ld-linux-aarch64.so.1glibc 版二进制无法运行参见 oh-constraints 技能。Step 6部署到板端hdc file send ${OH_CUSTOM_ROOT}/ibrobot_oh_ws/install/${PACKAGE} /data/roboframe/install/${PACKAGE}Step 7板端验证# 检查包发现 hdc shell source /data/roboframe/scripts/robooh_1.0.1.env source /data/roboframe/install/setup.sh ros2 pkg prefix ${PACKAGE} # 试运行务必使用 CycloneDDS hdc shell source /data/roboframe/scripts/robooh_1.0.1.env source /data/roboframe/install/setup.sh \ export RMW_IMPLEMENTATIONrmw_cyclonedds_cpp \ timeout 10 ros2 run ${PACKAGE} executable --ros-args paramsCRITICAL板端必须始终设置RMW_IMPLEMENTATIONrmw_cyclonedds_cpp。默认的rmw_fastrtps_cpp在 OpenHarmony musl 下会因断言错误崩溃典型报错Assertion failed: ... cast_or_create_topic。这一点在 robooh_1.0.1.env 中已被固化为默认值export RMW_IMPLEMENTATIONrmw_cyclonedds_cpp。Step 8修复 runtime 问题常见 runtime 问题与修复对照表问题原因修复No executable found二进制未标记可执行或 PATH 问题chmod x二进制使用完整路径Assertion failed: ... cast_or_create_topic使用了rmw_fastrtps_cpp设置RMW_IMPLEMENTATIONrmw_cyclonedds_cppcannot open shared object缺少库用ldd检查将缺失库部署到/sys_prod/robot/out/lib/Cannot open device/dev/videoX权限不足chmod 666 /dev/videoX参数不生效ROS 2 参数名不匹配核对源码中declare_parameter()的名字板端运行时约束交叉编译产物能跑起来的前提交叉编译只是第一步产物能否在板端运行还取决于 OpenHarmony 的运行时约束详见 oh-constraints 技能musl libc所有二进制必须是aarch64-linux-ohosmusl交叉编译产物toybox 工具箱awk、getprop等命令缺失find可能 segfault板端脚本应只用 POSIX sh toybox 内置命令无/usr/bin/env#!/usr/bin/env node这类 shebang 无法执行需要用绝对路径 shell wrapper只读 rootfs/、/system、/usr、/lib不可写一切部署到/data下无 systemd服务用 pidfile kill -0netstat自管LD_PRELOAD 干扰robooh_1.0.1.env 通过LD_PRELOAD注入 libpython会影响 node 等非 ROS 进程——非 ROS 进程不要 source robooh env。集成到 IB Robot Launch 系统部署完成后第三方包需要接入 IB Robot 的 launch 系统详见技能参考文档 references/launch-integration.md。相机驱动的配置映射机器人 YAML 配置位于src/robot_config/config/robots/robot.yaml控制相机 launch。以仓库真实配置 so101_agent_manual.yaml 为例peripherals: - name: top type: camera driver: opencv # opencv → 使用 usb_cam_node_exe index: 0 # → /dev/video0板端可能是 /dev/video20 width: 640 height: 480 fps: 30 frame_id: camera_top_frame驱动映射由 perception.py 中的generate_camera_nodes()定义driver: opencv→ 从usb_cam包启动usb_cam_node_exedriver: camera_ros→ 从camera_ros包启动camera_nodedriver: realsense→ 从realsense2_camera包启动realsense2_camera_node。从源码实现看opencv分支会把 YAML 中的index转成video_device/dev/video{index}并透传framerate、image_width、image_height、pixel_format、camera_frame_id等参数还会额外透传 V4L2/usb_cam ISP 旋钮contrast、saturation、sharpness、gain、auto_white_balance、autoexposure、exposure、autofocus、focus、io_method这些键必须与usb_cam_node.cpp的声明严格对应perception.py。若通过camera_isp_calibrator做过标定load_isp_override(name)返回的覆盖值会优先于 YAML保证标定结果跨 launch 持久生效。新增驱动类型时应在generate_camera_nodes()中新增分支而不要依赖固定的源码行范围。非相机包的接入方式将包加入对应的 launch builder导航launch_builders/navigation.py其中generate_navigation_nodes()会根据配置结构分派到 sim 或真实导航子 builder见 navigation.py语音/传感器新建一个 builder或直接在robot.launch.py中添加。已部署包清单Registry包来源版本二进制板端路径状态usb_camros-drivers/usb_cammain (0b1c9d7)usb_cam_node_exeaarch64/musl/data/roboframe/install/usb_cam/已验证 30 FPS 640x480 MJPEG注意OpenHarmony EmbodiedAI 1.0.1 系统已内置usb_cam位于/sys_prod/robot/install。通常无需单独交叉编译除非需要特定版本。参考构建环境变量与板端环境构建环境变量默认值可被 CLI flag 或环境变量覆盖OH_CUSTOM_ROOToh_build_root/custom_build_root OH_CUSTOM_WS${OH_CUSTOM_ROOT}/ibrobot_oh_ws OH_CUSTOM_SRC${OH_CUSTOM_WS}/src OH_CUSTOM_TOOLCHAIN_ROOT${OH_CUSTOM_ROOT}/ohos-robot-toolchain OH_CUSTOM_IMAGEvoxelsky/ohos-ros-humble-builder:v0.1.5 OH_CUSTOM_PREFIX/data/roboframe/install # on-device install prefix OH_BOARD_ROS_PREFIX/sys_prod/robot/install # on-device ROS 2 Humble prefix板端环境# 板端执行任何 ROS 命令前始终先 source 这两个脚本 source /data/roboframe/scripts/robooh_1.0.1.env source /data/roboframe/install/setup.sh # 始终设置 DDS 实现 export RMW_IMPLEMENTATIONrmw_cyclonedds_cpp # 多机板端 Ubuntu通信时使用相同 domain export ROS_DOMAIN_ID42专项案例ros2_control/controller_manager的 musl mutex 补丁SO-101 真机依赖ros2_control_nodecontroller_manager spawner完整说明见技能参考文档 references/ros2-control-patch.md。源码来源源码来自 OpenHarmony-robot 组织的ros_ros2_controlforktag 为OpenHarmony-Embodied-v1.0.1-Releasecommit c742704包含ros2_control、controller_manager、realtime_tools等包版本 2.53.0。该 fork 已包含realtime_tools的__OHOS__平台适配跳过mlockall、thread affinity 等 glibc-only 路径。controller_manager mutex 补丁关键controller_manager/src/controller_manager.cpp的switch_controller()中std::defer_lock在 musl 上会导致condition_variable::wait_for不稳定必须改为直接加锁- std::unique_lockstd::mutex switch_params_guard(switch_params_.mutex, std::defer_lock); std::unique_lockstd::mutex switch_params_guard(switch_params_.mutex);RoboFrame 发布包的install.sh会通过 patched.so覆盖机制自动应用此修复/data/roboframe/install/patches/lib/。板端环境脚本 robooh_1.0.1.env 的LD_LIBRARY_PATH将/data/roboframe/install/patches/lib排在系统路径之前确保补丁库优先加载。验证方法正常的 launch 日志应包含[ros2_control_node]: Successful initialization of hardware RobotSystem [spawner_joint_state_broadcaster_group]: Loaded joint_state_broadcaster [spawner_joint_state_broadcaster_group]: Configured and activated all the parsed controllers list如果 spawner 崩溃或卡在 switch controller说明controller_manager未包含 mutex 补丁。总结将第三方 ROS 2 包移植到 OpenHarmony 板端的完整心智模型是主机 Docker 容器内使用 OHOS SDK 交叉编译出 musl/aarch64 产物通过hdc file send部署到/data/roboframe/install在板端 sourcerobooh_1.0.1.env环境并使用 CycloneDDS 运行最后通过generate_camera_nodes()或 launch builder 接入 IB Robot 的 launch 系统。遇到ros2_control相关问题时优先核对 mutex 补丁是否生效。相关参考资源集中在完整 8 步流程references/step-by-step.mdlaunch 集成细节references/launch-integration.mdros2_control 专项references/ros2-control-patch.mdRoboFrame 工作区构建脚本build_roboframe_oh.sh板端运行时约束.agents/skills/oh-constraints/SKILL.md赞分享具身智能机器人人工智能大模型模型推理服务本地部署计算机视觉ROS【免费下载链接】IB_RobotSave the code of IB-Robot, an AI robot execution framework developed by openEuler Embedded for embodied intelligence scenarios. It includes references to the forked version of tensormsg, references to lerobot fork, code references to the lerobot_ros2:ros2_ws branch, as well as some code related to development usability.项目地址https://gitcode.com/openeuler/IB_Robot点击查看免费下载相关推荐IB_Robot 第三方 ROS 2 包 OpenHarmony aarch64 交叉编译与板端部署实战指南IB_Robot 第三方 ROS 2 包 OpenHarmony aarch64 交叉编译与板端部署实战指南 本文完整讲解 IB_Robot 中「为 OpenH具身智能机器人人工智能大模型模型推理服务本地部署计算机视觉ROSopenEulerOpenHarmony深度学习语音AI AgentAscendIB_Robot 板端交叉编译实战用 ohloha 包工具tools_ohloha_pkgs把 bash/zsh/vim 等第三方包构建到 OpenHarmonyIB_Robot 板端交叉编译实战用 ohloha 包工具tools_ohloha_pkgs把 bash/zsh/vim 等第三方包构建到 OpenHar具身智能机器人人工智能大模型模型推理服务本地部署计算机视觉ROSopenEulerOpenHarmony深度学习语音AI AgentAscendIB_Robot 之 OpenHarmony 板端第三方包交叉编译踩坑实录tools_ohloha_pkgs 七大典型问题与修复方案IB_Robot 之 OpenHarmony 板端第三方包交叉编译踩坑实录tools_ohloha_pkgs 七大典型问题与修复方案 本文聚焦 IB_Robo具身智能机器人人工智能大模型模型推理服务本地部署计算机视觉ROSopenEulerOpenHarmony深度学习语音AI AgentAscend创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考