基于unity无人机3D仿真《一》

102
0
2020年11月9日 08时53分

基于unity无人机3D仿真《一》实现无人机的模型的制作、运动学关系、姿态角等;实现无人机各种姿态运动。

一、目前的效果

 

微信图片_20201106172011

 

微信图片_20201106172541

 

二、无人机模型

制作软件:maya

 

微信图片_20201106172724

 

模型结构:

 

微信图片_20201106172755

 

三、开发平台

unity2017 + VS2019 + C#

四、无人机模型及控制规律

 

微信图片_20201106172842

 

飞行姿态控制
高度控制:
俯仰控制:绕无人机自身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仿真《二》将关注于相机和激光传感器的仿真。

 

发表评论

后才能评论