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

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

 

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的示例代码,用于向无人机吊舱发送数据并接收返回值。请注意,这只是一个示例,实际实现可能会有所不同,具体取决于您使用的通信协议和硬件设备。 ```cpp #include <iostream> #include <cstring> #include <unistd.h> #include <sys/socket.h> #include <arpa/inet.h> #define BUF_SIZE 1024 #define DRONE_IP "192.168.1.100" // 无人机吊舱的IP地址 #define DRONE_PORT 8888 // 无人机吊舱的端口号 int main() { // 创建socket int sock = socket(AF_INET, SOCK_STREAM, 0); if(sock == -1) { std::cerr << "Failed to create socket\n"; return -1; } // 设置服务器地址 sockaddr_in drone_addr; memset(&drone_addr, 0, sizeof(drone_addr)); drone_addr.sin_family = AF_INET; drone_addr.sin_addr.s_addr = inet_addr(DRONE_IP); drone_addr.sin_port = htons(DRONE_PORT); // 连接到服务器 if(connect(sock, (sockaddr*)&drone_addr, sizeof(drone_addr)) == -1) { std::cerr << "Failed to connect to drone\n"; close(sock); return -1; } // 发送数据 char data[] = "Hello, drone!"; if(send(sock, data, strlen(data), 0) == -1) { std::cerr << "Failed to send data to drone\n"; close(sock); return -1; } // 接收数据 char buf[BUF_SIZE]; memset(buf, 0, sizeof(buf)); int len = recv(sock, buf, sizeof(buf), 0); if(len == -1) { std::cerr << "Failed to receive data from drone\n"; close(sock); return -1; } // 输出接收到的数据 std::cout << "Received: " << buf << std::endl; // 关闭socket close(sock); return 0; } ``` 在上面的代码中,我们使用了TCP协议来与无人机吊舱进行通信。首先,我们创建了一个socket,并设置了无人机吊舱的地址。然后,我们连接到无人机吊舱,并发送数据。最后,我们接收并输出从无人机吊舱返回的数据,并关闭socket。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaoxilang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值