MuJoCo 触觉传感器插件 Touch Grid:将接触力聚合为“Taxel“网格的原理与实战

MuJoCo 触觉传感器插件 Touch Grid:将接触力聚合为“Taxel“网格的原理与实战 MuJoCo 触觉传感器插件 Touch Grid将接触力聚合为Taxel网格的原理与实战【免费下载链接】mujocoMulti-Joint dynamics with Contact. A general purpose physics simulator.项目地址: https://gitcode.com/GitHub_Trending/mu/mujoco本文围绕 MuJoCo 仓库中的传感器插件文档plugin/sensor/README.md展开系统讲解touch_grid传感器插件它如何绑定到 site、如何把父刚体与外界的所有接触力/力矩按球面坐标分箱taxel聚合成 1 到 6 个通道的触觉图像以及nchannel、size、fov、gamma四个配置项的取值范围与底层实现。读完本文你可以在 MJCF 中正确配置并验证一个 touch grid 传感器理解其分箱、foveal 变形与可视化背后的源码逻辑。一、背景传感器插件在 MuJoCo 引擎中的位置MuJoCo 的引擎插件机制允许用户以动态库形式扩展传感器、约束、弹性元件等能力。plugin/sensor/目录实现的正是以引擎插件engine plugin形式编写的自定义传感器目前仓库内完整实现的是touch_grid源码入口为 register.cc 与 touch_grid.cc。从源码结构看插件的接入流程非常直接构建系统把该目录编译为共享库CMakeLists.txt 中add_library(sensor SHARED)源码为register.cc、touch_grid.h、touch_grid.cc并链接mujoco主库库加载时由mjPLUGIN_LIB_INIT(sensor)触发 register.cc 中的TouchGrid::RegisterPlugin()RegisterPlugin()touch_grid.cc#L490-L559填充mjpPlugin结构插件名mujoco.sensor.touch_grid、能力位mjPLUGIN_SENSOR、四个可配置属性{nchannel, size, fov, gamma}以及init/destroy/reset/compute/visualize五个回调。这与 MuJoCo 官方的插件机制文档doc/programming/extension.rst中的 engine plugins 部分描述一致extension声明插件可用sensor下的plugin节点完成实例化与配置。二、工作原理site、球面分箱与触觉图像2.1 传感器如何观察世界touch_grid传感器与一个site关联感知该 site 的父刚体与所有其他刚体之间的接触力和力矩。site 的坐标系决定传感器的朝向采用与相机、光源相同的约定传感器沿坐标系的负 z 轴方向看出去x、y 轴分别对应水平与竖直方向见 touch_grid.h#L27-L45 中的类注释。构造器中对此做了硬性校验传感器必须绑定到 site 上否则报错 Touch Grid sensor must be attached to a sitetouch_grid.cc#L233-L240。2.2 六个通道与 [z, x, y] 顺序传感器的输出是 1 到 6 个触摸图像touch image的堆叠分别对应传感器坐标系下的力与力矩分量。关键点在于通道顺序为 [z, x, y]这与接触坐标系中的物理含义一一对应三个力通道[法向 normal, 切向 tangent, 切向 tangent]三个力矩通道[扭转 torsional, 滚动 rolling, 滚动 rolling]。源码中通过xyz2zxy()完成 xyz → zxy 的置换touch_grid.cc#L137-L143。2.3 每个 taxel 是一球面角度分箱每个taxel纹理化触觉元素对应球面坐标系中的一个角度分箱把落在该分箱内、发生于父刚体与任意其他刚体之间的所有接触力累加进去。具体流程可从TouchGrid::Compute()touch_grid.cc#L248-L373完整读出筛选接触以 site 父刚体所属的 weld groupm-body_weldid为基准只统计与该 weld 组相关的接触无接触时直接返回所有通道清零力变换对每个接触调用mj_contactForce()得到接触坐标系下的 6 维力/力矩先乘接触坐标系变换到世界系再乘 site 坐标系矩阵变换到 site 系若父刚体 id 较小MuJoCo 约定接触力从小 id 刚体指向大 id 刚体对 6 维向量整体取负保证读数方向一致位置球面化接触点相对 site 的位置经CartesianToSpherical()转为方位角 a、仰角 e、半径 r其中 a0、e0 对应 (0, 0, −r)即 site 的负 z 方向touch_grid.cc#L145-L164二维直方图聚合Histogram2D()touch_grid.cc#L73-L95以LowerBound()二分查找确定每个接触点落入哪个 (x, y) 角度分箱把该通道分量累加进sensordata。落在分箱边界之外x_idx 0或 n_edges的接触被丢弃距离矩阵同样按分箱对半径 r 做加权直方图并除以分箱内接触数得到每个 taxel 的平均接触距离distance_供可视化使用。三、参数配置6 个数字与 XML 属性文档将传感器描述为由 6 个数字参数化但在 MJCF 中通过4 个配置属性传入size与fov各含两个分量。对照TouchGrid::Create()的校验逻辑touch_grid.cc#L170-L225完整的取值约束如下属性含义取值约束默认/说明nchannel通道数按上文 [z,x,y] 力力矩顺序截取正整数1–6省略或为 0 时取 1size水平 × 竖直分辨率taxel 数必须给出 2 个正整数缺一即报错fov水平 × 竖直视场角单位恒为角度水平 ∈ (0, 180]竖直 ∈ (0, 90]无视compiler的angle指令gammafoveal 变形强度非负浮点[0, 1]省略时为 0线性网格注意nchannel、size、fov、gamma四个属性都必须在config中提供Create()首先检查gamma与nchannel存在且可解析为数字缺失时直接报 Invalid or missing parameters in touch_grid sensor plugin。典型写法如下继承自 README 的官方示例mujoco extension plugin pluginmujoco.sensor.touch_grid/ /extension ... sensor plugin nametouch pluginmujoco.sensor.touch_grid objtypesite objnametouch config keynchannel value3/ config keysize value7 7/ config keyfov value45 45/ config keygamma value0/ /plugin /sensor /mujoco其中几个容易踩坑的细节输出维度nchannel * size_x * size_y。插件注册时nsensordata回调正是这样计算的touch_grid.cc#L506-L513单元测试也据此断言size6 2、nchannel3时model-sensor_dim[0] 36见 sensor_test.cc#L32-L42 及其 测试模型objtypesite objnametouch指明传感器绑定的 site 类型与名称site 必须在模型中真实存在fov 永远是角度不受compiler angleradian影响。四、视场角与 Foveal 变形fov和gamma的几何含义分箱边界由BinEdges()生成touch_grid.cc#L117-L135分三步在 (−1, 1) 区间对 x、y 各自生成size1个等距边界LinSpace对每个边界施加 foveal 变形Fovea()把边界缩放为弧度x 边界乘以fov_x * π/180y 边界乘以fov_y * π/180。其中 foveal 变形是一个线性/五次插值非线性touch_grid.cc#L107-L115Fovea(x, γ) γ·x⁵ (1−γ)·xγ0时退化为均匀网格γ→1时x⁵把边缘区域强烈压缩、把中央区域放大形成类似中央凹fovea的密集采样——中心 taxel 更密、边缘 taxel 更疏如本文开头fovea.png插图所示。仓库文档用三张 30°/30°、180°/30°、180°/90° 的插图见 images 目录 中的30-30.png、180-30.png、180-90.png说明不同视场角下球面分箱的形态水平视场越大taxel 横向覆盖的方位角范围越宽竖直视场上限为 90°即 site 负 z 轴向下的半球内。五、输出、计算时机与可视化计算时机插件声明plugin.needstage mjSTAGE_ACCtouch_grid.cc#L515-L516即必须等接触力加速度阶段计算完成后才运行因此每一时间步都能读到完整的mj_contactForce结果状态该传感器是无状态的nstate 0Reset()为空实现所有历史如distance_都保存在TouchGrid实例成员里destroy回调负责释放touch_grid.cc#L503-L532可视化Visualize()会为每个有接触的 taxel 画一个小盒体位置/尺寸取自平均接触距离与分箱角宽盒体厚度固定为距离的 2%kRelativeThickness 0.02颜色按前min(nchannel, 3)个通道以最大法向力归一化touch_grid.cc#L378-L487。当场景中盒体数量超过maxgeom预分配容量时会告警提示增大该值。六、完整示例模型仓库自带可交互示例 touch_grid.xml其结构与上文的配置说明完全对应适合直接打开实验场景包含一个带纹理的 hfield 地形、一个地面 plane以及一个椭球ball其上有 5 个自由度3 平动 2 旋转用于自由滚动ball 上定义site nametouch pos0 0 .1/球体下表面附近正好正对地形sensor下配置mujoco.sensor.touch_gridsize7 7、fov45 45、gamma0、nchannel3即 3 个力通道 × 7×7 147 维输出compiler autolimitstrue/与visualscale contactwidth.02 contactheight.5//visual配合让接触可视化清晰可读。在 MuJoCo 的 GUI如 simulate/studio中打开该模型后球体与地形接触时即可看到 touch grid 的盒体触觉图像随接触形变而更新。七、touch_stress 插件的移除说明README 同时记录了一项重要变更touch_stress传感器插件已在MuJoCo 3.3.5中移除其功能被收编为引擎内置的原生tactile传感器。仓库中的 tactile.xml 提供了原生tactile传感器的示例模型。这意味着在新版本中若你的项目依赖touch_stress应迁移到 XML 参考文档中的原生tactile传感器而touch_grid仍以引擎插件形式提供是获得球面分箱触觉图像的标准途径。小结plugin/sensor/README.md所描述的touch_grid是 MuJoCo 插件化传感器机制的完整范例用 4 个 XML 配置属性驱动一个以 site 为原点、按球面角度分箱聚合接触力/力矩的触觉传感器输出维度为nchannel × size_x × size_y并自带基于平均接触距离的 3D 可视化。结合本文给出的源码级证据参数校验、Histogram2D聚合、Fovea变形、mjSTAGE_ACC计算时机你可以在开发触觉/抓取类任务时精确控制传感器分辨率与视野并读懂传感器读数的每一个分量的物理含义。【免费下载链接】mujocoMulti-Joint dynamics with Contact. A general purpose physics simulator.项目地址: https://gitcode.com/GitHub_Trending/mu/mujoco创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考