• 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

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

人工智能 永望 2157次浏览 0个评论

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

一、目前的效果

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

二、无人机模型

制作软件:maya  
基于unity无人机3D仿真《一》   模型结构:  
基于unity无人机3D仿真《一》  

三、开发平台

unity2017 + VS2019 + C#

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

 
基于unity无人机3D仿真《一》   飞行姿态控制 高度控制: 俯仰控制:绕无人机自身y轴运动(前后) 横滚控制:绕无人机自身x轴运动(左右) 偏航控制:绕无人机自身z轴运动(自旋)   无人机坐标系与世界坐标系的对应关系 x(uav) = z(world) y(uav) = x(world) z(uav)= y(world)   四电机拉力: F1、F2、F3、F4   无人机控制规律:
基于unity无人机3D仿真《一》  
在这里插入图片描述  
在这里插入图片描述  
基于unity无人机3D仿真《一》  

五、无人机控制脚本

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仿真《二》将关注于相机和激光传感器的仿真。  


开心洋葱 , 版权所有丨如未注明 , 均为原创丨未经授权请勿修改 , 转载请注明基于unity无人机3D仿真《一》
喜欢 (0)

您必须 登录 才能发表评论!

加载中……