关于无人机的智能吊舱项目的开发小结

2023-05-16

智能吊舱是基于光电吊舱项目之上,加入AI的深度学习算法的一种应用;在巡检的各类使用将发挥重要作用!

我要实现的操作是:我在飞机地面站上预置好飞机的航线航点(就是飞机需要巡逻的航线和需要监测的关键航点位置)和航点任务(航点任务是拍照和故障结果输出),然后在地面放置好飞机,自动做航线起飞, 在航线飞行过程中自动控制和调用吊舱来执行任务;

其中主要的研发将包含三个部分:

     基于高倍高清相机控制的开发,基于增稳云台的开发,基于对图像深度学习的开发;

接下来有时间将持续总结。。。。。。。

1.相机控制--变焦倍数控制、拍照控制、录制控制

(1)高倍相机的倍数标定:

标定方法:默认拉到最小为1倍,拉到视野最大为30倍数,然后用控制器的定时器通过软件启动从最小1倍变焦到最大30倍,计算所需要的总时间t--时间精度到us级别;然后计算变化每一倍数的时间为t/30;

验证方法:1)多次测试图像保证视野最小和最大的倍数在测试的时候是正确的 

                  2)得到每一倍的时间之后,通过手动控制单倍时间*变化30次,验证是否均匀从最小变化到最大

(2)拍照和录制会有api接口

2.基于每一个倍数,做1-30倍的PID控制算法(不同倍数PID参数不一致,其他对x、y方向的控制算法可保持一致)

实现的目的:当相机视野有检测到目标时(这时候TX1跑深度学习算法,会输出xy期望像素坐标),相机会自动旋转使得目标在画面中间,并自动调整变焦倍数--令其目标在整个画幅占50%以上;--然后进行其他操作(拍照、录制或深度学习做故障检测)

1) 公用的PID控制算法如下:这个控制算法使用单环

/** x轴方向的pid函数;Pid controler Function  **/
//input: pv 像素实际坐标  sp 期望坐标
//return: pwm;  x轴方向的pid函数;
int pid_controler_x(int pv,int  sp)	
{
    if( (pv>=(sp-CENTER_RANGE)) && (pv<=(sp+CENTER_RANGE)) )
        return 1500;

    err_x = sp - pv;   	
    output_p_x += (Kp_x*(err_x - error_last_x));	
    output_i_x += (Ki_x*err_x);

    if(output_i_x>300)   
        output_i_x=300;

    if(output_i_x < -300)     
        output_i_x= -300;

    output_d_x += (Kd_x*(err_x - 2 * error_last_x + error_last_last_x));  //pid	    
    output_pid_x = output_p_x + output_i_x + output_d_x;  
    error_last_last_x = error_last_x;	
    error_last_x = err_x;

    if(output_pid_x<-400)
        return 1100;
    else if (output_pid_x>400)
        return 1900;   
    else  
        return 1500+output_pid_x;
}

/** y轴方向的pid函数; Pid controler Function  **/
//input: pv 像素实际坐标  sp 期望坐标
//return: pwm
int pid_controler_y(int pv,int sp)	
{
    if( (pv>=(sp-CENTER_RANGE)) && (pv<=(sp+CENTER_RANGE)) )
    return 1500;

    err_y = sp - pv;   	
    output_p_y += (Kp_y*(err_y - error_last_y));	
    output_i_y += (Ki_y*err_y);

    if(output_i_y>300)   
        output_i_y=300;

    if(output_i_y < -300)     
        output_i_y= -300;

    output_d_y += (Kd_y*(err_y - 2 * error_last_y + error_last_last_y));  //pid	    
    output_pid_y = output_p_y + output_i_y + output_d_y;  
    error_last_last_y = error_last_y;	
    error_last_y = err_y;

    if(output_pid_y<-400)
        return 1100;
    else if (output_pid_y>400)
        return 1900;   
    else  
        return 1500+output_pid_y;
}

2) 不同倍数的PID参数如下(两个倍数极端不常有)

//init_pi_param(int size)函数根据传入的相机焦距重置PID参数,没有返回值;
void init_pid_param(int size)
{
    switch(size)
    {
        case 0:
        case 1:
            {
                init_pid_x_y(32, 0, 1, 32, 0, 1);// kp_x,ki_x,kd_x; kp_y,ki_y,kd_y;
                break;
            }
        case 2:
        case 3:
            {
                init_pid_x_y(8, 0, 0, 6, 0, 0.05);// kp_x,ki_x,kd_x; kp_y,ki_y,kd_y;
                break;
            }
        case 4:
        case 5:
        {
            init_pid_x_y(8, 0, 0, 6, 0, 0.05);// kp_x,ki_x,kd_x; kp_y,ki_y,kd_y;
            break;
        }
        case 6:
        case 7:
        {
            init_pid_x_y(8, 0, 0, 5, 0, 0.05);// kp_x,ki_x,kd_x; kp_y,ki_y,kd_y;
            break;
        }
		case 8:
        case 9:
        {
            init_pid_x_y(3, 0, 0, 3, 0, 0.05);// kp_x,ki_x,kd_x; kp_y,ki_y,kd_y;
            break;
		}
		case 10:
        case 11:
        {
            init_pid_x_y(2, 0, 0, 1, 0, 0.05);// kp_x,ki_x,kd_x; kp_y,ki_y,kd_y;
            break;
		}
		case 12:
        case 13:
        {
            init_pid_x_y(1.5, 0, 0, 0.8, 0, 0.05);// kp_x,ki_x,kd_x; kp_y,ki_y,kd_y;
            break;
		}
		case 14:
        case 15:
        case 16:
        case 17:
        {
            init_pid_x_y(1, 0, 0, 0.5, 0.01, 0.05);// kp_x,ki_x,kd_x; kp_y,ki_y,kd_y;
            break;
		}
		case 18:
        {
            init_pid_x_y(1, 0, 0, 0.4, 0.01, 0.04);// kp_x,ki_x,kd_x; kp_y,ki_y,kd_y;
            break;
		}
		case 19:
        case 20:
        {
            init_pid_x_y(0.9, 0, 0, 0.3, 0.01, 0.04);// kp_x,ki_x,kd_x; kp_y,ki_y,kd_y;
            break;
        }
        case 21:
        {
            init_pid_x_y(0.5, 0.01, 0.03, 0.25, 0.01, 0.02);// kp_x,ki_x,kd_x; kp_y,ki_y,kd_y;
            break;
        }
        case 22:
        {
            init_pid_x_y(0.4, 0.01, 0.03, 0.2, 0.007, 0.02);// kp_x,ki_x,kd_x; kp_y,ki_y,kd_y;
            break;
        }
        case 23:
        {
            init_pid_x_y(0.4, 0.01, 0.03, 0.2, 0.007, 0.02);// kp_x,ki_x,kd_x; kp_y,ki_y,kd_y;
            break;
        }
        case 24:
        {
            init_pid_x_y(0.4, 0.01, 0.03, 0.2, 0.007, 0.02);// kp_x,ki_x,kd_x; kp_y,ki_y,kd_y;
            break;
        }
        case 25:
        case 26:
        case 27:
        case 28:
        case 29:
        {
            init_pid_x_y(0.4, 0.01, 0.03, 0.17, 0.01, 0.02); // kp_x,ki_x,kd_x; kp_y,ki_y,kd_y;
            break;
        }
        default:
            fprintf(stderr,"Camera size is err\n");
            break;
    }
       
}

3)移动到画幅之间之后,坐自动变焦(根据自己相机和目标的距离以及自己需要的画幅比例大小来定,倍数在7-20 倍居多)

4)运行其他算法,进行拍照、录制、或故障自动检测和识别

3.图像识别-深度学习算法的加持-caffe的应用 

TX1的使用 

4.接下来,还有地面站APP的配合

.......

地面站至少具备如下细节:

     预踩点功能(采集航点信息,吊舱姿态信息等)

    吊舱控制功能(手动微调姿态等)

    吊舱状态显示(采集状态、关闭、开启自动吊舱等)

    任务状态显示(任务完成状态等)

    PID调试(不用的硬件需要微调倍数的PID等);

5.~~~~~~~~~~~~~~~~~~~~~~~

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于无人机的智能吊舱项目的开发小结 的相关文章

随机推荐