前言
螺旋桨(Propeller)节点可用于对船舶或飞机螺旋桨进行建模。当其device设置为RotationalMotor时,螺旋桨将会把电机角速度转换为推力/阻力和扭矩。
一、Propeller力学分析
合成推力是实数T与shaftAxis中定义的单位长度轴线矢量的乘积,T由公式给出:
T = t1 * |ω| * ω- t2 * |ω| * ν
其中t1和t2是thrustConstants中指定的常数(webots中为x和y),ω是电机角速度,ν是推力中心沿轴线的线速度分量。
合成扭矩是实数Q与单位长度轴线矢量的乘积,Q由公式给出:
Q = q1 * |ω| * ω- q2 * |ω| * ν
其中q1和q2是在torqueConstants字段中指定的常数。(同上)
二、配置字段
shaftAxis:推力和转矩轴线
centerOfThrust:推力作用点
thrustConstants和torqueConstants:推力常数和转矩常数,根据上文公式可以改变作用方向和大小。如设置torqueConstants的x=-1,y=0可单使转矩反向。
fastHelixThreshold:改变模型的阈值,当超过这个阈值的时候,螺旋桨的建模模型会从slowHelix变成fastHelix。
fastHelix和slowHelix:仅可设置位NULL和Solid两个节点类型,设置为Solid时展示螺旋桨模型。
三、简单的双旋翼模型
建立一个robot节点,并在子节点中设置propeller节点,在device中添加RotationMotor。作为机体的Solid节点不再赘述,可参阅官方教程及博客自行添加。
按自己的模型改变推力轴线和作用点位置(shaftAxis和centerOfThrust)
效果如图(黑线为推力轴线,也是电机转动轴线)
slowHelix和fastHelix可以选择不设置,设置模型的话方便观察,方法同设置Solid节点的方法。
复制一份Propeller节点,按自己的模型改变其中的推力轴线和推力中心。并把torqueConstants设置为-1,0。
最后把两个propeller的电机name字段分别命名为motor1和motor2。新建控制器,添加如下代码:
#include <webots/robot.h>
#include <webots/motor.h>
#define TIME_STEP 64
int main(int argc, char **argv) {
/* necessary to initialize webots stuff */
wb_robot_init();
WbDeviceTag motor1=wb_robot_get_device("motor1");
WbDeviceTag motor2=wb_robot_get_device("motor2");
wb_motor_set_position(motor1, INFINITY);
wb_motor_set_position(motor2, INFINITY);
//设置电机运行位置为无限远
wb_motor_set_velocity(motor1, 10);
wb_motor_set_velocity(motor2, 10);
//设置电机运行速度
while (wb_robot_step(TIME_STEP) != -1) {
};
wb_robot_cleanup();
return 0;
}
编译运行,双旋翼无人机垂直起飞。
注:如果在添加slowAxis和fastAxis字段的螺旋桨模型时发现无法改变螺旋桨的位置,请注意保存世界。若保存世界后依然无法改变,关闭webots重启可解决问题。这可能是某种webots的仿真bug。
总结
本文介绍了webots中Propeller节点的力学模拟模型和配置方法。并结合代码展示如何使用c语言编写控制器制作一个简单的双旋翼模型。
webots官方参考手册github版:https://github.com/Beta-y/webots_references
官方参考手册github版原文链接:Webots2020a官方参考手册(双语食用)