ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

MuJoCo 如何用 mujoco.pid 执行器插件在 MJCF 中配置 PID 控制?

MuJoCo 如何用 mujoco.pid 执行器插件在 MJCF 中配置 PID 控制? MuJoCo 如何用 mujoco.pid 执行器插件在 MJCF 中配置 PID 控制【免费下载链接】mujocoMulti-Joint dynamics with Contact. A general purpose physics simulator.项目地址: https://gitcode.com/GitHub_Trending/mu/mujocoMuJoCo 内置的执行器类型position、velocity、general 等覆盖不了所有控制需求。当你在模型中需要给定控制目标值输出力由 PID 律计算这类自定义执行器行为时官方提供的第一方执行器插件mujoco.pid就是为此设计的它实现一个可配置的比例-积分-微分PID控制器作用在指定关节上。本文的任务是在一个 MJCF 模型中声明并配置mujoco.pid插件实例把它挂到关节上然后加载模型、检查状态维度、跑一步仿真来验证配置正确。前提插件库必须先注册、加载mujoco.pid插件由仓库内的 plugin/actuator 目录实现CMakeLists.txt 把它构建为一个名为actuator的共享库add_library(actuator SHARED)顶层 CMakeLists.txt 通过add_subdirectory(plugin/actuator)将其纳入构建。插件在 MJCF 中被引用之前必须先注册到 MuJoCo。doc/programming/extension.rst 说明了两条加载路径用mj_loadPluginLibrary加载指定动态库——这是加载含插件动态库的推荐方式用mj_loadAllPluginLibraries扫描并加载目录下所有插件库——交互式查看器simulate就是用它自动加载插件的。关键的失败条件模型解析时只要 MJCF 里声明了某个插件但插件尚未注册就会抛出模型编译错误。所以加载模型失败且报错提到插件时第一件要检查的事就是插件库是否已加载。在 MJCF 中声明 PID 实例与配置项配置分两步先在extension下声明插件并创建命名实例参数写在实例的config里再在actuator下用plugin元素把实例挂到关节上。plugin/actuator/README.md 给出的官方示例原文mujoco extension plugin pluginmujoco.pid instance namepid config keykp value40.0/ config keyki value40/ config keykd value4/ config keyslewmax value3 / config keyimax value1/ /instance /plugin /extension worldbody body joint namej typeslide axis0 0 1 / geom size0.01 mass1/ /body /worldbody actuator plugin jointj pluginmujoco.pid instancepid / /actuator /mujoco注意一个文档与当前实现的差异上面的示例同时设置了ki和slewmax但actuator元素没有写actdim。按当前源码 plugin/actuator/pid.cc 的校验逻辑和 test/plugin/actuator/pid_test.cc 中的WrongActdim用例此时模型无法加载报错信息会提示需要添加的actdim值actdim规则见下一节。因此该示例应理解为结构示意实际使用时请按下一节补齐actdim。config支持的键、默认值与含义来自 plugin/actuator/README.md属性默认值含义kp0P增益ki0I增益。若非零mjData.act中会多一个激活变量存放当前 I 项单位为力kd0D增益imax可选指定后I 项产生的力被裁剪到[-imax, imax]slewmax可选设定值setpoint允许的最大变化速率。若两个时间步之间请求的变化更大会被裁剪到[ctrl - slewmax * dt, ctrl slewmax * dt]。指定后mjData.act中多一个激活变量存放上一时刻的ctrl控制律本身README 原文公式$$f(t) K_p e(t) K_i \int_0^t e(\tau),\mathrm{d}\tau K_d \frac{\mathrm{d}e(t)}{\mathrm{d}t},$$其中 $e(t) u(t) - \ell(t)$ 是控制u与执行器长度 $\ell$ 之差。合法键在插件注册时向 MuJoCo 声明模型编译器会对无效取值报错doc/programming/extension.rst 的 Configuration in MJCF 一节。把实例挂到执行器上并写对 actdimactuator下每个plugin元素通过plugin和instance属性引用上面声明的实例joint指定受控关节。actdim是该插件最容易配错的属性它必须等于该执行器的激活变量数量而激活变量数量由配置决定plugin/actuator/pid.cc 的ActDim与Create校验以及 test/plugin/actuator/pid_test.cc 的断言ki非零 → 加 1积分项状态设置了slewmax→ 加 1上一时刻 ctrl执行器带dyntypefilter、filterexact或integrator→ 再加 1doc/programming/extension.rst 说明该 dyntype 的状态变量放在插件状态之后。对照仓库自带的演示模型 model/plugin/actuator/pid.xml可以看到正确的写法只有kp或kpkd的实例pid1、pid2对应的plugin不写actdim带ki的实例pid3、pid4对应执行器写actdim1actuator plugin jointj1 pluginmujoco.pid instancepid1 ctrlrange0 0.15 / plugin jointj3 pluginmujoco.pid instancepid3 ctrlrange0 0.15 actdim1 / /actuator该演示模型还定义了四个实例来对比不同组合的行为原文注释pid1纯 P 增益bounces up and down上下弹跳pid2PD 控制器settles below setpoint稳定在设定值之下pid3完整 PIDreaches setpoint到达设定值pid4带 I 项限幅imax.5。这是观察参数效果最直接的参照。两条使用规则来自 doc/programming/extension.rst若只有一个 MJCF 元素由该插件支撑实例可以省略extension中的显式instance直接在actuatorplugin元素下就地隐式创建并配置config直接写在该元素里若多个元素共享同一个实例比如多个执行器用同一组 PID 参数实例必须显式声明各执行器用instance属性指向它——test/plugin/actuator/pid_test.cc 的MultipleActuatorsSamePlugin用例验证了共享实例的两个执行器各自独立工作。验证配置是否生效plugin/actuator/pid_test.cc 展示了官方验证 PID 插件配置的做法核心是三步加载模型、检查激活变量数量、跑仿真看状态。下面是一段按该测试文件断言方式改写的 C 语言示例mj_loadXML、mj_makeData、mj_step为 MuJoCo C API模型文件换成你的 MJCF 路径MjModel* m mj_loadXML(pid.xml, NULL, NULL); if (!m) { // 加载失败优先检查插件库是否已加载、actdim 是否匹配 return -1; } // 每个执行器的激活变量数0 无 ki 且无 slewmax // 1 ki 或 slewmax 之一2 两者都有 printf(actdim[0] %d\n, m-actuator_actnum[0]); MjData* d mj_makeData(m); d-ctrl[0] 0.15; // 设定值应落在执行器的 ctrlrange 内 for (int i 0; i 10000; i) { mj_step(m, d); } // 检查执行器输出力与关节位置 printf(actuator_force[0] %f\n, d-actuator_force[0]); printf(qpos[0] %f\n, d-qpos[0]);成功条件来自测试文件的断言可据此核对你的模型纯 P/PD 配置下m-actuator_actnum为 0启用ki或slewmax的实例为 1两者都启用为 2各EXPECT_EQ断言在 model/plugin/actuator/pid.xml 这类受重力影响的模型上测试ITerm给出稳态预期PD 控制器稳定在1.0 - m*g/kp即设定值下方一个静差完整 PID 到达设定值1.0带imax限幅的 PID 停在1.0 - (m*g - imax)/kp。这些是测试用例的文档示例数值用于说明PD 有静差、I 项消除静差、imax 限制 I 项贡献的定性结论不要直接当成你模型的固定输出。常见失败与对应处理以下报错均来自 plugin/actuator/pid.cc 的校验逻辑并由 test/plugin/actuator/pid_test.cc 的InvalidClamp、InvalidSlew、WrongActdim用例确认加载行为现象原因处理模型编译错误提到插件未注册MJCF 声明了插件但库未加载先mj_loadPluginLibrary或用simulate的自动扫描加载再解析模型加载失败错误包含imaximax配成负值源码警告 negative imax改为非负值加载失败错误包含slewmaxslewmax为负源码要求 slewmax must be non-negative改为非负值加载失败错误提示actdimNactdim缺失或与实际激活变量数不符按报错提示的值设置actdim实例创建失败actuator not found for plugin instance N没有任何执行器引用该实例给对应actuatorplugin元素补上instance属性两个行为细节在写控制逻辑时需要注意均来自测试用例第一个设定值不受 slewmax 限制SlewMaxRateUsesFirstCtrl用例显示仿真从ctrl1.0起步时t0 没有上一时刻 ctrl力直接是kp * 1.0速率限制从第二个时间步才生效imax在 MJCF 里是力的上限plugin/actuator/pid.h 注明 XML 中的限幅值是力域限制内部会按i_gain换算成积分值上限。可选分支给 PID 加 dyntype 实现积分速度控制doc/programming/extension.rst 提到可以在执行器插件上指定dyntype在用户输入与执行器状态之间引入滤波器或积分器。test/plugin/actuator/pid_test.cc 的IntegratedVelocitySlewMaxRate用例给出了一个具体组合dyntypeintegrator dynprm1 0 0 actearlytrue用 PID 插件实现积分速度控制器并验证其行为与带slewmax的设定值斜坡等价。这条路径属于进阶用法且会使actdim再加 1同一用例的WrongActdim变体确认slewmaxdyntypeintegrator需要actdim2只在确实需要滤波器/积分器行为时再启用。【免费下载链接】mujocoMulti-Joint dynamics with Contact. A general purpose physics simulator.项目地址: https://gitcode.com/GitHub_Trending/mu/mujoco创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表