MuJoCo学习
说明
-
在google-deepmind的github上,关于MuJoCo有三个连接mojoco、mujoco_mpc、mujoco_menagerie。
- 之前有一个mujoco_py的api,是openai搞的;不过它不再支持MuJoCo2.1.0以后的版本,
- 新的python版本需要参考official MuJoCo Python bindings,通过
pip install mujoco
安装(升级的话:pip install –upgrade mujoco)。(MuJoCo Python Bindings)this package is the canonical Python bindings。documentation。 - google 的colab
!!! hint - 课程内容,暂不对外开放
在github上下载了Releases版本,双击.app就可以打开软件(不过还是放到Mac中的Application中),把提供的xml例程拖进软件就可以运行
MuJoCo的xml文件(更准确的是MJCF modeling language)是MuJoCo中一种模型语言,语法类似urdf,不过比urdf更高级。
URDF文件经过一些修改,也可以在MuJoCo中使用,不过在MuJoCo中不推荐urdf。原因:urdf格式简单,which would greatly limited in what you could model in MuJoCo.
MoJoCo.app
MoJoCo软件中的各种功能点击拖动就可以控制进行效果,很丝滑。
Python Bindings
Python Bindings中,利用pip install mujoco
安装。升级的话:pip install --upgrade mujoco
Standalone application
在对应环境的终端下,直接运行 python -m mujoco.viewer
,就会出现一个和那个MuJoCo.app一模一样的界面,但不是MuJoCo.app被启动的,感觉他们就是两套东西。
python -m mujoco.viewer
launches an empty visualization session, where a model can be loaded by drag-and-drop.python -m mujoco.viewer --mjcf=/path/to/some/mjcf.xml
launches a visualization session for the specified model file.- 命令行直接启动,不需要python脚本
Managed viewer
直接在程序中导入库
import mujoco.viewer
mujoco.viewer.launch()
右击run main.py
,就可以打开一个新MuJoCo界面,也不是那个MuJoCo.app。
1、这个不需要mjpython
2、
import mujoco.viewer
需要单独导入,不能只导入import mujoco
,然后mujoco.viewer...
,因为mujoco索引不出来viewer…。3、(‼️重要‼️)
view.launch
blocks user code to support precise timing of the physics loop(阻塞用户代码以支持精确的物理循环定时)
viewer.launch()
launches an empty visualization session, where a model can be loaded by drag-and-drop.viewer.launch(model)
launches a visualization session for the givenmjModel
where the visualizer internally creates its own instance ofmjData
viewer.launch(model, data)
is the same as above, except that the visualizer operates directly on the givenmjData
instance – upon exit thedata
object will have been modified。
Passive viewer(重要)
import time
import mujoco
import mujoco.viewer
m = mujoco.MjModel.from_xml_path('./mujoco_menagerie/anybotics_anymal_c/scene.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)
这个程序是一个官网的简单例程,注意在PyCharm中不能直接点击右键Run 'main'
,因为在launch_passive
requies that the Python script be run under mjpython
on macOS。解决办法:直接在终端mjpython main.py
。
By calling
viewer.launch_passive(model, data)
. This function ==does not block==, allowing user code to continue execution.
(2024.12.6)被动模式下,不能控制可视化界面,不能进行操作、拖拽等。
C++
to build MuJoCo from source,need CMake,C++17 compiler
Clone the mujoco
repository from github
git clone --recursive https://github.com/google-deepmind/mujoco.git
下载到了本地/Users/liuhaitao/lht_vscode/MuJoCo_Cpp/
中,就出现了一个mujoco文件夹,然后在新建一个build
文件夹
进入 build 路径下,cmake /Users/liuhaitao/lht_vscode/MuJoCo_Cpp/mujoco
然后还是在build路径下在执行cmake --build .
注意:在终端中进行cmake,和利用VSCode编译差不多,不过目前没有触发.vscode中的那三个位置文件。
tasks.json
、settings.json
、c_cpp_properties.json
。
编译之后,在build中有bin文件夹,在此文件夹路径在,可以使用
./simulate 某个xml文件路径
./compile 某个urdf文件路径
好像编译成功了,不过编译成功以后,有啥用?该怎么操作?
2024.4.5
URDF、MJCF、XML
系统学习一下:https://www.bilibili.com/video/BV1f5mmYREPt?spm_id_from=333.788.player.switch&vd_source=bdbd2cae943df9a87e7e4562d3092936
大佬讲解的!!!2024.11.11。
1、格式文件描述以及使用
模型文件在两个文件夹好像不太行,现在弄到了一个文件夹中
不过模型的三维格式类型需要是mujoco中所支持的类型(感觉需要经过专门的优化才可以,直接利用原来简单的三维模型文件不太行),还有一些奇奇怪怪的问题?
MuJoCo works with triangulated meshes. They can be loaded from binary STL files(二进制的STL文件), OBJ files or MSH files with custom format described below, or vertex and face data specified directly in the XML. Software such as MeshLab(mac上已经安装了) can be used to convert from other mesh formats to STL or OBJ.
好像还有一些限制massaging,参考:e.g. mass and inertia needing to be positive, turning off discardvisual which is on by default, etc.
1)
./compile 某个urdf文件路径
编译成xml文件,将这个xml文件拖拽进入mujoco中;2)直接将urdf文件拖进去
效果是一样的
需要在urdf文件中添加mujoco
标签
<?xml version="1.0" ?>
<robot name="fr3">
<mujoco>
<compiler meshdir="meshes/" balanceinertia="true" discardvisual="false"/>
</mujoco>
<link name="fr3_link0">
...
重点是这几个标签属性。
1、meshdir
2、balanceinertia
3、discardvisual
4、convexhull
直接按照之前的URDF文件,比如某个关节:
<link name="fr3_link0">
<inertial>
<origin xyz="-0.041018 -0.00014 0.049974" rpy="0 0 0" />
<mass value="0.629769" />
<inertia ixx="0.00315" ixy="8.2904E-07" ixz="0.00015" iyy="0.00388" iyz="8.2299E-06" izz="0.004285" />
</inertial>
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<!-- <mesh filename="link0_meshlab.stl"/> -->
<mesh filename="link0.dae"/>
</geometry>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<mesh filename="link0.stl"/>
</geometry>
</collision>
</link>
可以显示,但是如下所示,并没有读取xxx.dae,而是读取了collision中的碰撞检测模型。
利用MeshLab把dae转换成stl格式,也是不管用,跟上图一样。
然后保持visual中的mesh是MeshLab转化后的stl文件,将collision标签注释,貌似好一些
<link name="fr3_link0">
<inertial>
<origin xyz="-0.041018 -0.00014 0.049974" rpy="0 0 0" />
<mass value="0.629769" />
<inertia ixx="0.00315" ixy="8.2904E-07" ixz="0.00015" iyy="0.00388" iyz="8.2299E-06" izz="0.004285" />
</inertial>
<visual>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<mesh filename="link0_meshlab.stl"/>
<!-- <mesh filename="link0.dae"/> -->
</geometry>
</visual>
<!-- <collision>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<mesh filename="link0.stl"/>
</geometry>
</collision> -->
</link>
重点:2024.5.15
collision
标签可以不进行注释,也可以正常显示可视化。
按键盘的0键,可以控制Group enable中的Geom groups中的Geom 0
Geom 0使能,打开凸包(碰撞检测)的可视化。
Geom 1使能,Visualization的可视化。
软件默认时使能Geom 0的,在urdf中没有找到不使能的方法。
并且可视化中的mesh好像不能用dae格式:使用dae文件,按0没办法切换,一致凸包显示。
在导入的基础上,将urdf保存成xml格式的文件。添加一些信息就可以用了。重点参考/Users/liuhaitao/Desktop/Franka_urdf/fr3_without_hand.xml
这个文件,以及里面的注释说明笔记
-
、
目前还没解决2024.4.22
- 讲.dae的文件转成.obj文件?正确、正常转换?
2、界面属性与XML标签
加载模型后,软件界面中显示的属性和XML文件中的标签都是一一对应的。
Physcis- Integrator
Physcis- Algorithmic Parameters-Timestep
Rendering- Model Elements-Convex Hull
虽然不是严格一一对应的,但是也基本都能找到,需要的时候去这里查询解释。
3、XML-Sensors
传感器,XML文件里面有关于sensor的描述。
后续在详细了解2024.4.28
robosuite
A Modular Simulation framework and Benchmark for Robot Learning。链接。
MuJoCo界面学习
-
在Run状态下,可以拖动Control中的各个actuator1-actuator8,机器人可以进行运动;
-
在Pause状态下,可以点击 Joint中各个关节,进行调整机器人位置;但是Run以后还是会回到Control中的状态。(并且有一定弹性)
-
在Pause状态下,也可以调整Control中的actuator,相当于设置一个目标状态,Run以后会达到这个设定的状态
注意:这个关节点击的范围在xml中可以设置,不过还受一些别的因素影响,综合考虑。
Rendering
中的Label
和Frame
可以显示标签或者坐标系,Frame中好像没有Joint,感觉Body就是Joint的意思
- 双击任何一个连杆Link(可以用于验证重力补偿:重力补偿一般可以补偿重力和摩擦力,不能补偿加速度,如果拖动后松开,有加速度的话,可能会有一定的运动,摩擦消耗以后才会稳定)
- Control+鼠标左键(施加一个力矩)
- Control+鼠标右键(施加一个力)
mujoco的python代码学习
model = mujoco.MjModel.from_xml_path('xxx/xxx.xml')
data = mujoco.MjData(model)
<!-- 给定一组角度 -->
joint_angles = [0, 0, 0, 0, 0, 0, 0]
data.qpos[:len(joint_angles)] = joint_angles
<!-- 正运动学 -->
mujoco.mj_fwdPosition(model, data)
<!-- 获取joint7 -->
joint7 = "joint7"
joint7_id = mujoco.mj_name2id(model, mujoco.mjtObj.mjOBJ_JOINT, joint7)
<!-- 但是没有办法直接获取关节的位姿,需要得到他的父级连杆,间接表示 -->
body_id = model.jnt_bodyid[joint7_id]
<!-- 提取末端执行器的位姿 -->
joint7_pos = data.xpos[body_id]
joint7_rot = data.xmat[body_id].reshape(3, 3)
jacp = np.zeros((3, 9))
jacr = np.zeros((3, 9))
mujoco.mj_jac(m, d, jacp, jacr, d.xpos[1], 1)
<!-- 还有别的类型的求解雅可比矩阵的函数,比如 mj_jacBody,mj_jacSite等-->
<!--下面两个感觉在可视化view中使用 -->
d.ctrl = [xxx, xxx, xxx, ...]
mujoco.mj_step(model, data)
1、基本操作
1.x Mujoco中的object(mjtObj)的id问题(2024.9.15)
for i in range(m.nbody):
print(f"Object Name:{mujoco.mj_id2name(m, mujoco.mjtObj.mjOBJ_BODY, i)}, ID:{i}")
for i in range(m.nsite):
print(f"Object Name:{mujoco.mj_id2name(m, mujoco.mjtObj.mjOBJ_SITE, i)}, ID:{i}")
for i in range(m.njnt):
print(f"Object Name:{mujoco.mj_id2name(m, mujoco.mjtObj.mjOBJ_JOINT, i)}, ID:{i}")
通过上面三个打印函数,不同类型的object的id都是从0开始。
# body的id
Object Name:world, ID:0
Object Name:base, ID:1
Object Name:fr3_link1, ID:2
Object Name:fr3_link2, ID:3
Object Name:fr3_link3, ID:4
Object Name:fr3_link4, ID:5
Object Name:fr3_link5, ID:6
Object Name:fr3_link6, ID:7
Object Name:fr3_link7, ID:8
Object Name:fr3_leftfinger, ID:9
Object Name:fr3_rightfinger, ID:10
# site的id
Object Name:Flange_site, ID:0
# 关节的id
Object Name:base_planar_joint, ID:0
Object Name:fr3_joint1, ID:1
Object Name:fr3_joint2, ID:2
Object Name:fr3_joint3, ID:3
Object Name:fr3_joint4, ID:4
Object Name:fr3_joint5, ID:5
Object Name:fr3_joint6, ID:6
Object Name:fr3_joint7, ID:7
Object Name:fr3_finger_joint1, ID:8
Object Name:fr3_finger_joint2, ID:9
2、q、qd、qdd的赋值
3、正运动学
3、mujoco中的free类型关节
在mujoco中,free类型的关节,位置输入顺序是wxyz:
joint_angles = [trans[0], trans[1], trans[2], quat.w, quat.x, quat.y, quat.z,...]
mujoco_menagerie学习
下载在了Mac上的/Users/liuhaitao/Desktop/mujoco_menagerie
中
由Google DeepMind精心收集的高质量模型。
其实就是MuJoCo说明文档的Model Gallery。
mujoco_mpc学习
一些Tips
在mujoco中没有直接可以利用的逆运动学公式。但是可以参考:
mujoco inverse kinematic直接搜索,网上有很多资料
或者考虑pinocchio的迭代方法
如果直接运行,可以进行调试,但是利用mjpython xxx.py
的方式运行,好像不能进行调试
print输出方法