视频来自youtube
拖拽式 进行 模型导入
角度 度还是弧度制
mujoco中默认是度 但是你也可以通过相应的标签改成弧度
gravity
重心
在MuJoCo中,diaginertia
是一个属性,用于描述物体的对角惯性张量。具体来说:
-
对角惯性张量(Diagonal Inertia Tensor):对角惯性张量是一个3x3的对角矩阵,表示了物体绕它的主轴旋转时的惯性特性。这个矩阵通常由三个主对角元素组成:( [I_{xx}, I_{yy}, I_{zz}] ),其中 ( I_{xx}, I_{yy}, I_{zz} ) 是关于物体质心的惯性矩。
-
MuJoCo 中的
diaginertia
属性:在MuJoCo的物体模型中,每个物体都有一个diaginertia
属性,用于指定这个物体的对角惯性张量。通过设置这些值,可以精确地定义物体绕其三个主轴的旋转惯性。
在MuJoCo的XML模型文件中,你可以定义物体的 diaginertia
属性,例如:
<body name="box" pos="0 0 1">
<geom type="box" size="0.2 0.2 0.2" rgba="1 0 0 1"/>
<inertia diaginertia="0.1 0.1 0.1"/>
</body>
上面的例子中,diaginertia
被设置为 [0.1, 0.1, 0.1]
,表示这个名为 “box” 的物体具有对角惯性张量的对角元素为 0.1,即 ( I_{xx} = I_{yy} = I_{zz} = 0.1 )。这决定了物体在仿真中的旋转行为和响应。
总结来说,diaginertia
属性允许用户在MuJoCo中精确地控制物体的惯性特性,以便更准确地模拟和仿真物体的运动行为。
上面这些主要是教你如何查看xml文档,并针对相关参数进行修改
第二讲
讲他的上课用的工程文件
在MuJoCo中,cam.azimuth
是相机对象的一个属性,用于控制相机的方位角(Azimuth)。具体来说:
-
方位角(Azimuth):在三维空间中,方位角是指观察点(或相机位置)与某个参考方向(通常是正前方)之间的水平角度。在MuJoCo中,方位角通常以弧度(radians)表示。
-
MuJoCo 中的
cam.azimuth
:在MuJoCo的模拟环境中,你可以通过设置cam.azimuth
来调整仿真场景中相机的水平方向角度。这个属性通常用于改变相机的观察方向,从而影响视角中物体的位置和旋转显示。
例如,在MuJoCo XML 模型文件中,你可以设置相机的 azimuth
属性来定义其方位角,如下所示:
<visual>
<camera name="default" mode="trackcom" pos="2.0 2.0 2.0" xyaxes="1 0 0 0 1 0" camdist="3.0" fovy="45" aspect="1.33" />
<view width="800" height="600" camtype="fixed" viewangle="60" camtrack="default" azimuth="0.5"/>
</visual>
在上面的例子中,azimuth="0.5"
表示相机的方位角为 0.5 弧度,大约是 28.65 度((0.5 \times 180 / \pi))。这将影响相机的观察方向,从而改变视角中物体的呈现位置和方向。
总结来说,cam.azimuth
是MuJoCo中用于控制相机方位角的属性,允许用户通过调整这个值来改变仿真环境中的观察角度和视角。
调整相机 观察角度
你改变的时候能够实时看到变化
他这里打印出来了相机视角的信息
在代码中更改重力
print model 输出信息文件
执行simulate 并将模型导入 会给你提供一个详细的信息文件
会生成一个文件 在bin文件夹中, MJMODEL.TXT
里面包
含了各种信息,其中有nq 为7
代码中修改位置和速度
除了在xml中更改初始化的相应参数,也能在代码中更改
添加世界坐标系frame
drag force
阻力(Drag force)通常描述了物体在流体中运动时受到的阻碍力。其公式通常根据流体力学和物体运动状态的不同而有所变化,常见的情况包括:
-
空气阻力(空气动力学):
对于在空气中运动的物体,特别是低速情况下,阻力可以近似为:
[ F_d = \frac{1}{2} \rho v^2 C_d A ]
其中:- ( F_d ) 是阻力;
- ( \rho ) 是空气密度;
- ( v ) 是物体相对流体(空气)的速度;
- ( A ) 是物体所受阻力的截面积(通常是物体的横截面积);
- ( C_d ) 是阻力系数,取决于物体的形状和表面特性。
-
其他情况:
- 在液体中运动时,阻力的公式可能有所不同,但仍然通常包含 ( v^2 ) 的项。
这些公式通常用于描述各种物体(如飞机、汽车、船舶)在流体中的运动过程中所受到的阻力,是流体力学中的基础概念之一。
添加了阻力后球滚动时会停下来
相机视角跟随
在循环中,场景更新前,添加相机视角跟随 x坐标
第三讲
Controlling a one-link pendulum
joint 关节铰链
铰链关节 旋转 ,此时重心在中间,也能解释为什么没能发生旋转
这里也说明了,关节移动参考的时物体的坐标系,而不是世界坐标系
actuator
actuator 指向 motor
在MuJoCo(Multi-Joint dynamics with Contact)中,actuator中的motor通常是指控制关节运动的部件,它通常可以产生扭矩(torque)。在MuJoCo仿真中,关节的运动可以通过施加扭矩来实现,这些扭矩由motor控制。
具体来说:
-
Motor(电机):在MuJoCo中,电机指的是一种控制关节运动的装置,可以产生扭矩。MuJoCo的电机可以设置不同的控制方式(如速度控制、扭矩控制等),来模拟不同类型的关节动作。
-
Torque(扭矩):扭矩是指力矩的一种,它描述了施加在物体上的旋转力。在MuJoCo中,电机(motor)可以通过施加扭矩来控制仿真模型中的关节运动。
因此,可以说在MuJoCo中,motor通常是用来控制并产生扭矩的装置,用于模拟关节的动力输出和控制。
在MuJoCo中,motor中的gear(齿轮)参数用于调节电机(motor)输出扭矩的转换比。具体来说,这个参数决定了电机输出扭矩与关节实际扭矩之间的比例关系。
作用包括但不限于以下几点:
-
扭矩放大或减小:通过调节gear参数,可以改变电机输出的扭矩。例如,如果设置了一个大于1的gear值,电机输出的扭矩会相应增加;反之,如果设置小于1的gear值,电机输出的扭矩则会减少。
-
力矩控制:通过调节gear参数,可以更精确地控制关节的力矩输出。这在仿真中很重要,因为它影响到模型的动力学行为,如加速度、速度和位置的响应。
-
动力学仿真的精确性:gear参数的调节可以帮助更准确地模拟真实世界中的物理现象,比如机械系统中的传动效应。这在机器人学、控制理论和运动学研究中尤为重要。
因此,MuJoCo中的motor中的gear参数允许用户在仿真中调节电机输出扭矩的转换比,从而影响关节的动力学特性和模型行为。
2 position
是的,position(位置)和kp参数与PID控制有密切的关系,尽管在MuJoCo中并没有直接称之为PID控制器,但其控制策略可以类比于PID控制。
在PID控制(比例-积分-微分控制)中:
-
比例项(P项):对应于MuJoCo中的kp参数。P项反映了控制器对当前误差的直接响应程度。在MuJoCo中,增大kp相当于增强了P项的影响,使得控制器更加敏感于当前位置与目标位置之间的差异,从而加速关节的运动。
-
位置设定(Setpoint):对应于MuJoCo中的position参数,即控制器的目标位置。
-
积分项(I项)和微分项(D项):在MuJoCo的简化控制模型中,通常将I项和D项忽略,因此MuJoCo的控制器更接近于简单的比例控制(P控制)。这也意味着MuJoCo中的控制器不考虑过去的误差历史(I项)和误差变化率(D项),而是直接基于当前位置和目标位置的差异来生成控制命令。
综上所述,虽然MuJoCo中的控制参数并没有直接使用PID术语,但其控制逻辑可以理解为一种简化的比例控制,其中position参数指定了目标位置,而kp参数则控制了控制器对位置误差的响应强度,类似于PID控制器中的P项。
3 velocity
进行速度调整,会均匀的旋转
在控制理论中,KV和KP通常指的是控制系统中的两个重要参数:
-
Kp(Proportional Gain):
- Kp 是比例增益,用来调节控制系统中比例控制器的强度。比例控制器根据当前误差(偏差)的大小来调整控制输出的大小。具体来说,Kp决定了当系统当前偏离期望值多少时,输出控制器将产生多少响应。较大的Kp值会导致更快的响应速度,但可能会增加系统的震荡或超调。
-
Kv(Velocity Gain):
- Kv 是速度增益,用于控制系统中的速度反馈环节。在速度控制中,Kv决定了输出控制信号如何响应于速度误差的变化。速度控制系统中,通常根据速度误差的大小和变化率来调整输出信号的幅度和方向。较大的Kv值通常意味着更快的速度响应,但也可能引入系统噪声或不稳定性。
这两个参数在控制系统设计中是非常重要的,通过合适的调节Kp和Kv可以优化系统的响应速度、稳定性和精度,以满足设计要求和性能指标。
代码中修改qpos
在MuJoCo中,对于模拟物体(如杆子)的控制,通过设定关节的位置(position)和速度(velocity)可以影响物体的运动状态。在你提到的情况中,设置 d->qpos[0] = 1.57
是在设定关节的初始位置为1.57弧度,这可能对杆子竖直向上的运动起到了关键作用。
具体来说:
-
关节位置(qpos)设定为1.57弧度:这意味着杆子的初始位置是在一个倾斜的状态,因为1.57弧度大约是90度。MuJoCo会根据这个初始位置来开始仿真,将杆子放置在一个非竖直的初始姿态。
-
设定位置(position)和速度(velocity)参数:如果你设定了正确的目标位置(position)和速度(velocity),MuJoCo的控制器会努力将关节移动到这个目标位置,并且根据设定的速度控制关节的运动速度。
-
控制器的影响:MuJoCo的控制器逻辑会根据设置的目标位置和速度,尝试调整关节的控制命令,使得关节逐渐移动到目标位置。如果初始位置设定为一个非竖直状态(如1.57弧度),控制器会努力调整关节使得杆子直立。
综上所述,设定 d->qpos[0] = 1.57
可能导致杆子初始倾斜,而后续设定的位置和速度参数则使得MuJoCo的控制器努力将杆子移动到竖直的位置。这种设定方式可以用来模拟物体从非竖直姿态到竖直姿态的运动过程。
如果将kp kv都设置为0,那么杆子就会倒下
代码中 mj control
在主函数的循环开始前调用
外部声明并实现你的控制函数
注意const
由上面的图中可以看到三个ctrl应该是三个actuator
第一个就是torque 相当于0
根据这些信息进行编程
pd control
d->ctrl[0] = -10 * (d->qpos[0] - 0) - 1 * d->qvel[0];
PD控制器是一种常见的闭环控制器,用于控制系统中实现目标跟踪或稳定性控制。它基于当前误差(偏差)的大小和变化率来调整输出控制信号,具体执行以下操作:
-
Proportional(比例)作用:
- 比例作用是根据当前的偏差大小来生成控制输出的一部分。偏差是实际值与期望值(设定点)之间的差异。比例增益(Kp)决定了这种作用的强度。如果偏差较大,比例作用会生成较大的输出信号,以加快系统响应,使偏差更快地减小。
-
Derivative(导数)作用:
- 导数作用考虑偏差的变化率,即偏差随时间的变化速度。导数增益(Kd)乘以偏差的导数(偏差变化率)来生成控制输出的另一部分。这种作用有助于抑制系统的震荡和超调,因为它会预测偏差的未来趋势并相应地调整控制输出。
因此,PD控制器的控制输出(u)可以表示为:
[ u(t) = Kp \cdot e(t) + Kd \cdot \frac{de(t)}{dt} ]
其中:
- ( u(t) ) 是控制器的输出信号。
- ( e(t) ) 是当前的偏差(假设设定点为零)。
- ( \frac{de(t)}{dt} ) 是偏差 ( e(t) ) 的导数,即偏差的变化率。
- ( Kp ) 是比例增益。
- ( Kd ) 是导数增益。
PD控制器通过调节比例和导数增益,使得系统能够快速响应设定点的变化,并且在接近设定点时能够稳定。
这个表达式看起来是一个简单的PD控制器的形式,用于控制某个系统的位置和速度。
让我们逐步解释这个表达式:
-
目标设定点和当前状态:
- 假设你希望系统的某个位置(在这里是 ( d->qpos[0] ))接近于0。通常,这个位置可以是机器人关节的位置或者其他位置相关的变量。
-
控制器的比例作用(P作用):
- ( -10 \times (d->qpos[0] - 0) ):这部分表示比例作用。 ( d->qpos[0] ) 是当前位置,而 0 是设定点(目标位置)。 ( d->qpos[0] - 0 ) 就是当前位置与目标位置之间的偏差。乘以 -10 表示比例增益,这决定了当偏差增大时,控制器输出的增大速率。负号表示控制方向,即控制器试图通过减小当前位置 ( d->qpos[0] ) 来接近设定点。
-
控制器的导数作用(D作用):
- ( -1 \times d->qvel[0] ):这部分是导数作用。 ( d->qvel[0] ) 是当前速度,乘以 -1 表示导数增益。这部分控制器输出与速度的负反馈相关。如果系统速度快速接近设定速度,这一项会减小控制输出,以减缓速度变化,从而更平滑地接近设定点。
综合起来,这个控制器的目标是使系统的位置 ( d->qpos[0] ) 快速接近设定点(0),并且在接近时控制速度 ( d->qvel[0] ) 以防止过冲或震荡。
总结一下,这种形式的控制器在实际中常用于机器人控制和其他自动控制系统中,通过比例和导数项来调节输出,以实现快速而稳定的位置控制。
理论上,PD控制器中的比例和导数项可以是正数或负数,具体取决于系统的特性和所需的控制效果。让我们重新审视你提到的控制器表达式:
[ d->ctrl[0] = -10 \cdot (d->qpos[0] - 0) - 1 \cdot d->qvel[0] ]
这个表达式中使用了负号来反映控制方向和控制策略:
-
比例作用:
- ( -10 \cdot (d->qpos[0] - 0) ):负号表示控制方向。如果 ( d->qpos[0] ) (当前位置)大于设定点 0,则 ( d->ctrl[0] ) 将为负数,反之亦然。这种设置可以确保控制器朝向减小偏差的方向。
-
导数作用:
- ( -1 \cdot d->qvel[0] ):同样,负号表示导数增益的反向,这会使控制器输出与速度 ( d->qvel[0] ) 的变化方向相反。这有助于控制系统的速度,以防止速度变化过快或者过冲。
虽然在一些特殊情况下,也可以使用正的比例和导数增益,但通常情况下负号是常见的选择,因为它能够直接控制系统朝向减小偏差的方向。这种设置在实际应用中经常用于确保系统稳定地接近设定点,并且能够有效地抑制过冲或震荡现象。
因此,表达式中使用负号的原因主要是为了控制方向的一致性和控制效果的可预测性。
position servo,那么 d->ctrl[1] = 0.5
如果 d->ctrl[1] = 0.5
是用在一个位置伺服控制器中,通常表示一个简单的开环控制,其中 0.5
是一个常数值,可能代表一个特定的控制输出或者指令,而不是根据当前系统状态动态计算的。让我们来解释一下这种情况下可能发生的事情:
-
开环控制:
- 在开环控制中,控制器的输出是直接设置的一个固定值,而不依赖于系统当前的状态(例如位置或速度)。
d->ctrl[1] = 0.5
表示将控制器的输出设置为0.5
。这个值可能是一个标准化的控制输入,对应着系统中的某种行为或动作。
-
用途和效果:
- 如果系统中的
d->ctrl[1]
是一个执行器的输入(比如扭矩或者力),那么设置为0.5
可能会导致该执行器施加一个预定的力或者扭矩,不考虑系统当前的位置或速度。 - 这种情况下,控制器不是基于反馈信息调整输出,而是直接提供一个预定义的指令。
- 如果系统中的
-
适用情况:
- 开环控制通常在某些特定的情况下使用,例如进行初步的测试、模拟预定行为或者在实际控制中已经通过其他手段进行反馈调整。
- 然而,在大多数情况下,尤其是对于需要精确控制位置或速度的系统,开环控制往往不足以提供必要的精度和稳定性。
总之,d->ctrl[1] = 0.5
表示在给定的控制接口中,将其控制输出设置为 0.5
,这可能是为了特定的测试或者操作需求而设定的一个静态值。
position servo,那么 d->ctrl[2] = 0.2
按一定速度 逆时针转动
sensor noise
利用flag开启sensornoise
然后再sensor中为joint pin配置
要把kv设置为0,不然会有干扰
pos sensor 和vel sensor
由于是用的是有噪声的 所以会抖动
sensordata
和 qpos
在MuJoCo(Multi-Joint dynamics with Contact)物理引擎中,sensordata
和 qpos
是描述仿真系统状态的两种不同变量。它们在功能和用途上有所不同:
-
qpos (关节位置):
qpos
是MuJoCo中的一个变量,表示仿真系统中所有关节的位置。每个关节的位置都可以通过qpos
数组中的一个元素来表示。这些关节位置通常是仿真系统的一部分,例如机器人臂的各个关节的角度。
-
sensordata (传感器数据):
sensordata
则是从传感器模块获取的数据。MuJoCo中的传感器可以用来模拟各种不同的传感器,例如位置传感器、加速度传感器等。传感器数据 (sensordata
) 提供了对仿真系统状态的实时监测和反馈。通过这些传感器,可以获取仿真系统中关键点的信息,如末端执行器的位置、速度,或者环境中某些特定点的状态。
区别总结:
qpos
是仿真系统中关节位置的集合,提供了系统内部各个关节当前的位置状态。sensordata
则是从仿真环境中获取的实时数据,通常反映了系统中特定点或传感器所测量到的信息,如位置、速度等。
在MuJoCo中,通过这两种类型的数据,可以对仿真系统进行状态监测、控制和分析,从而实现复杂的运动控制和仿真环境的模拟。
代码中如何调整 kp kv这类参数
并不是希望一直在xml文件中调参数或者关闭或打开某些驱动控制
可以在文档中查看
一个actuator会有10个数字,所以3个的话会有30个数字
他把1 actuator的数字打印出来了,可以看到第一个为10,正好对应xml中设置的10
所以代码中把这个数字设置为0,就可以取消应用了
但是别忘了还有一个数字也要改,一个是gain参数 一个是bias参数
通过代码完成调整
也可以把她放在一个外置函数里
kv的话有一点差别
在于参数偏差位置
pd torque控制
他是类似于开关式的
他后面把 1 和2 联合了,然后给到了一个位置
nq和qpos
MuJoCo 中的 qpos
大小是根据模型结构和定义的关节类型来确定的,而不是自适应的。每个关节的 qpos
包含的元素数目是固定的,取决于关节的类型和参数。
具体来说:
- 对于旋转关节(Revolute joint):
qpos
只包含一个元素,表示关节的角度。 - 对于自由关节(Free joint):
qpos
包含位置(3个元素)和四元数(4个元素),总共7个元素。 - 对于平移关节(Prismatic joint):
qpos
只包含一个元素,表示关节的位移。 - 对于球形关节(Ball joint):
qpos
包含四元数(4个元素)。
因此,MuJoCo中的 qpos
不是自适应的,而是根据关节类型和模型定义预先确定好的。这种设计可以有效地管理和模拟复杂的机械系统,确保在仿真中准确地跟踪和模拟每个关节的状态。
如果你的模型有两个关节,一个是自由关节(free joint),一个是旋转关节(revolute joint),那么在MuJoCo中,qpos
向量的定义如下:
-
自由关节(free joint):
- 自由关节通常由一个3D位置和一个四元数来描述姿态。
qpos
的定义会包括这个自由关节的位置和四元数。通常是一个长度为7的向量,分别表示位置的三个坐标(x, y, z)和四元数的四个参数(q0, q1, q2, q3)。
-
旋转关节(revolute joint):
- 旋转关节由一个角度来描述其状态。
qpos
的定义只会包含这个旋转关节的角度。通常是一个长度为1的向量,表示关节的角度。
因此,如果你的模型有一个自由关节和一个旋转关节,那么 qpos
可能会是一个长度为8的向量(7个元素来描述自由关节的位置和四元数,加上一个元素来描述旋转关节的角度)。
这种方式保证了每个关节的状态可以通过 qpos
向量唯一地描述和控制,使得MuJoCo能够精确地模拟复杂的机械系统。