
【瑞萨 MicroROS 评测】VMware虚拟机Ubuntu22.04搭建 ROS2 Humble micro‑ROS‑Agent编译编译配合libmicroros.a 静态库一.VMware虚拟机Ubuntu22.04搭建 ROS2 Humble micro‑ROS‑Agent编译编译1针对瑞萨RA6M4裸机/FreeRTOS平台完成micro‑ROS全流程移植。本篇完成上位机Ubuntu环境部署以及VMware虚拟机部署方案使用国内镜像解决外网下载超时完成ROS2 Humble、micro‑ROS‑Agent、交叉编译依赖安装为后续micro‑ROS静态库编译做准备。2.1 VMware虚拟机精准硬件配置新建虚拟机→典型模式挂载ubuntu‑22.04‑desktop‑amd64.iso镜像硬件参数CPU8核心内存≥4GB网络适配器桥接模式USB控制器开启USB3.1保证J‑Link、USB‑CDC设备可正常映射至虚拟机软件虚拟机配置2.2 Ubuntu系统初始化解决国内下载慢、超时2.2.1 替换清华软件源# 备份原有源sudocp/etc/apt/sources.list /etc/apt/sources.list.bak# 写入清华源sudotee/etc/apt/sources.list-EOF deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse EOFsudoaptupdatesudoaptupgrade-y2.2.2 安装全套依赖编译Micro‑ROS、交叉编译必备sudoaptinstallgitpython3-pip build-essential cmake gcc-arm-none-eabi g crossbuild-essential-armhf python3-venv pip3installempy lark packaging setuptools--upgrade-ihttps://pypi.tuna.tsinghua.edu.cn/simple2.2.3 清华源安装 ROS2 Humble规避外网拉取失败sudoaptinstallsoftware-properties-commonsudoadd-apt-repository universesudoaptupdatesudoaptinstallcurlgnupg lsb-release# 导入ROS密钥curl-shttps://mirrors.tuna.tsinghua.edu.cn/rosdistro/ros.key|sudogpg--dearmor-o/usr/share/keyrings/ros-archive-keyring.gpg# 添加ROS软件源echodeb [arch$(dpkg --print-architecture)signed-by/usr/share/keyrings/ros-archive-keyring.gpg] https://mirrors.tuna.tsinghua.edu.cn/ros2/ubuntu jammy main|sudotee/etc/apt/sources.list.d/ros2.list/dev/nullsudoaptupdate# 桌面完整版microROS agent桥接工具sudoaptinstallros-humble-desktop ros-humble-micro-ros-agent# 持久化ROS环境变量echosource /opt/ros/humble/setup.bash~/.bashrcsource~/.bashrc2.2.4 安装VMware Tools实现Windows与虚拟机文件互通sudoaptinstallopen-vm-tools open-vm-tools-desktop-yreboot重启后在VMware「虚拟机‑设置‑选项‑共享文件夹」配置Windows共享目录用来传输编译完成的Micro‑ROS SDK压缩包。3 基础环境验证#验证ROS2ros2--version#验证micro‑ROS Agentros2 run micro_ros_agent micro_ros_agent--help#验证ARM交叉编译器arm-none-eabi-gcc-v需删除盲文辅助功能否则占用串口sudoaptpurge --auto-remove brltty-yls/dev/ttyUSB*#成功显示/dev/ttyUSB04 实操踩坑记录原有内容完整保留补充虚拟机新增坑点问题1 桥接模式虚拟机无法上网现象Ubuntu无网络调试思路虚拟机网络模式宿主机网卡根因桥接网卡选错物理网卡解决方案VMware桥接模式指定本机有线/无线网卡。问题2 Windows下J‑Link/USB‑CDC无法映射进虚拟机现象虚拟机看不到USB设备调试思路VMware USB控制器版本根因USB控制器版本过低Windows占用设备解决方案设置USB3.1虚拟机菜单栏手动连接USB设备。问题3 pip安装包报错超时现象pip外网拉取失败根因未指定国内pip镜像源解决方案命令增加-i https://pypi.tuna.tsinghua.edu.cn/simple。问题4 Agent启动提示串口权限不足现象permission denied /dev/ttyACM0解决方案sudochmod777/dev/ttyACM0成功建立话题如下二.静态库编译方案方案Agenerate_lib 传统编译原有完整保留芯片绑定库1.1 拉取micro_ros_setup工具mkdir-p~/ra6m4_uroscd~/ra6m4_urosgitclone https://github.com/micro-ROS/micro_ros_setup.gitcdmicro_ros_setup pip3install-rrequirements.txt-ihttps://pypi.tuna.tsinghua.edu.cn/simple1.2 创建固件编译工作区cd~/ra6m4_uros ./micro_ros_setup/create_firmware_ws.sh humblecdfirmware_ws1.3 修改colcon.meta配置裁剪micro‑ROS资源修改firmware_ws/src/micro_ros_firmware/config-colcon.meta调大内存关闭不需要组件适配MCU资源。{rmw_microxrcedds:{cmake-args:[-DRMW_UXRCE_MAX_SESSIONS1,-DRMW_UXRCE_MAX_NODES1,-DRMW_UXRCE_MAX_PUBLISHERS4,-DRMW_UXRCE_MAX_SUBSCRIPTIONS4,-DRMW_UXRCE_MAX_HISTORY4]}}1.4 编译生成RA6M4专用libmicroros.acd~/ra6m4_uros/firmware_ws colcon build产物路径firmware_ws/build/micro_ros_firmware/libmicroros.a头文件位于install/include。缺点该库绑定预设transport更换MCU、更换传输硬件SCI串口/USB‑CDC需要重新编译。方案Btransportnone编译无硬件绑定通用micro‑ROS静态库2.1 获取micro_ros_setup编译脚本mkdir~/uros_lib_buildcd~/uros_lib_buildgitclone https://github.com/micro-ROS/micro_ros_setup.gitcdmicro_ros_setup pip3install-rrequirements.txt-ihttps://pypi.tuna.tsinghua.edu.cn/simple2.2 创建静态库编译工作区cd~/uros_lib_build ./micro_ros_setup/create_lib_ws.sh humblecdlib_ws/src/micro_ros_static_library_builder2.3 修改编译配置生成通用Cortex‑M库编辑library_generation.sh#通用Cortex‑M架构兼容STM32F4、瑞萨RA6M4/RA6M5TARGET_ARCHcortex-m4TRANSPORTnone#剥离串口、USB、CAN硬件传输层只编译micro‑ROS内核BUILD_TYPEReleaseENABLE_LOGGINGOFF#关闭日志固件瘦身调试阶段改为ONFPUhard#硬件浮点RA6M4带FPU工程编译选项必须和该配置严格一致编辑同目录micro_ros_library.config裁剪不需要组件降低资源占用RCL_SERVICE_SUPPORTOFF RCL_PARAMETERSOFF UROS_LOG_LEVELUROS_LOG_NONE RCL_DIAGNOSTICSOFF TIME_SYNC_ENABLEOFF2.4 编译静态库cd~/uros_lib_build/lib_ws colcon build编译产物输出路径lib_ws/install/2.5 导出可移植SDK打包传到Windows单片机工程mkdir~/microROS_Generic_SDKcp-rinstall/include ~/microROS_Generic_SDK/cpinstall/lib/*.a ~/microROS_Generic_SDK/lib/tar-zcvfmicroROS_Humble_Universal.tar.gz microROS_Generic_SDKSDK分层说明核心层不可删除librcl.a、librclc.a、librmw_microxrcedds.a节点、话题、发布订阅核心。可选瘦身层不用可以删除librcl_service.a、librcl_parameters.a、librcutils_logging.a删除后ROM体积减少30%‑50%。移植补充层单片机端自行实现时间、内存、Transport三套硬件适配接口。备选Docker容器编译适合宿主机环境混乱自定义消息可在lib_ws/src添加消息包colcon build后一并打包进SDK。3 RA6M4工程导入micro‑ROS SDK两种库通用导入流程将对应SDK的include加入工程头文件搜索路径lib目录所有.a静态库加入链接器工程开启Hard FPU浮点保证ABI和编译库完全匹配调大堆Heap满足micro‑ROS内存分配需求。注意方案A生成库自带transport使用方案B通用库必须手动注册自定义transport回调。4 RA6M4三层底层适配接口实现4.1 Time系统时间接口⚠️禁止使用RTC日历时钟RTC可修改、时间跳变会造成XRCE‑DDS握手失败。RA6M4使用SysTick/DWT定时器输出单调递增纳秒时间戳。#includestdint.h//返回纳秒单调递增uint64_turos_get_time_ns(void){uint64_tmsR_Delay_GetMilliseconds();returnms*1000000ULL;}4.2 Allocator内存适配接口裸机直接调用系统堆FreeRTOS推荐内存池避免长时间运行堆碎片化。#includestdlib.hvoid*uros_malloc(size_tsize){#ifdefUSE_FREERTOSreturnpvPortMalloc(size);#elsereturnmalloc(size);#endif}voiduros_free(void*ptr){#ifdefUSE_FREERTOSvPortFree(ptr);#elsefree(ptr);#endif}将分配回调注册到micro‑ROS自定义allocator。4.3 Transport传输层适配RA6M4 USB‑CDC基于FSP USB‑PCDC驱动实现使用环形缓冲区做非阻塞读写禁止阻塞式API。transport_open等待USB枚举完成transport_close关闭USB外设transport_writeUSB‑CDC发送数据包transport_read从接收环形缓冲区拷贝数据无数据返回0仅方案B通用库需要手动注册自定义transport方案A如果编译时选定USB‑CDC则不需要。rmw_uros_set_custom_transport(true,NULL,transport_open,transport_close,transport_write,transport_read);5 最小micro‑ROS节点框架代码原有保留rclc_node_tnode;rclc_executor_texecutor;voidapp_microros_init(void){rcl_init_options_tinit_optionsrcl_get_zero_initialized_init_options();rcl_init_options_init(init_options,rcl_get_default_allocator());rclc_support_tsupport;rclc_support_init(support,0,NULL,init_options);rclc_node_init_default(node,ra6m4_node,,support);rclc_executor_init(executor,support.context,2,support.allocator);}主循环调用while(1){rclc_executor_spin_some(executor,RCL_MS_TO_NS(10));}6 握手测试J‑Link下载固件Ubuntu启动micro‑ROS Agentros2 run micro_ros_agent micro_ros_agent serial--dev/dev/ttyUSB0终端输出Session established代表MCU与上位机握手成功。7 实操踩坑记录原有全部保留补充新增方案坑点问题1 大量undefined reference现象链接阶段报大量micro‑ROS接口未定义调试思路静态库链接顺序FPU ABI根因工程FPU配置与编译库不一致静态库未全部链接解决方案工程开启hard浮点完整导入全部.a库文件。问题2 Agent运行正常无法建立Session会话现象Agent仅running无会话建立调试思路时间戳返回值、transport_read/write回调根因时间不是单调递增USB‑CDC未完成枚举就打开transport解决方案使用SysTick/DWT时间transport_open等待USB枚举完成。问题3 固件HardFault死机现象一运行micro‑ROS直接硬件错误调试思路Heap大小、内存分配实现根因堆内存不足内存越界访问解决方案调大HEAP_SIZE检查malloc/free回调实现。问题4 阻塞式transport_read导致整个系统卡死现象主循环停滞外设全部失效根因transport_read使用阻塞等待接收解决方案实现环形缓冲区非阻塞读取无数据直接返回0。问题5 方案B通用库编译后忘记注册custom transport现象编译链接正常上电无法握手根因TRANSPORTnone没有默认传输实现解决方案必须调用rmw_uros_set_custom_transport注册传输回调。8 两种编译方案对比总结编译方案适用场景优点缺点generate_lib单芯片固定硬件项目配置简单开箱即用transport换芯片/换传输硬件需要重编译transportnone通用库多芯片、竞赛大创项目一份SDK多MCU复用高度裁剪需要完整实现全套底层适配