Index
1.描述
2.综述
3.单位
4.初始变化和位置
5.位置控制
6.速度控制
7.力和力矩控制
Motor Limits
Energy Consumption
Motor Functions
wb_motor_set_position
wb_motor_set_velocity
wb_motor_set_acceleration
wb_motor_set_available_force
wb_motor_set_available_torque
wb_motor_set_control_pid
wb_motor_get_target_position
wb_motor_get_min_position
wb_motor_get_max_position
wb_motor_get_velocity
wb_motor_get_max_velocity
wb_motor_get_acceleration
wb_motor_get_available_force
wb_motor_get_max_force
wb_motor_get_available_torque
wb_motor_get_max_torque
wb_motor_enable_force_feedback
wb_motor_disable_force_feedback
wb_motor_get_force_feedback
wb_motor_get_force_feedback_sampling_period
wb_motor_enable_torque_feedback
wb_motor_disable_torque_feedback
wb_motor_get_torque_feedback
wb_motor_get_torque_feedback_sampling_period
wb_motor_set_force
wb_motor_set_torque
wb_motor_get_type
wb_motor_get_brake
wb_motor_get_position_sensor
1.描述
Motor节点是一个抽象节点(未实例化),其派生类是RotationalMotor和LinearMotor。 这些类可用于机械模拟为关节提供动力,从而沿其一个轴产生运动。
当在这些节点的device (resp. device or device2)字段内设置时,RotationalMotor可以为HingeJoint(分别为Hinge2Joint)供电。 然后它产生围绕选择轴的旋转运动。 同样,LinearMotor可以驱动SliderJoint,沿其轴产生滑动。
2.综述
acceleration字段定义P控制器的默认加速度。它表示为线性电机的每秒平方米(m /s²)和旋转电机的每弧度平方(rad /s²)。值-1(无限)意味着加速度不受P控制器的限制。可以使用wb_motor_set_acceleration函数在运行时更改加速度。
consumptionFactor字段定义了在原Robot节点中启用电池模拟时电机消耗的能量。有关电机能耗的详细信息如下。
controlPID字段的第一个坐标指定P参数的初始值,即电机PID控制器的比例增益。高P导致对小误差的大响应,因此系统更灵敏。请注意,若将P设置得太高,系统可能会变得不稳定。对于小P,需要更久才能到达目标位置,但系统更稳定。
controlPID字段的第二个坐标指定I参数的初始值,它是电机PID控制器的积分增益。 PID控制器的积分项定义为随时间误差积分乘以I的乘积。该项加速向目标位置的运动并消除纯比例控制器发生的残余稳态误差。但是,由于积分项表示过去的累积误差,因此可能导致当前值超过目标位置。
controlPID字段的第三个坐标指定D参数的初始值,它是电机PID控制器的微分增益。 PID控制器的导数项定义为误差导数相对于时间乘以D的乘积。该项预测系统行为,从而改善系统的稳定时间和稳定性。
可以使用wb_motor_set_control_pid函数在运行时更改P,I和D的值。
minPosition和maxPosition字段指定目标位置的软限制。这些字段在“电机限制”部分中有更详细的描述,请参见下文。
maxVelocity字段指定电机速度的上限和默认值。它表示为线性电机的每秒米(m / s)和旋转电机的每弧度(rad / s)。可以使用wb_motor_set_velocity函数在运行时更改速度。该值应始终为正(默认值为10)。
声音字段指定WAVE声音文件的URL,相对于包含Motor节点的世界文件或PROTO文件的位置。此声音用于播放电机的声音。它根据电机的速度调节音量和音高,以产生逼真的电机声音。
muscles字段可选地指定一个或多个肌肉节点,其以图形方式显示连接父实体节点和关节的端点节点的人造肌肉的收缩。此功能不适用于Hinge2Joint和Track节点。
3.单位
电机的位置对应于JointParameters中定义的关节位置。 旋转电机的位置以弧度(弧度)表示,而线性电机的位置以米(m)表示。 见表:
Rotational | Linear | |
---|---|---|
Position | rad (radians) | m (meters) |
Velocity | rad/s (radians per second) | m/s (meters per second) |
Acceleration | rad/s² (radians per second squared) | m/s² (meters per second squared) |
4.初始变化和位置
minPosition和maxPosition是根据关节的零位置定义的(参见JointParameters中位置字段的描述)。
5.位置控制
操作电机的标准方法是直接控制位置(位置控制)。 用户使用wb_motor_set_position函数指定目标位置,然后P控制器考虑所需的速度,加速度和马达力,以便将马达移动到目标位置。 见这个表。
在Webots中,位置控制分三个阶段进行,如图所示。 第一阶段由用户指定的控制器(1)执行,该控制器决定必须使用哪个位置,速度,加速度和马达力。 第二阶段由电动机P控制器(2)执行,电动机P控制器(2)计算电动机Vc的当前速度。 最后,第三阶段(3)由物理模拟器(ODE联合电动机)执行。
在每个模拟步骤中,PID控制器(2)根据以下算法重新计算当前速度Vc:
error = Pt - Pc; error_integral += error * ts; error_derivative = (previous_error - error) / ts; Vc = P * error + D * error_derivative + I * error_integral ; if (abs(Vc) > Vd) Vc = sign(Vc) * Vd; if (A != -1) { a = (Vc - Vp) / ts; if (abs(a) > A) a = sign(a) * A; Vc = Vp + a * ts; }
其中Vc是以rad / s或m / s为单位的当前电机速度,P,I和D是controlPID字段中指定的PID控制增益,或者使用wb_motor_set_control_pid函数设置,Pt是电机设定的目标位置 wb_motor_set_position函数,Pc是当前电机位置,Vd是由maxVelocity字段指定的所需速度(默认)或使用wb_motor_set_velocity函数设置,a是在一个时间步长内达到Vc所需的加速度,Vp是电机速度 在前一个时间步长中,ts是由WorldInfo节点的basicTimeStep字段指定的模拟时间步长的持续时间(以秒为单位转换),A是由加速字段(默认)或设置指定的电机加速度 使用wb_motor_set_acceleration函数。
注意:每次调用wb_motor_set_control_pid函数后,error_integral和previous_error都会重置为0。
6.速度控制
电机也可以与速度控制一起使用,而不是位置控制。 这是通过两个函数调用获得的:首先必须使用INFINITY作为位置参数调用wb_motor_set_position函数,然后必须通过调用wb_motor_set_velocity函数来指定所需的速度,可以是正数或负数。 这将以所需速度启动连续电机运动,同时考虑指定的加速度和电机力。 例:
wb_motor_set_position(motor, INFINITY); wb_motor_set_velocity(motor, 6.28); // 1 rotation per second
INFINITY是对应于IEEE 754浮点标准的C宏。 它在C99规范和C ++中实现。 在Java中,此值定义为Double.POSITIVE_INFINITY。 在Python中,你应该使用float('inf')。 最后,在MATLAB中你应该使用inf常量。
7.力和力矩控制
上述位置(分别速度)控制由Webots PID控制器和ODE的联合电机实现(参见ODE文档)执行。 作为替代方案,Webots还允许用户直接指定电机必须施加的力的大小(相应的扭矩)。 这是通过wb_motor_set_force(resp.wb_motor_set_torque)函数实现的,该函数指定所需的力量(相应的扭矩)并关闭PID控制器和电机力(相应的电机扭矩)。 随后对wb_motor_set_position函数的调用将恢复原始位置控制。 使用力控制时必须小心。 实际上,使用wb_motor_set_force(resp.wb_motor_set_torque)函数指定的力(相应的扭矩)将连续应用于电机。 因此,除非使用功能力控制(分别为扭矩控制)算法,否则电动机将无限地加速其旋转或线性运动并最终爆炸。