智能吊舱是基于光电吊舱项目之上,加入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.~~~~~~~~~~~~~~~~~~~~~~~