Mujoco 控制器接口(四)

目录

.1 简介

1.1 控制器实现

.2 sim.step()

.3 实例

References


.1 简介

control看到下面的图中就是mjtNum类型

 

 mjtNum实际上就是浮点数

ctrl是底层的输入

外界扰动就是通过上图的qfrc和xfrc来添加的

1.1 控制器实现

实际上加上控制器就是xml里添加actuator

 joint就是对应由哪个电机控制

motor代表电机

ctrllimited代表的是电机的转动范围有限

这里说明了mujoco的逻辑 是siso就是单输入得到单输出

需要注意的是输入都被保存在变量mjData.ctrl的变量里

force outputs保存在另一个变量里

.2 sim.step()

这个函数做了什么

 先是检查参数是否在范围内

然后进行正向动力学的计算(位置速度来计算加速度)

然后检查加速度是不是合理的状态

然后进行差分迭代

最后是一个积分器,欧拉积分器

在一个while循环中添加每一步的控制量,再写一个step就可以开始循环这个函数很方便

.3 实例

import mujoco_py as mp

model = mp.load_model_from_path('ur5.xml')
sim = mp.MjSim(model)
viewer = mp.MjViewer(sim)

for i in range(3000):
    # sim.data.ctrl[:6] = 1
    sim.step()
    viewer.render()

先是读取了ur5的model

ur5的model里添加了相应的actuator

然后建立Mjsim的仿真并传入viewer中显示

sim = mp.MjSim(model)
viewer = mp.MjViewer(sim)

然后开启循环

for i in range(3000):
    # sim.data.ctrl[:6] = 1
    sim.step()
    viewer.render()

把每个关节的控制输入给到1

sim.data.ctrl[:6] = 1

然后step开始输出

输出完之后进行render

完整代码:

import mujoco_py as mp

model = mp.load_model_from_path('ur5.xml')
sim = mp.MjSim(model)
viewer = mp.MjViewer(sim)

for i in range(3000):
    sim.data.ctrl[:6] = 1
    sim.step()
    viewer.render()

运行

.4 连杆模型编写

先是link1

<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 0" euler="0 0 0">
            <joint type="free"/>
            <geom type="box" size=".1 .1 .3" rgba="0 .9 0 1"/>
        </body>
        
    </worldbody>
</mujoco>

 先是写一个带joint的双连杆

<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 0" >
            <inertial pos="0 0 0" mass="3.7" diaginertia="0.0102675 0.0102675 0.00666" />
            <joint type="free"/>
            <geom type="box" contype="0" conaffinity="0" group="1" size=".1 .1 .3" rgba="0 .9 0 1"/>
            <geom type='box' size=".1 .1 .3" rgba="0 .9 0 1"/>
            <body pos="0 0 .6" quat="1 0 0 0">
                <inertial pos="0 0 0" mass="3.7" diaginertia="0.0102675 0.0102675 0.00666" />
                <joint name="joint1" pos="0 0 .3" axis="0 1 0" limited="true" range="-3.14159 3.14159" />
                <geom type="box" contype="0" conaffinity="0" group="1" size=".1 .1 .3" rgba="0 .9 0 1"/>
                <geom type="box" size=".1 .1 .3" rgba="1 .9 0 1"/>
            </body>
        </body>        
    </worldbody>
</mujoco>

 注意joint的默认参考坐标是物体也就是model的中心

所以按照以下编码

<mujoco>
    <compiler angle="radian" />
    <worldbody>
        <light diffuse=".5 .5 .5" pos="0 0 3" dir="0 0 -1"/>
        <geom type="plane" size="10 10 0.1" rgba=".9 0 0 1"/>
        <body pos="0 0 .25" >
            <inertial pos="0 0 0" mass="10" diaginertia="0.0102675 0.0102675 0.00666" />
            <joint type="free"/>
            <geom type="box" contype="0" conaffinity="0" group="1" size=".1 .1 .25" rgba="0 .9 0 1"/>
            <geom type='box' size=".1 .1 .25" rgba="0 .9 0 1"/>
            <body pos="0 0 .5" quat="1 0 0 0">
                <inertial pos="0 0 0" mass="3.7" diaginertia="0.0102675 0.0102675 0.00666" />
                <joint name="joint1" pos="0 0 -0.3" axis="0 1 0" limited="true" range="-3.14159 3.14159" />
                <geom type="box" contype="0" conaffinity="0" group="1" size=".1 .1 .2" rgba="0 .9 0 1"/>
                <geom type="box" size=".1 .1 .2" rgba="1 .9 0 1"/>
            </body>
        </body>        
    </worldbody>
    <actuator>
        <motor name='joint1' ctrllimited="true" ctrlrange="-0.5 0.5" joint='joint1' gear="101"/> <!--range -150 150-->
    </actuator>
</mujoco>

References

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值