ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

RoboCup3D人形仿真环境搭建:从Server安装到Agent联调全指南

RoboCup3D人形仿真环境搭建:从Server安装到Agent联调全指南 简介面向RoboCup3D人形仿真初学者的入门指南系统讲解仿真环境搭建、SEU-SPARK源码编译与比赛启动全流程。包内为单个PDF文档大小276KB便于随时查阅已有295人学习浏览。内容以Ubuntu 10.04为基准从安装编译环境和依赖库开始逐步完成server安装并详解MESA、WXWIDGET等基础库的配置随后通过cmake与make命令编译SEU-SPARK源码生成可执行agent。针对比赛实操还覆盖单人动作、双队对抗的启动方式以及修改simspark.rb开启比赛LOG记录、使用seu-3d-toolkit回放等内容。对准备参加校内赛或首次接触RoboCup3D的开发者这份指南能显著缩短环境配置和上手时间是一份可直接照做的参考手册。1. RoboCup3D 人形仿真的第一道门槛server 装不起来代码编不过很多人入坑 RoboCup3D 人形仿真第一周不是耗在决策算法上而是耗在 server 安装和 agent 代码编译上。这里的 server 指 rcssserver3d它配合 SimSpark 物理引擎模拟 22 个双足机器人agent 则是独立进程通过 UDP 与 server 对话。架构上东西不多但依赖链长、协议细节多装错一步全线卡住。下文按「架构 → 安装 → 编译 → 联调」的顺序走server 从依赖到跑通、agent 从源码到连线的完整路径都给出可执行命令每步配验证方法和报错对照。适合第一次碰 RoboCup3D 的人形组新人也适合要给队友写环境搭建文档的队长。2. RoboCup3D server 安装先拆架构再装依赖最后验证端口2.1 架构先立住server、monitor、agent 三个进程怎么分工RoboCup3D 仿真不是一个大程序整个系统跑起来之后通常是三类进程同时存在rcssserver3d承载 SimSpark 物理计算维护球场和两队共 22 个机器人默认在 UDP 3100 端口与 agent 通信同时开一个 TCP 端口默认 3200供可视化工具连接。rcssmonitor3d 或 RoboViz可视化客户端连到 3200 端口展示赛场画面不参与仿真逻辑关掉它比赛照常跑。agent你自己写的策略进程。每个 agent 控制一个机器人通过 UDP 上报动作意图server 用 ODE 物理引擎算完再把结果广播回去。这个分工直接决定了安装顺序先把 server 跑起来再用任何能发 UDP 包的工具验证最后才轮到编译 agent。很多新手把装 server 和编 agent 搅在一起报错时根本分不清是物理引擎崩了还是自己的代码编不过。排查 RoboCup3D 环境问题时的第一件事永远是看 server 进程在不在、端口在不在再看 agent 侧日志。另外一个容易忽略的点server 本身也依赖物理引擎和一堆图形库所以装 server 有发行版软件包和源码编译两条路。发行版有现成的包就直接装装完能用即可没有的情况下才走 2.2 的依赖清单和 2.3 的源码编译流程。2.2 在 Ubuntu 上装齐依赖ODE、Boost、Qt5 一个都不能少在 Ubuntu 上搭 RoboCup3D 环境我一般先一次性装齐构建链下面的命令覆盖了 server 和 monitor 两侧的绝大多数依赖sudo apt update sudo apt install build-essential cmake \ libboost-all-dev libode-dev \ libqt5opengl5-dev libqt5svg5-dev \ libsdl2-dev libgl1-mesa-devlibode-dev 提供 Open Dynamics EngineSimSpark 用它做刚体动力学和碰撞检测缺失时 CMake 在 find_package(ODE) 阶段直接失败报错信息很短基本只有一句 could not find ODE。libboost-all-dev 是 Boost 全量头文件和库agent 代码里常用的 program_options、thread、system 都包含在内装全量包省得逐个排查。libqt5opengl5-dev 负责 rcssmonitor3d 的渲染libsdl2-dev 是部分老版本模块的窗口依赖只跑 headless server 可以省但源码整体编译时还是带着最省事。提示老教程里常见 libqt4-devUbuntu 20.04 之后的官方仓库已经去掉这个包。看到 Unable to locate package libqt4-dev 别去找老源硬装换 Qt5 系源码通常同时兼容两个版本。依赖层面的报错大多有固定特征按下面这张表定位最快| 缺失的包 | 构建时报错特征 | 处理命令 | | libode-dev | CMake 阶段 could not find ODE | sudo apt install libode-dev | | libboost-dev | fatal error: boost/xxx.hpp | sudo apt install libboost-all-dev | | libqt5opengl5-dev | OpenGL/QtOpenGL 头文件找不到 | sudo apt install libqt5opengl5-dev | | libsdl2-dev | fatal error: SDL.h | sudo apt install libsdl2-dev |装完依赖先确认 cmake 版本别太旧。rcssserver3d 的 CMakeLists 在 3.16 以下容易在生成阶段报语法错误Ubuntu 22.04 自带的 cmake 已满足要求更老的系统就加装 kitware 官方源再升级。2.3 源码编译 rcssserver3d 与验证监听两条 ss 命令闭环拿到 SimSpark 和 rcssserver3d 的源码包后解压、进目录先编译 SimSpark 再编译 server两者的构建流程一致cd simspark mkdir build cd build cmake .. -DCMAKE_BUILD_TYPERelease make -j$(nproc) sudo make install cd ../../rcssserver3d # 按实际目录结构调整 mkdir build cd build cmake .. -DCMAKE_BUILD_TYPERelease make -j$(nproc) sudo make install-DCMAKE_BUILD_TYPERelease 去掉调试符号和断言ODE 碰撞计算会快不少Debug 版跑一场比赛经常比 Release 慢一倍以上调试完策略记得切回 Release。-j$(nproc) 指定并行编译任务数内存较小的机器全核并行容易 OOM改成 make -j4 速度损失有限。sudo make install 会把可执行文件和共享库装到 /usr/local之后运行 server 若报 error while loading shared libraries先 sudo ldconfig 刷新动态库缓存再确认 rcssserver3d 和 libsimspark 的安装路径是否在 ldconfig 可见目录里。编译完成后验证 server 是否活着rcssserver3d sleep 2 ss -ulnp | grep 3100 ss -tlnp | grep 3200两条 ss 命令分别确认 UDP 3100 和 TCP 3200 上有 rcssserver3d 进程在监听。ss 比 netstat 快且不需要 root 就能看进程名。看到有监听条目server 安装这步就闭环了如果 3100 被别的进程占着用 --agent-port 和 --monitor-port 换端口注意 agent 启动参数里的端口要和这里保持一致。3. RoboCup3D agent 代码编译CMake 清单、Boost 链接与报错速查3.1 拿到源码先读这三个文件CMakeLists、README、主入口Agent 代码常见的形态是 C 工程加 CMake 构建。拿到一份 RoboCup3D 人形仿真的 agent 源码第一件事不是 mkdir build 直接编而是先读三个文件压缩排错时间。CMakeLists.txt 决定三件事C 标准、依赖哪些 Boost 子库、可执行文件名。人形 agent 的 CMakeLists 里通常会出现 find_package(Boost REQUIRED COMPONENTS program_options system thread) 这类写法说明主程序用 program_options 解析 -host、-port、-team 参数用 thread 跑感知循环。README 则记录了编译命令和启动示例比如 ./agent -host localhost -port 3100 -team myteam。主程序入口一般做三件事解析命令行参数、初始化关节模型、进入感知-决策-执行的循环读懂入口即可定位大部分启动类问题。有一个快速识别点人形 agent 和 2D agent 的工程结构差异很大。人形代码里高频出现 JointID、Perception、SoccerCommand 这些类名而且大概率带 .rsg 后缀的机器人身体描述文件。.rsg 是 RoboCup3D 特有的机器人实体描述格式server 靠它创建带关节约束的刚体模型。看到工程的 data 目录里有一堆 .rsg 文件基本可以确定这是标准 RoboCup3D 工程而不是 2D 代码穿了个 3D 的马甲。3.2 编译命令与必调参数标准、Boost 路径和链接项cd agent_source mkdir -p build cd build cmake .. -DCMAKE_BUILD_TYPERelease -DCMAKE_CXX_STANDARD17 make -j4 ls -l agent-DCMAKE_CXX_STANDARD17 显式指定语言标准。老代码按 C11 写的不少新版 Boost 头文件在旧标准下会冒出一堆 no template named 之类的错误直接指定 17 能把这类报错压到最低。系统里装了多个 Boost 版本时CMake 可能找到旧的那个用 -DBOOST_ROOT/usr/local/boost_1_82_0 强制指过去比改系统默认头文件干净。make 失败时看第一个 error不要看屏幕最后一行链接错误undefined reference查 target_link_libraries 漏项编译错误fatal error查头文件路径。Windows 下想用 VS2010 编译这个时代的 C 代码很容易撞上 error MSB6006: cmd.exe exited with code 3。这个错误基本不是源码问题而是 CMake 生成的工程在内嵌命令里调用的工具链找不到或者工程路径带空格把命令行截断。我的建议是不要在 Windows 原生环境耗这个时间直接切 WSL2 或 Ubuntu 虚拟机。RoboCup3D 的官方生态和多数开源 agent 都以 Linux 为第一目标平台Windows 上省下的五分钟会在头文件路径和动态库问题上成倍还回去。3.3 高频编译错误对照表按报错特征反查原因| 报错特征 | 原因 | 处理方式 | | fatal error: boost/shared_ptr.hpp 头文件缺失 | 没装 Boost 或版本过老 | sudo apt install libboost-all-dev | | undefined reference to boost::program_options::... | 漏写链接库 | CMake 中补 Boost::program_options | | Qt 相关文件编译失败 | Qt/GL 头文件缺失 | 补 libqt5opengl5-dev libgl1-mesa-dev | | make: *** No rule to make target | build 目录配置残留 | 删掉 build 重新 cmake | | agent: error while loading shared libraries | 运行期动态库路径缺失 | sudo ldconfig或用 LD_LIBRARY_PATH 临时指定 |对照表的使用方式是先抄报错的第一行再按特征反查。有一点要注意同一份源码在不同发行版上编译头文件缺失的位置会变比如 Boost 1.7x 把部分头文件挪过目录老代码 include 的老路径就失效了。遇到这种问题别去改系统目录优先在 C 标准或 include 路径上适配。编译通过只证明语法和链接没问题不证明能和 server 协议对上真正的联调问题在下一章。4. 把编译好的 agent 连上 RoboCup3D server启动顺序、最小握手与日志定位4.1 为什么必须先启 server 再启 agentAgent 进程起来后会立刻向服务端发握手包server 没监听时 agent 会反复重试控制台错误信息通常是 Connection refused 或无响应且伴有超时重连日志刷屏。所以标准启动顺序是rcssserver3d 起来 → ss 确认端口 → rcssmonitor3d 起来 → agent 逐个启动。比赛模式下还要让 server 进入等待开球的状态再放 agent 入场否则 22 个 agent 在错误的时间点注册裁判逻辑可能判定该方缺员或产生位置冲突。monitor 的启动顺序也有讲究先启 monitor 再启 agent能看到机器人被放置在初始位置的完整过程方便确认 beam 坐标和身体朝向反过来连也能显示但画面会先空一阵直到收到 agent 状态。这个顺序对仿真正确性没有影响但对确认机器人到底站在哪很有用调试期建议固定为先 monitor 后 agent。4.2 用 netcat 做一次最小握手确认协议栈通不通还没编任何代码时可以用 nc 以 UDP 方式模拟一次握手验证 server 协议栈是通的echo (init (team Test) (version 12.0)) | nc -u -w 2 localhost 3100-u 指定 UDP-w 2 表示最多等两秒后退出避免 nc 挂着不返回。server 正常响应时会返回一坨 S 表达式文本开头通常是 (scene里面带当前仿真时间 time 字段。能看到 (scene 就说明 server 在推进物理时钟握手链路完全通畅。(version 参数必须与 server 编译时支持的协议版本一致版本不匹配时 server 不回复或直接丢包。协议版本由 server 源码决定agent 侧一般通过配置项指定不要随意填数字先看 server 打印的版本信息。注意 echo 接管道这种方式只适合验证握手。真正的 agent 必须常驻因为感知数据是 server 持续推送的一次性 nc 收到第一批 (scene 就退出无法维持连接。这个验证的全部意义在于把server 是否活着和agent 代码是否有问题两个变量分开避免两边同时出问题时互相甩锅。4.3 运行期日志怎么读server.log 关键字与三类高频故障server 日志默认打 stdout推荐用 tee 同时落一份到文件排错时配合 grep 回溯rcssserver3d 21 | tee server.log grep -i agent server.log | tail -20tee 的好处是终端和文件双写agent 异常时不用重新复现整场比赛直接翻日志。日志关键字对应关系如下| 日志关键字 | 含义 | | Register agent | agent 握手成功并登记入队 | | Unable to bind socket | 端口被占改用 --agent-port 换端口 | | Kick off / play | 比赛阶段推进到开球agent 可以行动 |运行期三大高频问题按概率排列第一monitor 里看不到刚启动的 agent绝大多数是 .rsg 身体文件加载失败server 日志里有 rsg 或 texture 相关报错去检查 agent 启动时指定的 body 文件路径是否真实存在。第二agent 显示在场上一路摔倒这不是 server 问题是关节初始角度或物理参数没归零去 agent 的初始化代码里查头顶朝下或腿关节限位错误。第三agent 能站起来但完全不动先确认比赛状态BeforeKickOff 阶段多数 agent 会压制踢球指令需要 monitor 或裁判控制台下发开球指令后才能行动。5. RoboCup3D 调试期最省时间的三个 server 技巧5.1 headless 模式跑批量回归调策略时不需要 monitor 画面独立验证逻辑用rcssserver3d --headless。headless 模式下 CPU 占用和内存都低不少适合把边路进攻、定位球这类固定场景反复跑几十遍做回归。配合 shell 循环每局日志按编号归档对比胜率时不用人工盯比赛for i in $(seq 1 10); do rcssserver3d --headless --game-duration 180 21 run_$i.log sleep 60 kill %1 done循环里的 sleep 60 按实际比赛时长来定机器性能差就把游戏时长调短确保下一局启动前上一局已经释放端口。跑完用 grep 从 run_*.log 里批量提取比分关键字就是一份最简单的回归报告。5.2 三个必调 server 参数速查| 参数 | 作用 | 调试期建议 | | --agent-port | agent 通信的 UDP 端口 | 本机多开实验时逐一错开 | | --game-duration | 半场时长秒 | 验证整场策略时从 300 缩到 180 | | --agent-connect-timeout | agent 握手超时秒 | 模拟高延迟网络时调大本地默认值够用 |这三个参数里最容易出问题的是端口agent 启动参数里的 -port 要和 server 的 --agent-port 一致赛前检查清单里一定要有这一条。时长参数影响的是裁判状态机改短了利于快速验证胜负统计但不要短到 agent 还没完成第一次 beam 就对局结束。5.3 用日志往返时间戳区分策略问题和环境问题遇到 agent 行为异常先看 server.log 里有没有物理报错关键字再看 agent 收到的 (scene 数据流是否连续。两边时间戳对不上先怀疑网络延迟或丢包而不是策略逻辑磁盘 IO 异常也会导致 server 掉步常见于把比赛日志写到机械硬盘同时开多个实例的场景。用 iostat 确认磁盘等待后再碰代码往往能省下半天无意义的策略调参。本文还有配套的精品资源点击获取
返回列表