基于unity无人机3D仿真《一》实现无人机的模型的制作、运动学关系、姿态角等;实现无人机各种姿态运动。
一、目前的效果
二、无人机模型
制作软件:maya
模型结构:
三、开发平台
unity2017 + VS2019 + C#
四、无人机模型及控制规律
飞行姿态控制 高度控制: 俯仰控制:绕无人机自身y轴运动(前后) 横滚控制:绕无人机自身x轴运动(左右) 偏航控制:绕无人机自身z轴运动(自旋) 无人机坐标系与世界坐标系的对应关系 x(uav) = z(world) y(uav) = x(world) z(uav)= y(world) 四电机拉力: F1、F2、F3、F4 无人机控制规律:
五、无人机控制脚本
UAV_1_power:脚本 (1)四个电机的拉力
static public float F1 = 0.0f;//无人机电机1的拉力
static public float F2 = 0.0f;//无人机电机2的拉力
static public float F3 = 0.0f;//无人机电机3的拉力
static public float F4 = 0.0f;//无人机电机4的拉力
(2)更新标志
static public bool update_xyz_flag = false;//更新xyz的加速度、速度、位移的标志
static public bool update_angle_flag = false;//更新角度的加速度、速度、角度的标志
static public bool update_move_flag = false;//更新无人机的位置,在更新xyz后设置标志位
static public bool update_rotate_flag = false;//更新无人机的姿态角,在更新角度后设置标志位
(3)四个电机的转速
static public float motor_1_speed = 0.0f;//无人机电机1的转速
static public float motor_2_speed = 0.0f;//无人机电机2的转速
static public float motor_3_speed = 0.0f;//无人机电机3的转速
static public float motor_4_speed = 0.0f;//无人机电机4的转速
(4)电机属性差异(可利用此对电机对无人机的影响)
private float motor_1_para = 0.0f;//无人机电机1的属性
private float motor_2_para = 0.0f;//无人机电机2的属性
private float motor_3_para = 0.0f;//无人机电机3的属性
private float motor_4_para = 0.0f;//无人机电机4的属性
(5)无人机各方向,姿态的控制量
static public float U1 = 0.0f;//无人机垂直升降控制量
static public float U2 = 0.0f;//无人机横滚控制量
static public float U3 = 0.0f;//无人机俯仰控制量
static public float U4 = 0.0f;//无人机偏航控制量
(6)电机提供的最大力
private float min_motor1_power = 0.0f;//无人机电机1最小的拉力
private float max_motor1_power = 380.0f;//无人机电机1最大的拉力
private float min_motor2_power = 0.0f;//无人机电机2最小的拉力
private float max_motor2_power = 380.0f;//无人机电机2的最大拉力
private float min_motor3_power = 0.0f;//无人机电机3的最小的拉力
private float max_motor3_power = 380.0f;//无人机电机3的最大拉力
private float min_motor4_power = 0.0f;//无人机电机4的最小拉力
private float max_motor4_power = 380.0f;//无人机电机4的最大拉力
(7)检查F1、F2、F3、F4是否改变并设置标志位
void check_update();
(8)无人机拉力参数初始化
void F_para_init()
(9)无人机电机的转速
motor_speed()
(10)无人机各方向的控制量
void control()
(11)检查无人机的控制模式
check_control_model()
(12)利用按键改变F1、F2、F3、F4的大小 F1:A 为加1, S 为减1 F3:G 为加1, H 为减1 F2:D 为加1, F 为减1 F4:J 为加1, K 为减1
void key_scam_control()
(13)
void Start () {
uav_1_self = GameObject.Find("uav_1");//无人机1初始化
F_para_init();//电机拉力参数初始化
}
(14)
void Update () {
check_control_model();//检查控制模式
check_update();//检查F1、F2、F3、F4是否改变并设置标志位
motor_speed();//更新电机速度
control();//更新各方向的控制量
key_scam_control();
}
(15)GUI界面
void OnGUI()
{
GUILayout.Label("无人机当前位置"+uav_1_self.transform.position);//显示无人机的当前位置
GUILayout.Label("当前横滚角加速度:" + UAV_1_angle.roll_acc + " 横滚角速度:" + UAV_1_angle.roll_speed + " 横滚角增量:" + UAV_1_angle.roll);
GUILayout.Label("当前俯仰角加速度:" + UAV_1_angle.pitch_acc + " 俯仰角速度:" + UAV_1_angle.pitch_speed + " 俯仰角增量:" + UAV_1_angle.pitch);
GUILayout.Label("当前偏航角加速度:" + UAV_1_angle.yaw_acc + " 偏航角速度:" + UAV_1_angle.yaw_speed + " 偏航角增量:" + UAV_1_angle.yaw);
GUILayout.Label("X轴当前的加速度:" + UAV_1_linear_motion.x_acc + " X轴的速度" + UAV_1_linear_motion.x_speed + " X轴的位移增量" + UAV_1_linear_motion.x);
GUILayout.Label("Z轴当前的加速度:" + UAV_1_linear_motion.y_acc + " Z轴的速度" + UAV_1_linear_motion.y_speed + " Z轴的位移增量" + UAV_1_linear_motion.y);
GUILayout.Label("Y轴当前的加速度:" + UAV_1_linear_motion.z_acc + " Y轴的速度" + UAV_1_linear_motion.z_speed + " Y轴的位移增量" + UAV_1_linear_motion.z);
GUILayout.Label("当前无人机的控制模式" + control_model);//显示无人机的控制模式
if(GUILayout.Button("自动模式"))
{
uav_control_model = false;
}
if(GUILayout.Button("手动模式"))
{
uav_control_model = true;
}
if(uav_control_model)
{
F1 = GUILayout.HorizontalSlider(F1, min_motor1_power, max_motor1_power);//通过滑块改变F1的大小
GUILayout.Label("当前F1的大小为" + F1);//显示F1的当前值
GUILayout.BeginHorizontal();
if(GUILayout.Button("F1加1"))
{
F1 = F1 + 1;
}
GUILayout.Space(10);
if(GUILayout.Button("F1减1"))
{
F1 = F1 - 1;
}
GUILayout.EndHorizontal();
F2 = GUILayout.HorizontalSlider(F2,min_motor2_power,max_motor2_power);//通过滑块改变F2的大小
GUILayout.Label("当前F2的大小为" + F2);//显示F2的当前值
GUILayout.BeginHorizontal();
if (GUILayout.Button("F2加1"))
{
F2 = F2 + 1;
}
GUILayout.Space(10);
if (GUILayout.Button("F2减1"))
{
F2 = F2 - 1;
}
GUILayout.EndHorizontal();
F3 = GUILayout.HorizontalSlider(F3, min_motor3_power, max_motor3_power);//通过滑块改变F3的大小
GUILayout.Label("当前F3的大小为" + F3);//显示F3的当前值
GUILayout.BeginHorizontal();
if (GUILayout.Button("F3加1"))
{
F3 = F3 + 1;
}
GUILayout.Space(10);
if (GUILayout.Button("F3减1"))
{
F3 = F3 - 1;
}
GUILayout.EndHorizontal();
F4 = GUILayout.HorizontalSlider(F4, min_motor4_power, max_motor4_power);//通过滑块改变F4的大小
GUILayout.Label("当前F4的大小为" + F4);//显示F4的当前值
GUILayout.BeginHorizontal();
if (GUILayout.Button("F4加1"))
{
F4 = F4 + 1;
}
GUILayout.Space(10);
if (GUILayout.Button("F4减1"))
{
F4 = F4 - 1;
}
GUILayout.EndHorizontal();
GUILayout.BeginHorizontal();
if (GUILayout.Button("整体加1"))
{
F1 = F1 + 1;
F2 = F2 + 1;
F3 = F3 + 1;
F4 = F4 + 1;
}
GUILayout.Space(10);
if (GUILayout.Button("整体减1"))
{
F1 = F1 - 1;
F2 = F2 - 1;
F3 = F3 - 1;
F4 = F4 - 1;
}
GUILayout.Space(10);
if(GUILayout.Button("起飞"))
{
F1 = 4;
F2 = 4;
F3 = 4;
F4 = 4;
}
GUILayout.EndHorizontal();
}
脚本UAV_1_moveRotate (1) 无人机姿态角
void uav_Rotate()
(2)无人机位置
void uav_positiom()
(3)
void Start () {
//获取无人机的对象
uav_1_self = GameObject.Find("uav_1");
}
(4)
void Update () {
uav_Rotate();
}
(5)
void FixedUpdate()
{
uav_positiom();
}
脚本UAV_1_propellor (1)更新螺旋桨的转速
void propellor_update()
(2)
void Start () {
//获取无人机的对象
UAV_1_propellor_1 = GameObject.Find("uav_1/front_motor1_right14/motor/propellor14");//无人机1的一号电机的螺旋桨
UAV_1_propellor_2 = GameObject.Find("uav_1/back_motor2_left11/motor/propellor11");//无人机1的二号电机的螺旋桨
UAV_1_propellor_3 = GameObject.Find("uav_1/front_motor3_left12/motor/propellor12");//无人机1的三号电机的螺旋桨
UAV_1_propellor_4 = GameObject.Find("uav_1/back_motor4_right13/motor/propellor13");//无人机1的四号电机的螺旋桨
}
(3)
void Update () {
propellor_update();
}
脚本UAV_1_linear_motion
//空气阻力参数
private float Kx = 0.0f;//X轴方向的空气阻力参数
private float Ky = 0.0f;//Y轴方向的空气阻力参数
private float Kz = 0.0f;//Z轴方向的空气阻力参数
//空气阻力
static public float fx = 0.0f;//X轴方向的空气阻力
static public float fy = 0.0f;//Y轴方向的空气阻力
static public float fz = 0.0f;//Z轴方向的空气阻力
//线运动的速度
static public float x_speed = 0.0f;//X轴方向的速度
static public float y_speed = 0.0f;//Y轴方向的速度
static public float z_speed = 0.0f;//Z轴方向的速度
//线运动的加速度
static public float x_acc = 0.0f;//X轴方向的加速度
static public float y_acc = 0.0f;//Y轴方向的加速度
static public float z_acc = 0.0f;//Z轴方向的加速度
//线运动的位移
static public float x = 0.0f;//X轴方向的位移
static public float y = 0.0f;//Y轴方向的位移
static public float z = 0.0f;//Z轴方向的位移
//无人机的质量
private float mass_uav = 0.0f;//无人机的质量
//重力加速度
private float g = 0.0f;//重力加速度
//固定更新的时间,此时间用于计算速度和位移
private float fixed_update_time = 0.0f;
//起飞标志
static public bool take_off_uav_flag = false;
//无人机对象
GameObject UAV_1_self = null;
(2)检查起飞和设置标志位
void check_takeoff()
(3)线运动参数初始化
void linear_motion_init()
(4)更新空气阻力
void fx_fy_fz_update()
(5)更新线运动
void linear_motion_update()
(6)
void Start () {
linear_motion_init();
UAV_1_self = GameObject.Find("uav_1");
}
// Update is called once per frame
void Update () {
fx_fy_fz_update();
check_takeoff();
Debug.Log(z);
}
void FixedUpdate()
{
linear_motion_update();
}
脚本UAV_1_angle (1)
//无人机的转动惯量
private float Ix = 0.0f;
private float Iy = 0.0f;
private float Iz = 0.0f;
//无人机旋翼中心到无人机坐标系x轴的垂直距离
private float d = 0.0f;
//无人机的姿态角
static public float roll = 0.0f;// 无人机的横滚角度
static public float pitch = 0.0f;//无人机的俯仰角度
static public float yaw = 0.0f;//无人机的偏航角度
//无人机的姿态角角速度
static public float roll_speed = 0.0f;//无人机的横滚角度的角速度
static public float pitch_speed = 0.0f;//无人机的俯仰角的角速度
static public float yaw_speed = 0.0f;//无人机的偏航角的角速度
//无人机的姿态角角加速度
static public float roll_acc = 0.0f;//无人机的横滚角度的角加速度
static public float pitch_acc = 0.0f;//无人机的俯仰角的角加速度
static public float yaw_acc = 0.0f;//无人机的偏航角的角加速度
//固定更新的时间
static public float fixed_update_time = 0.0f;//FixedUpdate函数运行的时间
//角加速度计算的参数
private float k1 = 0.0f;//横滚角角加速度
private float k2 = 0.0f;//俯仰角角加速度
private float k3 = 0.0f;//偏航角角加速度
(2)与角度计算有关的参数初始化
void angle_para_init()
(3)姿态角更新
void angle_update()
(4)
void Start () {
angle_para_init();
}
// Update is called once per frame
void Update () {
}
void FixedUpdate()
{
angle_update();
}
基于unity无人机3D仿真《二》将关注于相机和激光传感器的仿真。