Mujoco xml编写(二)

本文介绍了Mujoco物理引擎的XML配置,包括基础元素如compiler、body、geom和joint,以及如何在Ubuntu上进行安装和测试。此外,还展示了从简单的物体模拟到进阶的属性修改,如重力、惯性和光照效果的调整,以及使用PythonAPI进行模拟操作。
摘要由CSDN通过智能技术生成

目录

.1 运行

1.1 测试

.2 XML

2,1 基础

2.3 简单实例

2.3 进阶例子

.1 运行

1.1 测试

基于Mujoco210 Ubuntu 22.04配置安装_啥也不是的py人的博客-CSDN博客完成安装后

import mujoco_py
import os
mj_path= mujoco_py.utils.discover_mujoco()
xml_path = os.path.join(mj_path, 'model', 'humanoid.xml')
model = mujoco_py.load_model_from_path(xml_path)
sim = mujoco_py.MjSim(model)
print(sim.data.qpos)
sim.step()
print(sim.data.qpos)

运行结果

即为接口没问题

.2 XML

XML 语法 | 菜鸟教程

XML Reference - MuJoCo Documentation

2,1 基础

 模板

 注意大小写在XML中是有区别的

1、mujoco

属性-model: 类型-string

可以定义这个模型的名称,也是xml必要开头

2、compiler

这个元素是用于设置内置解析器和编译器选项。解析和编译后不再有任 何影响。这里的设置是全局性的,适用于整个模型。

boundmass: real , "0"

-提供一个比body更低的边界限制,以解决模型建立不准确问题。注意mujoco没有dummy(虚拟实体)设置。

coordinate[坐标系]:[local , global]   "local" for MJCF, always "local" for URDF

-该属性用于指定文档撰写模型的位置方向是在local还是global的。URDF解析器将属性内部设置为loacl,无法修改。

angle:[radian, degree]

-指定弧度制和角度值。MJCF默认弧度制,urdf默认角度制。

meshdir: string, optional

-string是定位mesh或高度场文件路径。

  texturedir:string , optional

-用于搜寻文档

3、optional

timestep:real , "0.002"(实数类型)

-以秒为单位的仿真步长,必须长于CPU时长。

apirate:real , "100"

-套接字API的更新速度。不影响物理仿真。

impratio:real , "1"

-定义较为复杂的摩擦力

gravity:real(3),"0 0 -9.81"

-自然是定义重力的。默认z轴向上。

还有wind、density、viscosity、magnetic风、密度、粘度、磁力等物理性质;

collision : [all , predefined , dynamic] , "all"

-检测几何碰撞。括号内表示检测对象的选择。

4、optional/flag

性质的enable和disable

5、asset

texture、hfield、mesh、skin/bone、material

6、(world)body

name:string,optional

-命名

childclass: string, optional

-继承设置

mocap:[false , true],"false"

-仅为世界实体下属且没有关节才设置为真。

pos: real(3),optional

-默认(0,0,0)

  6.1、body/inertial

pos:real(3),required

-惯性坐标系的位置

quat,axisangle,xyaxes,zaxis,euler

-惯性坐标系方向

mass:real,required

-实体质量。

diainertia:real(3),optional

-对角惯性矩阵,表达相对于惯性坐标系实体的惯性。如果省略则fullinertia必须。

fullinertia:real(6),optional

-3x3的对称阵M,因此只需要六个变量。

6.2、body/joint     在该元素下创建关节,如若没有定义关节,那么实体就是焊接于母体之上的

name:string,optional

class:string,optional

type:[free , ball , slide , hinge],"hinge"

-定义关节类型。

-free-即六自由度关节,就是可以使实体漂浮。

-ball-就是球形关节

-slide-滑动关节

-hinge-铰接关节,有一个转动自由度,并且是默认关节类型

group:int,"0"

-整合关节组,方便调用

pose:real(3),"0 0 0"

-关节位置

axis:real(3)," 0 0 1"

-指定旋转轴铰链关节旋转方向;滑动关节的滑动方向。

range:reeal(2),"0  0"

-可以限制所有关节,除了自由关节

damping:real, "0"

-阻尼设置

9、body/geom  碰撞的必要条件

name:string,optional

class:string,optional

type: [plane,hfield,sphere,capsule,cylinder,box,mesh],"sphere"

-参数代表了几何形状。

rgba:real(4),"0.5  0.5  0.5  1"

-设置颜色和透明度

mesh:string,optional

-应该指的是,设置为网格时,会参考字符串指定形状生成几何形状。

2.3 简单实例

MuJoCo_Lec_1__Working_with_XML_files_(Spring_2022)_哔哩哔哩_bilibili

创建一个hello.xml

然后simulate一下

 或者直接simulate然后拖入xml即可

 ps:mujoco只加载一个xml多个xml无法叠加

以下为代码

<mujoco>
    <worldbody>
        <light diffuse=".5 .5 .5" pos="0 0 3" dir="0 0 -1"/>
        <geom type="plane" size="1 1 0.1" rgba=".9 0 0 1"/>
        <body pos="0 0 1">
            <joint type="free"/>
            <geom type="box" size=".1 .2 .3" rgba="0 .9 0 1"/>
        </body>
    </worldbody>
</mujoco>

丢进去的效果

 两个方块的代码

<mujoco>
    <worldbody>
        <light diffuse=".5 .5 .5" pos="0 0 3" dir="0 0 -1"/>
        <geom type="plane" size="1 1 0.1" rgba=".9 0 0 1"/>
        <body pos="0 0 1">
            <joint type="free"/>
            <geom type="box" size=".1 .2 .3" rgba="0 .9 0 1"/>
        </body>
        <body pos="0 1 1">
            <joint type="free"/>
            <geom type="box" size=".1 .2 .3" rgba="0 .9 0 1"/>
        </body>
    </worldbody>
</mujoco>

<light diffuse=".5 .5 .5" pos="0 0 3" dir="0 0 -1"/>

diffuse是光的漫反射颜色

dir是光的照射方向

pos是光的位置

 geom就是导入的物体形状

加一个球的xml如下

<mujoco>
    <worldbody>
        <light diffuse=".5 .5 .5" pos="0 0 3" dir="0 0 -1"/>
        <geom type="plane" size="1 1 0.1" rgba=".9 0 0 1"/>
        <body pos="0 0 1">
            <joint type="free"/>
            <geom type="box" size=".1 .2 .3" rgba="0 .9 0 1"/>
        </body>
        <body pos="0 1 1">
            <joint type="free"/>
            <geom type="box" size=".1 .2 .3" rgba="0 .9 0 1"/>
        </body>
        <body pos="0 1 1">
            <joint type="free"/>
            <geom type="sphere" size=".1 .2 .3" rgba="0 .9 0 1"/>
        </body>
    </worldbody>
</mujoco>

2.3 进阶例子

增加euler角

<mujoco>
    <worldbody>
        <light diffuse=".5 .5 .5" pos="0 0 3" dir="0 0 -1"/>
        <geom type="plane" size="1 1 0.1" rgba=".9 0 0 1"/>
        <body pos="0 0 1" euler="0 30 0">
            <joint type="free"/>
            <geom type="box" size=".1 .2 .3" rgba="0 .9 0 1"/>
        </body>
    </worldbody>
</mujoco>

修改渲染措施Frame World可以显示世界坐标系

 compiler 可以修改单位

比如把角度的单位修改为弧度制

<mujoco>
    <compiler angle="radian"/>
    <worldbody>
        <light diffuse=".5 .5 .5" pos="0 0 3" dir="0 0 -1"/>
        <geom type="plane" size="1 1 0.1" rgba=".9 0 0 1"/>
        <body pos="0 0 1" euler="0 -0.5 0">
            <joint type="free"/>
            <geom type="box" size=".1 .2 .3" rgba="0 .9 0 1"/>
        </body>
    </worldbody>
</mujoco>

option可以修改一些参数

 修改重力,这样物体降落的很慢

<mujoco>
    <compiler angle="radian"/>
    <option gravity="0 0 -1"/>
    <worldbody>
        <light diffuse=".5 .5 .5" pos="0 0 3" dir="0 0 -1"/>
        <geom type="plane" size="1 1 0.1" rgba=".9 0 0 1"/>
        <body pos="0 0 1" euler="0 -0.5 0">
            <joint type="free"/>
            <geom type="box" size=".1 .2 .3" rgba="0 .9 0 1"/>
        </body>
    </worldbody>
</mujoco>

修改惯性

 加入惯性的xml

<mujoco>
    <compiler angle="radian"/>
    <option gravity="0 0 -1"/>
    <worldbody>
        <light diffuse=".5 .5 .5" pos="0 0 3" dir="0 0 -1"/>
        <geom type="plane" size="1 1 0.1" rgba=".9 0 0 1"/>
        <body pos="0 0 1" euler="0 -0.5 0">
            <joint type="free"/>
            <inertial pos="0 0 0" mass="1" diaginertia="0.01 0.01 0.01"/>
            <geom type="box" size=".1 .2 .3" rgba="0 .9 0 1"/>
        </body>
    </worldbody>
</mujoco>

inertial pos="0 0 0" pos的修改会影响物体的质心

可以显示mass中心和接触力()

 visual模块

场景和物体更亮

<mujoco>
    <compiler angle="radian"/>
    <visual>
        <headlight ambient="1 0.5 0.5">
    </visual>
    <option gravity="0 0 -1"/>
    <worldbody>
        <light diffuse=".5 .5 .5" pos="0 0 3" dir="0 0 -1"/>
        <geom type="plane" size="1 1 0.1" rgba=".9 0 0 1"/>
        <body pos="0 0 1" euler="0 -0.5 0">
            <joint type="free"/>
            <inertial pos="0 0 0" mass="1" diaginertia="0.01 0.01 0.01"/>
            <geom type="box" size=".1 .2 .3" rgba="0 .9 0 1"/>
        </body>
    </worldbody>
</mujoco>

asset

类似于xarco定义一个变量后续标签直接调用

<mujoco>
    <compiler angle="radian"/>
    <visual>
        <headlight ambient="0.5 0.5 0.5"/>
    </visual>

    <asset>
        <material name="white" rgba="1 1 1 1"/>
    </asset>

    <option gravity="0 0 -1"/>
    <worldbody>
        <light diffuse=".5 .5 .5" pos="0 0 3" dir="0 0 -1"/>
        <geom type="plane" size="1 1 0.1" rgba=".9 0 0 1"/>
        <body pos="0 0 1" euler="0 -0.5 0">
            <joint type="free"/>
            <inertial pos="0 0 0" mass="1" diaginertia="0.01 0.01 0.01"/>
            <!-- <geom type="box" size=".1 .2 .3" rgba="0 .9 0 1"/> -->
            <geom type="box" size=".1 .2 .3" material="white"/>
        </body>
    </worldbody>
</mujoco>

 加入两个盒子

<mujoco>
    <compiler angle="radian"/>
    <visual>
        <headlight ambient="0.5 0.5 0.5"/>
    </visual>

    <asset>
        <material name="white" rgba="1 1 1 1"/>
    </asset>

    <option gravity="0 0 -1"/>
    <worldbody>
        <light diffuse=".5 .5 .5" pos="0 0 3" dir="0 0 -1"/>
        <geom type="plane" size="1 1 0.1" rgba=".9 0 0 1"/>
        <body pos="0 0 1" euler="0 0 0">
            <joint type="free"/>
            <inertial pos="0 0 0" mass="1" diaginertia="0.01 0.01 0.01"/>
            <!-- <geom type="box" size=".1 .2 .3" rgba="0 .9 0 1"/> -->
            <geom type="box" size=".1 .2 .3" material="white"/>
        </body>

        <body pos="0 0 2" euler="0 1.57 0">
            <joint type="free"/>
            <inertial pos="0 0 0" mass="1" diaginertia="0.01 0.01 0.01"/>
            <!-- <geom type="box" size=".1 .2 .3" rgba="0 .9 0 1"/> -->
            <geom type="box" size=".1 .2 .3" material="white"/>
        </body>
    </worldbody>
</mujoco>

2.4 添加物体

直接在xml里添加

 API reference — mujoco-py 1.50.1.0 documentation

 .3 Mujoco in Python

pip install mujoco

然后测试代码

import time

import mujoco
import mujoco.viewer

m = mujoco.MjModel.from_xml_path('/home/ubuntu/code/test_mujoco/mujocopy_test/two_obj.xml')
d = mujoco.MjData(m)

with mujoco.viewer.launch_passive(m, d) as viewer:
  # Close the viewer automatically after 30 wall-seconds.
  start = time.time()
  while viewer.is_running() and time.time() - start < 30:
    step_start = time.time()

    # mj_step can be replaced with code that also evaluates
    # a policy and applies a control signal before stepping the physics.
    mujoco.mj_step(m, d)

    # Example modification of a viewer option: toggle contact points every two seconds.
    with viewer.lock():
      viewer.opt.flags[mujoco.mjtVisFlag.mjVIS_CONTACTPOINT] = int(d.time % 2)

    # Pick up changes to the physics state, apply perturbations, update options from GUI.
    viewer.sync()

    # Rudimentary time keeping, will drift relative to wall clock.
    time_until_next_step = m.opt.timestep - (time.time() - step_start)
    if time_until_next_step > 0:
      time.sleep(time_until_next_step)

运行

 

ViewHolder 是用于提高 RecyclerView 性能的一个类,它可以缓存 ItemView 中的子控件,避免了频繁的 findViewById 操作。ViewHolder 的 XML 编写和普通的布局文件编写是一样的,只是在使用时需要将其与 RecyclerView.Adapter 中的 onCreateViewHolder 方法结合使用。 下面是一个简单的 ViewHolder 的 XML 编写示例: ```xml <!-- item_list.xml --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <ImageView android:id="@+id/item_image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/item_image" /> <TextView android:id="@+id/item_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Item Name" /> <TextView android:id="@+id/item_description" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Item Description" /> </LinearLayout> ``` 在 RecyclerView.Adapter 中,我们需要重写 onCreateViewHolder 方法,实例化 ViewHolder 并将其与对应的布局文件绑定: ```java @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_list, parent, false); return new ViewHolder(view); } public class ViewHolder extends RecyclerView.ViewHolder { public ImageView imageView; public TextView nameView; public TextView descriptionView; public ViewHolder(View itemView) { super(itemView); imageView = itemView.findViewById(R.id.item_image); nameView = itemView.findViewById(R.id.item_name); descriptionView = itemView.findViewById(R.id.item_description); } } ``` 在这个例子中,ViewHolder 类中声明了三个子控件的变量,然后在构造函数中使用 findViewById 方法获取这些子控件的引用。这样,在 onBindViewHolder 方法中就可以直接使用这些子控件的引用,避免了频繁的 findViewById 操作,提高了 RecyclerView 的性能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值