Mujoco基本情况介绍

【基建笔记】mujoco和mujoco_py安装的坑 介绍mujoco和mujoco_py过程和遇到问题解决方法 -1. 吐槽前言: 不少技术文章还是摘抄太多, 大同小异, 千篇一律, 知其然不知其所以然, 所以常常一错百错. 相同问题的解决方案虽都是相似的, 但很多博文都没有讲清楚重点. 而且过程博主自己都未必亲自验证过, 缺乏责任意识. 不少博文给出的方法, 看是大而全面, 有理有据. 但不够细致入微,不能直接利用. 严重影响学习效率. 0. 环境版本说明: ubuntu-16.04 gym-0.15.4 tensorflow 1.12.0 CUDA 阅读详情
AI摘要

Mujoco是一款强大的跨平台机器人建模软件,以其小巧的程序包和高效的物理模拟著称。通过XML或其专有格式进行建模,支持STL导入,能创建复杂的机器人模型。Mujoco提供了交互式的模拟控制,允许通过编写C接口程序实现精确操控。此外,它支持视觉场景的实时更新,可以轻松地与其他控制系统集成,实现数据管道的实时交互。模型示例展示了一个使用STL渲染的双足机器人,展示了Mujoco在建模和仿真方面的灵活性。

基本情况

Mujoco是一个跨平台的机器人建模软件。
官方的介绍是这样的:
MuJoCo is a physics engine that aims to facilitate research and development in robotics, biomechanics, graphics and animation, and other areas where fast and accurate simulation is needed.

不同于webots的1G多的大小,Mujoco windows的程序包只有5.7M,让我差点以为眼花了。

下载地址:https://mujoco.org/


界面

在这里插入图片描述


运行方式

模型查看

windows/linux直接双击/bin目录下的Simulate打开程序
然后将模型的xml文件拖到界面里面,就可以看到模型了

控制

Mujoco需要通过编写程序来实现控制。
在没有提供控制器的情况下,看起来Mujoco会给你的模型给一个默认的控制程序

控制程序的开发是基于C接口的,比如,一个简单的控制程序例子:



#include<stdbool.h> //for bool
//#include<unistd.h> //for usleep
#include<math.h>

#include "mujoco.h"
#include "glfw3.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"


char filename[] = "../myproject/projectile/ball.xml";

// MuJoCo data structures
mjModel* m = NULL;                  // MuJoCo model
mjData* d = NULL;                   // MuJoCo data
mjvCamera cam;                      // abstract camera
mjvOption opt;                      // visualization options
mjvScene scn;                       // abstract scene
mjrContext con;                     // custom GPU context

// mouse interaction
bool button_left = false;
bool button_middle = false;
bool button_right =  false;
double lastx = 0;
double lasty = 0;

// holders of one step history of time and position to calculate dertivatives
mjtNum position_history = 0;
mjtNum previous_time = 0;

// controller related variables
float_t ctrl_update_freq = 100;
mjtNum last_update = 0.0;
mjtNum ctrl;

// keyboard callback
void keyboard(GLFWwindow* window, int key, int scancode, int act, int mods)
{
   
   
    // backspace: reset simulation
    if( act==GLFW_PRESS && key==GLFW_KEY_BACKSPACE )
    {
   
   
        mj_resetData(m, d);
        mj_forward(m, d);
    }
}

// mouse button callback
void mouse_button(GLFWwindow* window, int button, int act, int mods)
{
   
   
    // update button state
    button_left =   (glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT)==GLFW_PRESS);
    button_middle = (glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_MIDDLE)==GLFW_PRESS);
    button_right =  (glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_RIGHT)==GLFW_PRESS);

    // update mouse position
    glfwGetCursorPos(window, &lastx, &lasty);
}


// mouse move callback
void mouse_move(GLFWwindow* window, double xpos, double ypos)
{
   
   
    // no buttons down: nothing to do
    if( !button_left && !button_middle && !button_right )
        return;

    // compute mouse displacement, save
    double dx = xpos - lastx;
    double dy = ypos - lasty;
    lastx = xpos;
    lasty = ypos;

    // get current window size
    int width, height;
    glfwGetWindowSize(window, &width, &height);

    // get shift key state
    bool mod_shift = (glfwGetKey(window, GLFW_KEY_LEFT_SHIFT)==GLFW_PRESS ||
                      glfwGetKey(window, GLFW_KEY_RIGHT_SHIFT)==GLFW_PRESS);

    // determine action based on mouse button
    mjtMouse action;
    if( button_right )
        action = mod_shift ? mjMOUSE_MOVE_H : mjMOUSE_MOVE_V;
    else if( button_left )
        action = mod_shift ? mjMOUSE_ROTATE_H : mjMOUSE_ROTATE_V;
    else
        action = mjMOUSE_ZOOM;

    // move camera
    mjv_moveCamera(m, action, dx/height, dy/height, &scn, &cam);
}


// scroll callback
void scroll(GLFWwindow* window, double xoffset, double yoffset)
{
   
   
    // emulate vertical mouse motion = 5% of window height
    mjv_moveCamera(m, mjMOUSE_ZOOM, 0, -0.05*yoffset, &scn, &cam);
}


// main function
int main(int argc, const char** argv)
{
   
   

    // activate software
    mj_activate("mjkey.txt");


    // load and compile model
    char error[1000] = "Could not load binary model";

    // check command-line arguments
    if( argc<2 )
        m = mj_loadXML(filename, 0, error, 1000);

    else
        if( strlen(argv[1])>4 && !strcmp(argv[1]+strlen(argv[1])-4, ".mjb") )
            m = mj_loadModel(argv[1], 0);
        else
            m = mj_loadXML(argv[1], 0, error, 1000);
    if( !m )
        mju_error_s("Load model error: %s", error);

    // make data
    d = mj_makeData(m);


    // init GLFW
    if( !glfwInit() )
        mju_error("Could not initialize GLFW");

    // create window, make OpenGL context current, request v-sync
    GLFWwindow* window = glfwCreateWindow(1244, 700, "Demo", NULL, NULL);
    glfwMakeContextCurrent(window);
    glfwSwapInterval(1);

    // initialize visualization data structures
    mjv_defaultCamera(&cam);
    mjv_defaultOption(&opt);
    mjv_defaultScene(&scn);
    mjr_defaultContext(&con);
    mjv_makeScene(m, &scn, 2000);                // space for 2000 objects
    mjr_makeContext(m, &con, mjFONTSCALE_150);   // model-specific context

    // install GLFW mouse and keyboard callbacks
    glfwSetKeyCallback(window, keyboard);
    glfwSetCursorPosCallback(window, mouse_move);
    glfwSetMouseButtonCallback(window, mouse_button);
    glfwSetScrollCallback(window, scroll);

    double arr_view[] = {
   
   90,-45, 4, 0.000000, 0.000000, 0.000000};
    cam.azimuth = arr_view[0];
    cam.elevation = arr_view[1];
    cam.distance = arr_view[2];
    cam.lookat[0] = arr_view[3];
    cam.lookat[1] = arr_view[4];
    cam.lookat[2] = arr_view[5];

    //m->opt.gravity[2]=-1;
    //qpos is dim nqx1 = 7x1; 3 translations + 4 quaternions
    d->qpos[2]=0.1;
    d->qvel[2]=5;
    d->qvel[0]=2;
    // use the first while condition if you want to simulate for a period.
    while( !glfwWindowShouldClose(window))
    {
   
   
        // advance interactive simulation for 1/60 sec
        //  Assuming MuJoCo can simulate faster than real-time, which it usually can,
        //  this loop will finish on time for the next frame to be rendered at 60 fps.
        //  Otherwise add a cpu timer and exit this loop when it is time to render.
        mjtNum simstart = d->time;
        while( d->time - simstart < 1.0/60.0 )
        {
   
   
            mj_step(m, d);

            //drag force = -c*v^2*unit_vector(v); v = sqrt(vx^2+vy^2+vz^2)
            // vector (v) = vx i + vy j + vz k
            //unit_vector(v) = vector(v)/v
            //fx = -c*v*vx;
            //fy = -c*v*vy;
            //fz = -c*v*vz;
            double vx, vy, vz;
            vx = d->qvel[0]; vy = d->qvel[1]; vz = d->qvel[2];
            double v;
            v = sqrt(vx*vx+vy*vy+vz*vz);
            double fx, fy, fz;
            double c = 1;
            fx = -c*v*vx;
            fy = -c*v*vy;
            fz = -c*v*vz;
            d->qfrc_applied[0]=fx;
            d->qfrc_applied[1]=fy;
            d->qfrc_applied[2]=fz;
        }

       // get framebuffer viewport
        mjrRect viewport = {
   
   0, 0, 0, 0};
        glfwGetFramebufferSize
MuJoCo 机械臂 PID 控制器输出力矩控制到达指定位置(附代码) 又有评论区提到有想看Mujoco里面如何获取力矩信息,实际上是很简单的,就是data.ctrl这个对象,今天结合这个内容,通过PID控制器输出力矩对位置进行闭环的实验,力矩控制机械臂会比较丝滑,尤其是动力学方面。仿真循环中计算位置误差,pid计算力矩,记录数据,当误差小于一定值,画出力矩、位置变化。初始化PID参数及指定位置和声明位置和力矩输出的记录。有点超调,随便调一下PID参数,P项减小点。首先写一个最基本的PID的控制类。距离较短的情况,I项增大。可以看到没有出现过冲。 阅读详情

相关推荐

Mujoco 基本教程

Mujoco 建模教程 + Mujoco_py构建环境

upr_rom的博客 1万+

win10安装mujoco150 , mujoco_py1.50.1.68 , gym

win10安装mujoco150,mujoco-py,gym 本文介绍的是在Win10系统下安装gym,mujoco,mujoco-py的具体流程。 环境:windows10, anaconda3, python3.7.6 安装顺序:Anaconda3, Mujoco, Mujoco-py, Gym。安装版本如下: Mujoco Mujoco-py Gym mjpro150 muj...

xiyuChen的博客 1万+

Win10安装Meta-world、MuJoCo 及 mujoco-py

如果能在Linux系统上部署,尽量不要在windows上面,因为必须要下载Visual Studio,版本之间的对应也有问题。虽然目前可以成功运行环境。目前 MuJoCo 主要适用于 Linux 系统或 MacOS 系统,根据其它博客可知,Windows 系统支持最完美的版本是 mjpro150 和 mujoco-py 1.50.1.0。2021年10月,DeepMind 宣布收购 MuJoCo 物理模拟器,并承诺将MuJoCo 作为一个免费的、开源的、社区驱动的项目进行开发和维护。

z_l_m_的博客 4201

win10安装mujoco200,mujoco_py2.0.2.9,gym

win10安装mujoco200,mujoco-py2.0.2.9,gym 最近在学习强化学习,要用到这几个组件和引擎,尝试了很多方法才成功,于是写了两篇win10系统下安装mujoco和gym的总结。本文介绍的是在Win10系统下安装gym,mujoco200,mujoco-py2.0.2.9的具体流程。 另外一篇是安装mujoco150和mujoco_py1.50.1.68版本,流程大体相同,...

xiyuChen的博客 9150

mujoco_py中文文档

MuJoCo 是一个物理引擎,用于使用contacts进行详细、高效的刚体模拟。 允许使用 Python 3 中的 MuJoCo。该库已更新为与 2021 年 10 月 18 日发布的 MuJoCo 2.1 版兼容。目前支持以下平台:以下平台已弃用且不受支持:If you want to specify a nonstandard location for the package, use the env variable .要将 包含在您自己的包中,请将其添加到您的要求中,如下所示: 要以交互方式使用

shouchen1的博客 6626

MuJoCo 学习笔记

MuJoCo 是一个通用的物理引擎,旨在促进机器人、生物力学、图形与动画等领域的研究和开发(需要快速准确模拟铰接体与环境相互作用的场景)。MuJoCo一词取自多关节接触动力学(Multi-JoContact)。最早由 Roboti LLC 开发2021年10月被 DeepMind 收购,推出 Version 2.1.02022年3月推出 Version 2.1.2,添加 Python 接口,并于2022年5月开源文本编辑器读取MJCF/URDF文件:适合需要手动编辑模型文件的场景。

coco的专栏 2215

MuJoCo的机器人建模

微信公众号:robot_learning123 分享机器人与人工智能相关的技术与最新进展,欢迎关注与交流。 原文链接:MuJoCo的机器人建模 MuJoCo是目前机器人强化学习中最流行的仿真器,官方论坛提供了一些常见机器人的模型,但是如果其中没有自己需要的机器人模型,就只能自己建一个了。本文主要记录一下如何根据ROS的URDF模型修改并建立一个MuJoCo的机器人模型。由于官方没有一个详细的过...

fei_6的博客 3779

MuJoCo 入门教程(一)

在 MuJoCo 仿真中输入自定义数字有三种方法。首先,可在 XML 中定义全局数字字段。它们有一个名称和一个实数值数组。其次,可以通过特定元素的自定义数组来扩展某些模型元素的定义。具体方法是在 XML 元素大小中设置 nuser_XXX 属性。第三,数组 mjData.userdata 不用于任何 MuJoCo 计算。用户可以在这里存储自定义计算的结果;请记住,所有随时间变化的内容都应存储在 mjData 中,而不是 mjModel 中。自定义文本字段可以保存在模型中。

机器人控制与仿真应用 1万+

MuJoCo 入门教程(二)

本章介绍 MuJoCo 的数学和算法基础。对于熟悉广义或关节坐标建模和仿真的读者来说,整体框架是相当标准的。因此,我们将对这些材料进行简要总结。本章的大部分篇幅用于介绍我们如何处理接触和其他约束条件。这种方法是基于我们最近的研究,也是 MuJoCo 所独有的,因此我们花时间对其进行了详细的激励和解释。更多信息可参见下面的论文,尽管本章中的一些技术思想是新的,在其他地方还没有描述过。

机器人控制与仿真应用 3712

MuJoCo 入门教程(四)建模

在 MJCF 中,一个体可以包含多个关节,因此无需引入虚拟体来创建复合关节。相反,只需在同一主体中定义构成所需复合关节的所有原始关节即可。例如,可以使用两个滑块和一个铰链来模拟在平面内运动的肢体。其他 MJCF 元素可以在嵌套的主体元素所创建的树中定义,特别是关节、几何体、场地、摄像机、灯光。当一个元素被定义在一个肢体内时,它就固定在该肢体的局部坐标系上,并始终随其移动。涉及多个机构或根本不涉及机构的元素,将在运动树之外的单独部分中定义。

机器人控制与仿真应用 4163

基于PLC的冲压件自动生产线电气系统设计【附数据】

考虑到生产线的高效运行和维护简便性,选择了三菱FX系列的可编程逻辑控制器(PLC)作为核心控制单元,该型号的PLC因其高可靠性和强大的功能集,在工业自动化领域有着广泛的应用。最后,在完成初步的软件开发后,进行了多轮次的模拟测试和现场调试,逐步修正了存在的问题,最终达到了预期的功能要求。例如,对于进料环节,选用了光电传感器以精确检测物料的位置;此外,为了适应不同尺寸的工件加工需求,还特别设计了一套可调节的夹具系统,不仅提高了生产线的灵活性,同时也降低了更换模具的成本。✅ 感恩科研路上每一位志同道合的伙伴!

lagougongzuoshi的博客 1292

Vivado 18.3安装全攻略:从下载到配置的完整指南

本文详细介绍了Vivado 18.3的安装全流程,从下载准备到配置优化,特别适合FPGA开发者。文章包含硬件要求、版本选择、组件配置等实用技巧,帮助用户避免常见安装问题,确保稳定运行。重点解析了License配置和系统优化设置,提升开发效率。

weixin_28331555的博客 567

新版MQL语言程序设计:用vscode编写编译调试mt4和mt5程序

使用VScode搭建MT4与MT5开发环境,实现编辑编译调试统一。

超哥量化的博客 6872

【Jlink & C#】通过C#实现Jlink RTT上位机的功能

某天看到安富莱家的自己开发的调试器可以实现输出中文调试信息到自己编写的Jlink RTT上位机上,觉得无比神奇,略好奇到底是如何做的,找了很久,发现其上位机的对应的实现好像也没有完全开源出来。后来经过很多搜索确认,知道了几个事实:那么有没有可能用C#来控制Jlink呢?答案是,有!!! 解决思路在于,C#调用JLinkARM.dll里面的函数 这里转载下我认为很有意义的发现结合以上的几个发现,加上我自己的测试,我把我对接JLinkARM.dll的C#接口分享出来,不保证都能用,我只是测试了几个常用的功能,R

一只爱做笔记的码农 9147

若依(RuoYi)框架从零到部署:Spring Boot+Vue权限系统完整配置指南

在Java企业级应用开发中,Spring Boot作为构建微服务和单体应用的基石,极大地简化了项目初始化和配置流程。其核心原理在于通过自动配置和起步依赖,快速整合数据访问、安全认证、缓存等常用模块,显著提升开发效率。这一技术价值在需要快速构建后台管理系统的场景中尤为突出,例如权限管理、用户角色分配等通用需求。若依(RuoYi)框架正是基于Spring Boot和Vue.js的优秀实践,它封装了RBAC权限模型、代码生成器等高频功能,提供了开箱即用的解决方案。本文聚焦于若依框架的【环境配置】与【项目部署】,通

weixin_33984032的博客 455

虚拟机Ubuntu连接USRP

笔记本通过网线连接USRP。

xiaozir的博客 2307

基于STM32的智能血氧、心率、体温、血压监测系统

摘要:本文设计了一款基于STM32F103C8T6的多功能健康监测系统,可实时检测血氧、心率、体温和血压四项生理参数。系统集成MAX30102、DS18B20等传感器模块,采用OLED显示和蓝牙无线传输技术,实现一键血压测量、阈值报警及手机APP数据管理功能。硬件设计包含传感器采集、电源管理、显示报警等模块;软件采用模块化架构,实现数据采集处理、蓝牙通讯等功能。测试表明系统测量准确可靠,为家庭健康监测提供了便携解决方案。未来可扩展更多监测参数和智能分析功能。

3254968421的博客 771

【100%通过率】华为OD机试真题 Java&Go 实现【查找单入口空闲区域】【2022.11 Q4 新题】

给定一个 m xn 的矩阵,由若干字符 和0构成,X表示该处已被占据,0"表示该处空闲,请找到最大的单入口空闲区域.解释:空闲区域是由连通的O组成的区域,位于边界的0可以构成入口,单入口空闲区域即有目只有一个位于边界的0作为入口的由连通的'O"组成的区域。 如果两个元素在水平或垂直方向相邻,则称它们是“连通”的。

MISAYAONE的博客 2万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

上一篇: Mujoco-一阶单摆建模与控制
下一篇: 使用mujoco来模拟cassie机器人
Feisy
博客等级 码龄19年 166粉丝 235原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值