Mujoco xml模型

news2025/4/18 12:33:19

Mujoco xml模型

  • 一个例子
  • compiler
  • option
  • asset
    • mesh
  • default
    • 基本使用
    • childclass与class
    • 多个class
  • worldbody
    • body关系
    • inertial
    • joint
    • geom

XML主要分为以下三个部分:

  • < asset> : 用 tag导入STL文件;
  • < worldbody>:用tag定义了所有的模拟器组件,包括灯光、地板以及你的机器人;
  • < acutator>:定义可以执行运动的关节。定义的顺序需要按照运动学顺序来,比如多关节串联机器人以工具坐标附近的最后一个关节为joint0,依此类推。

一个例子

mujoco官方文档给了xml文件能写的内容
XML Reference

<mujoco model="example">
    <!-- set some defaults for units and lighting -->
    <compiler angle="radian" meshdir="meshes"/>

    <!-- 导入STL文件 -->
    <asset>
        <mesh file="base.STL" />
        <mesh file="link1.STL" />
        <mesh file="link2.STL" />
    </asset>

    <!-- 定义所有模拟器组件 -->
    <worldbody>
        <!-- 灯光 -->
        <light directional="true" pos="-0.5 0.5 3" dir="0 0 -1" />
        <!-- 添加地板,这样我们就不会凝视深渊 -->
        <geom name="floor" pos="0 0 0" size="1 1 1" type="plane" rgba="1 0.83 0.61 0.5"/>
        <!-- the ABR Control Mujoco interface expects a hand mocap -->
        <body name="hand" pos="0 0 0" mocap="true">
            <geom type="box" size=".01 .02 .03" rgba="0 .9 0 .5" contype="2"/>
        </body>

        <!-- 构建串联机器人 -->
        <body name="base" pos="0 0 0">
            <geom name="link0" type="mesh" mesh="base" pos="0 0 0"/>
            <inertial pos="0 0 0" mass="0" diaginertia="0 0 0"/>

            <!-- nest each child piece inside the parent body tags -->
            <body name="link1" pos="0 0 1">
                <!-- this joint connects link1 to the base -->
                <joint name="joint0" axis="0 0 1" pos="0 0 0"/>

                <geom name="link1" type="mesh" mesh="link1" pos="0 0 0" euler="0 3.14 0"/>
                <inertial pos="0 0 0" mass="0.75" diaginertia="1 1 1"/>

                <body name="link2" pos="0 0 1">
                    <!-- this joint connects link2 to link1 -->
                    <joint name="joint1" axis="0 0 1" pos="0 0 0"/>

                    <geom name="link2" type="mesh" mesh="link2" pos="0 0 0" euler="0 3.14 0"/>
                    <inertial pos="0 0 0" mass="0.75" diaginertia="1 1 1"/>

                    <!-- the ABR Control Mujoco interface uses the EE body to -->
                    <!-- identify the end-effector point to control with OSC-->
                    <body name="EE" pos="0 0.2 0.2">
                        <inertial pos="0 0 0" mass="0" diaginertia="0 0 0" />
                    </body>
                </body>
            </body>
        </body>
    </worldbody>

    <!-- 定义关节上的执行器 -->
    <actuator>
        <motor name="joint0_motor" joint="joint0"/>
        <motor name="joint1_motor" joint="joint1"/>
    </actuator>

</mujoco>

compiler

option

asset

mesh

<mesh name="base_link" file="base_link.obj"/>

<!--使用上-->
<geom type="mesh" mesh="base_link"/>  <!-- 使用该网格 -->

default

基本使用

< default> 定义的属性模板通过 ​​class 属性​​ 在后续的 < body>, < joint>, < geom> 等元素中引用。

基本引用规则​​:

  • ​​class="模板名"​​:在元素中添加该属性即可继承模板中定义的所有属性。
  • 继承逻辑​​:子类会继承父类的所有属性,同名属性会被子类覆盖,显式写了属性就会覆盖类的属性。
<default>
  <!-- 根默认类 -->
  <default class="robot">                <!-- 主模板 -->
    <geom friction="0.6" margin="0.001"/> <!-- 所有几何体默认摩擦系数 -->
    <joint damping="2"/>                 <!-- 所有关节默认阻尼 -->
    <motor ctrlrange="-23.7 23.7"/>      <!-- 所有电机默认控制范围 -->

    <!-- 子类:髋关节模板 -->
    <default class="abduction">         <!-- 继承自 robot -->
      <joint axis="1 0 0" range="-1.0472 1.0472"/> <!-- 覆盖 axis 和 range -->
    </default>

    <!-- 子类:膝关节模板 -->
    <default class="knee">              <!-- 继承自 robot -->
      <joint range="-2.7227 -0.83776"/>  <!-- 覆盖 range -->
      <motor ctrlrange="-45.43 45.43"/>  <!-- 覆盖电机的控制范围 -->
    </default>
  </default>
</default>

根类使用

<body name="base" childclass="robot">  <!-- 所有子元素默认继承robot类 -->
  <geom type="box" size="0.1 0.1 0.1"/> <!-- 自动应用 friction="0.6" -->
  <joint name="free_joint"/>          <!-- 自动应用 damping="2" -->
</body>

子类abduction使用

<body name="FL_hip">
  <joint name="FL_hip_joint" class="abduction"/> <!-- 继承以下属性:
       axis="1 0 0" 
       range="-1.0472 1.0472" 
       damping="2" (从父类robot继承) -->
</body>

所以也就是说使用了 < joint class=“abduction”>的,有damping=“2"属性,也有axis=“1 0 0” range=”-1.0472 1.0472"属性。

显式覆盖

<default>
  <default class="aa">
    <geom rgba="1 0 0 1" friction="0.8"/> <!-- 红色+高摩擦 -->
    <joint damping="3"/>                   <!-- 高阻尼 -->
  </default>
</default>

<body name="parent" childclass="aa">
  <!-- 子刚体自动继承类 aa -->
  <body name="child1">
    <geom type="box"/> <!-- 自动应用 rgba="1 0 0 1" 和 friction="0.8" -->
    <joint type="hinge"/> <!-- 自动应用 damping="3" -->
  </body>

  <!-- 子刚体显式覆盖属性 -->
  <body name="child2">
    <geom type="sphere" rgba="0 1 0 1"/> <!-- 覆盖为绿色 -->
    <joint type="slide" damping="1"/>    <!-- 覆盖阻尼 -->
  </body>
</body>

childclass与class

childclass 的作用范围​仅作用于 < body> 标签内​​直接嵌套​​的子 < body>,当前刚体不使用这个属性,子刚体的子刚体(孙子级)不会自动继承该 childclass,除非它们也被显式设置。

<body name="parent" childclass="aa">
  <geom/> <!-- 不会应用 aa 的 geom 默认属性 -->
  
  <!-- 子刚体(直接继承 aa) -->
  <body name="child1"> 
    <geom/> <!-- 自动应用 aa 的 geom 默认属性 -->
    
    <!-- 孙子刚体(不继承 aa,除非 child1 也设置 childclass) -->
    <body name="grandchild">
      <geom/> <!-- 不使用 aa 的属性 -->
    </body>
  </body>
</body>

<!-- 逐层传递 -->
<body name="parent" childclass="aa">
  <body name="child1" childclass="aa"> <!-- 显式传递 -->
    <body name="grandchild"> 
      <geom/> <!-- 现在继承 aa -->
    </body>
  </body>
</body>

class仅作用于当前 < body> 自身​​,不会自动传递给任何子刚体,​​子刚体若需继承​​,必须显式设置自己的 class 或 childclass。

<default>
  <default class="robot_part">
    <geom rgba="1 0 0 1"/>
    <joint damping="5"/>
  </default>
</default>

<body name="parent" class="robot_part"> 
  <!-- 当前body继承robot_part的属性 -->
  <geom type="box"/> <!-- 红色方块 -->
  
  <body name="child">
    <!-- 子刚体不受影响!使用全局默认属性 -->
    <geom type="sphere"/> <!-- 默认颜色 -->
  </body>
</body>

多个class

类名是要唯一的
​​同级 < default> 类名不能重复​​:在相同嵌套层级下,class 名称必须唯一。

<default>
	<default class="a">...</default>
	<default class="b">...</default>  <!-- 允许,不同名 -->
	<default class="a">...</default>   <!-- 错误!与第一个 "a" 冲突 -->
</default>

子类只是会继承父类的属性,并不是嵌套使用的关系,body能直接使用aa和bb,所以aa和bb不能同名

<default class="a">  <!-- 父类 -->
  <default class="aa">...</default>  <!-- 子类,继承 "a" 的属性 -->
</default>
<default class="b">
  <default class="bb">...</default>  <!-- 子类,继承 "b" 的属性 -->
</default>

worldbody

body关系

跟urdf的link和joint写法不一样,但是逻辑是一样的。

两个 < body>(刚体)通过 ​​关节(< joint>)​​ 实现物理连接,关节定义了它们之间的运动约束关系。
父子结构​​:子 < body> 必须嵌套在父 < body> 内,嵌套关系表达了父子关节,joint就不用写父子关节了。
关节定义位置​​:关节 < joint> 必须定义在 ​​子 < body> 内部​​。
​​默认行为​​:若无关节,子刚体会与父刚体​​刚性固定​​。
​​关节作用​​:添加关节后,子刚体可​​相对父刚体运动​​(旋转或平移)。

<!--定义父刚体​​-->
<body name="parent_body" pos="0 0 0">
  <!-- 父刚体的几何、惯性等属性 -->
</body>
<!--在父刚体内嵌套子刚体​​-->
<body name="parent_body">
  <body name="child_body" pos="0 0 0.1"> <!-- 初始位置偏移 -->
    <!-- 子刚体的关节、几何等 -->
  </body>
</body>
<!--在子刚体中添加关节​​-->
<body name="parent_body">
  <body name="child_body" pos="0 0 0.1">
    <joint name="child_joint" type="hinge" axis="0 1 0"/>
    <geom type="box" size="0.1 0.1 0.1"/>
  </body>
</body>

类似下面的urdf

<!-- URDF 的链式结构(明确指定父子关系) -->
<link name="parent_link"/>
<joint name="child_joint" type="revolute">
  <parent link="parent_link"/>
  <child link="child_link"/>
  <axis xyz="0 1 0"/>
</joint>
<link name="child_link"/>
特性URDFMuJoCo
​​连接方式 ​​显式通过 < parent> 和 标签隐式通过 < body> 嵌套层级
​​关节位置​​ 独立于 < link> 之外必须定义在​​子 < body> 内部​​
​​初始偏移​​在 < joint> 的 中定义在子 < body> 的 pos 属性中定义
​​几何体定义​​在 < link> 内通过 < visual>/< collision>直接在 < body> 内通过 < geom>

inertial

joint

能写的属性

属性类型描述
name字符串关节的唯一标识符。
type字符串关节的类型(如hinge、slide、ball等),决定了关节的运动方式。
pos数组关节相对于其父体的位置,默认为(0,0,0)。
axis数组运动轴向量,对于hinge和slide关节类型,这是旋转或滑动发生的方向。
range数组关节运动的范围,通常为一个最小值和一个最大值的数组。限制了关节可以达到的最小和最大位置。
damping浮点数关节的阻尼系数,用于模拟运动中的能量损失。
stiffness浮点数关节的刚度,用于模拟弹簧效果,影响关节回到初始位置的力度。
armature浮点数附加到关节轴上的虚拟质量,用于稳定仿真。可以认为是增加关节惯性的一种方式,有助于防止数值问题。
limited布尔值指示关节是否受到range属性定义的范围限制。默认为true,表示受限。

关节类型:Hinge(铰链关节),Slide(滑动关节),Ball(球形关节),free(自由关节)

geom

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2331733.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LLM 为什么使用ID,每个单词不都是有编码的吗

LLM 为什么使用ID,每个单词不都是有编码的吗 在自然语言处理(NLP)里,把文本转换为整数 ID 来表示是一种常见的做法,以下为你详细阐述使用 ID 的原因,以及是否每个单词都有编码。 使用 ID 的原因 1. 计算机可处理性 计算机没办法直接处理文本数据,因为文本是人类使用的…

转行嵌入式,需要自学多久?

作为一个本硕都学机械&#xff0c;却阴差阳错进入嵌入式行业的老兵&#xff0c;这个问题我能聊一整天。十几年前我还在工厂车间穿着工装和机床打交道&#xff0c;偶然接触到单片机后就一发不可收拾。 转行这条路我走得异常艰辛&#xff0c;踩过的坑比写过的代码还多。去年我终…

【Leetcode-Hot100】移动零

题目 解答 首先&#xff0c;使用的解题思路是&#xff1a;使用两个指针&#xff0c;分别指向数组的第一个0元素位置&#xff0c;以该元素位置1为起始点寻找接下来第一个非0元素位置。二者确定后&#xff0c;对其进行交换。随后继续寻找下一个0元素位置。重复上述操作。 但第一…

leetcode_203. 移除链表元素_java

203. 移除链表元素https://leetcode.cn/problems/remove-linked-list-elements/ 1、题目 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head …

常见算法模板总结

文章目录 一、二叉树1. DFS2. BFS 二、回溯模板三、记忆化搜索四、动态规划1. 01背包朴素版本滚动数组优化 2. 完全背包朴素版本滚动数组优化 3. 最长递增子序列LIS朴素版本贪心二分优化 4. 最长公共子序列5. 最长回文子串 五、滑动窗口六、二分查找七、单调栈八、单调队列九、…

UE5学习笔记 FPS游戏制作44 统一UI大小 sizeBox

如果我们希望多个类似的UI大小一样&#xff0c;例如不同菜单的标题&#xff0c;可以使用sizeBox组件 我们在标题控件上&#xff0c;用sizeBox包裹所有子物体 然后指定他的最小宽高&#xff0c;或最大宽高 如果指定的是最小宽高&#xff0c;当子元素&#xff08;如图片&#xf…

C++学习之服务器EPOLL模型、处理客户端请求、向客户端回复数、向客户端发送文件

目录 1.启动epoll模型 2.和客户端建立新连接 3.接受客户端Http请求数据 4.代码回顾从接受的数据中读出请求行 5.请求行解析 6.正则表达式以及匹配 7.解析请求行以及后续处理 8.对path处理说明 9.如何回复响应数据 10.对文件对应content-type如何查询 11.服务器处理流…

BUUCTF-web刷题篇(17)

26.BabyUpload 源码&#xff1a;https://github.com/imaginiso/GXY_CTF/tree/master/Web/babyupload 查看题目源码&#xff1a; 写着&#xff1a;SetHandler application/x-httpd-php 通过源码可以看出这道文件上传题目主要还是考察.htaccess配置文件的特性&#xff0c;倘若…

国网B接口协议调阅实时视频接口流程详解以及检索失败原因(电网B接口)

文章目录 一、B接口协议调阅实时视频接口介绍B.6.1 接口描述B.6.2 接口流程B.6.3 接口参数B.6.3.1 SIP头字段B.6.3.2 SIP响应码B.6.3.3 SDP参数定义B.6.3.4 RTP动态Payload定义 B.6.4 消息示例B.6.4.1 调阅实时视频请求B.6.4.2 调阅实时视频请求响应 二、B接口调阅实时视频失败…

windows11下pytorch(cpu)安装

先装anaconda 见最下方 Pytorch 官网&#xff1a;PyTorch 找到下图&#xff08;不要求版本一样&#xff09;&#xff08;我的电脑是集显&#xff08;有navdia的装gpu&#xff09;&#xff0c;装cpu&#xff09; 查看已有环境列表 创建环境 conda create –n 虚拟环境名字(…

NVR接入录像回放平台用EasyCVR打造地下车库安防:大型商居安全优选方案

一、背景分析 随着居民生活品质的提升&#xff0c;大型商业建筑和住宅小区纷纷配套建设地下停车库。但是地下车库盗窃、失火、恶意毁坏车辆、外部人员随意进出等事件频发&#xff0c;部署视频监控系统成为保障地下车库的安全关键举措。 目前&#xff0c;很多商业和住宅都会在…

乾元通渠道商中标川藏铁路西藏救援队应急救援装备项目

乾元通渠道商中标川藏铁路西藏救援队应急救援装备项目&#xff0c;项目内通信指挥车基于最新一代应急指挥车解决方案打造&#xff0c;配合乾元通自研的车载多链路聚合路由及系统&#xff0c;主要用途为保障应急通讯&#xff0c;满足任务执行时指挥协调、通信联络及数据传输的要…

左右开弓策略思路

一、策略概述 本策略是一种基于多种技术指标的复杂交易策略&#xff0c;包括自定义指标计算、过滤平滑处理以及交易信号生成。 该策略通过不同的交易平台代码段实现&#xff0c;旨在通过分析历史价格数据来预测未来价格走势&#xff0c;并据此生成交易信号。 二、主要技术指标…

【MYSQL从入门到精通】数据类型及建表

一些基础操作语句 1.使用客户端工具连接数据库服务器&#xff1a;mysql -uroot -p 2.查看所有数据库&#xff1a;show databases; 3.创建属于自己的数据库&#xff1a; create database 数据库名;create database if not exists 数据库名; 强烈建议大家在建立数据库时指定编…

【动态规划】 深入动态规划—两个数组的dp问题

文章目录 前言例题一、最长公共子序列二、不相交的线三、不同的子序列四、通配符匹配五、交错字符串六、两个字符串的最小ASCII删除和七、最长重复子数组 结语 前言 问题本质 它主要围绕着给定的两个数组展开&#xff0c;旨在通过对这两个数组元素间关系的分析&#xff0c;找出…

结合大语言模型整理叙述并生成思维导图的思路

楔子 我比较喜欢长篇大论。这在代理律师界被视为一种禁忌。 我高中一年级的时候因为入学成绩好&#xff08;所在县榜眼名次&#xff09;&#xff0c;直接被所在班的班主任任命为班长。我其实不喜欢这个岗位。因为老师一来就要提前注意到&#xff0c;要及时喊“起立”、英语课…

【力扣hot100题】(073)数组中的第K个最大元素

花了两天时间搞明白答案的快速排序和堆排序。 两种都写了一遍&#xff0c;感觉堆排序更简单很多。 两种都记录一下&#xff0c;包括具体方法和易错点。 快速排序 class Solution { public:vector<int> nums;int quicksort(int left,int right,int k){if(leftright) r…

mapbox基础,加载F4Map二维地图

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性二、🍀F4Map 简介2.1 ☘️技术特点2.2 ☘️核…

Android:Android Studio右侧Gradle没有assembleRelease等选项

旧版as是“Do not build Gradle task list during Gradle sync” 操作这个选项。 参考这篇文章&#xff1a;Android Studio Gradle中没有Task任务&#xff0c;没有Assemble任务&#xff0c;不能方便导出aar包_gradle 没有task-CSDN博客 在as2024版本中&#xff0c;打开Setting…

DRAM CRC:让DDR5内存数据更靠谱

DRAM(动态随机存取存储器)是电脑内存的核心部件,负责存储和传输数据。如果数据在传输中出错,后果可能很严重,比如程序崩溃或者数据损坏。为了解决这个问题,DDR5内存引入了一个新功能,叫DRAM CRC(循环冗余校验)。简单来说,它是用来检查读写数据有没有问题的工具。 下面…