参考资料:
在CoppeliaSim中,关节有三种不同的模式可以选择:
- Passive mode:在该模式下,用户可以直接通过设置关节角度(
sim.setJointPositon
orsim.setSphericalJointMatrix
)来控制关节位置。在这个过程中,CoppeliaSim不会考虑任何动力学特性。设置关节角度后,CoppeliaSim会直接显示结果,不需要考虑任何的中间过程(比如速度和力矩)。
-
Dependent mode:在该模式下,关节不能主动控制其位置。
-
Torque or force mode:在该模式下,关节依靠动力学模块实现仿真。与第一种模式不同,力矩/力模式下,CoppeliaSim需要考虑中间过程,即关节是在存在力矩和速度的情况下实现运动的,关节位置是通过力矩和速度的计算间接获得的。
前两种关节模式比较简单,这里不再讨论。本文主要研究如何在力矩/力模式下,控制机械臂的运行。
在力矩/力模式下,存在三种情况:
-
Motor disabled :在该情况下,关节是自由的,仅受到其自身约束。也就是说,我们无法通过设置力矩和速度来控制它(毕竟电机没有工作)。
-
Motor enabled && Control loop disabled :在该情况下,需要设置两个参数,分别为目标速度和最大力矩。关节在会在最大力矩下,尝试达到期望的目标速度。但是当关节达到目标速度后,关节力矩就不一定是最大力矩了。 当关节力矩很大时,目标速度会很快到达。
在该情况下,关节可以使用两种控制方式:
-
速度控制:设置好关节最大力矩,目标速度可在编程时调用
sim.setJointTargetVelocity
设置。 相当于在给定最大力矩的情况下,在每个控制周期内设置需要的关节速度,从而控制机械臂的运行。 -
力矩控制:编程时通过调用
sim.setJointTargetVelocity
和sim.setJointMaxForce
来控制关节的最大力矩和速度。需要注意,力矩的设置值必须为正。若要实现相反方向的力矩,只需要设置负的速度即可。注:新版本没有
sim.setJointForce
。
- Motor enabled && Control loop enabled :CoppeliaSim内置了两种控制算法,分别为PID控制和弹簧—阻尼控制,也可以通过
Joint callback functions
设计自己的控制算法。在这种情况下,我们可以很简单的实现位置控制,只需要调用sim.setJointTargetPosition
即可。 力矩和速度会根据控制算法自动计算。
-
PID控制:速度由PID算法计算,力矩为常值。
-
弹簧—阻尼控制:速度为常值,力矩通过算法计算。
另外需要注意,CoppeliaSim的仿真步长默认是50ms,但是物理引擎的步长是5ms,即两者的步长是不一致的。子脚本是在CoppeliaSim仿真时被调用的,即调用周期为50ms。这就意味着子脚本被调用一次时,物理引擎可以计算10次。
有两种方法解决这个问题:
- 将CoppeliaSim的仿真步长修改为5ms,与物理引擎的步长保持一致。
- 使用
Joint callback functions
。
官方推荐使用第二种方法,但是当使用远端API时,只能使用第一种方法。