匿名飞控程序1
一、学习Ano_FlightCtrl
3月7日今天买了飞控板,匿名科创的拓空者,程序很复杂,标志位和参数巨多。
卖家也没有完整的一系列的学习步骤,只能慢慢自己摸索。
程序方面前面有main函数和scheduler函数比较直观 ,没什么可说的,工程里总共就那么多函数我看到哪个学哪个吧。
Ano_FlightCtrl我先从这个函数开始,看到不会的函数就找过去,对全局的程序有个印象之后再看别的函数就能串联起来。
void All_PID_Init(void)//姿态高度位置pid初始化
这没什么可说的
2.
/*控制参数改变任务*/
void ctrl_parameter_change_task()
{
if(0)
{
Set_Att_2level_Ki(0);
}
else
{
if(flag.auto_take_off_land ==AUTO_TAKE_OFF)
{
Set_Att_1level_Ki(2);
}
else
{
Set_Att_1level_Ki(1);
}
Set_Att_2level_Ki(1);
}
}
Set_Att_2level_Ki(0);
关于flag的结构体我在文件里搜索没找到不知道为什么,之后用vscode查找也没找到,然后keil 的go to define 又不能用了, 搞了一会 ,今天就到这吧。
3.8这个函数我看了好久一路找到关于角速度pid调参的函数,Set_Att_1level_Ki(1);(暂存)---------------这个函数是设定角速度pid的参数,具体有什么用还得以后看懂pid函数的时候才能解读。
void Set_Att_1level_Ki(u8 mode)
{
if(mode == 0)
{
arg_1[ROL].ki = arg_1[PIT].ki = 0;
}
else if(mode == 1)
{
arg_1[ROL].ki = Ano_Parame.set.pid_att_1level[ROL][KI];
arg_1[PIT].ki = Ano_Parame.set.pid_att_1level[PIT][KI];
}
else
{
arg_1[ROL].ki = arg_1[PIT].ki = CTRL_1_KI_START;
}
}
之后一键翻滚程序没有写好,不能用。
之后是一键起飞
/*一键起飞任务(主要功能为延迟)*/
void one_key_take_off_task(u16 dt_ms)
后面终于看明白这个函数重开始到使用,这个函数只是触发的标志位,
真正是在Ano_AltCtrl文件里的Auto_Take_Off_Land_Task实现的,
在这里设置了最大起飞速度,设置起飞速度范围,之后将速度送到高度环的一个函数里,
实现了一键起飞,写的真复杂。
{
if(one_key_taof_start != 0)
{
one_key_taof_start += dt_ms;
if(one_key_taof_start > 1400 && flag.motor_preparation == 1)
当延时超过1.4秒和电机准备标志位都为是的时候
{
one_key_taof_start = 0; 标志位清零
if(flag.auto_take_off_land == AUTO_TAKE_OFF_NULL)
{
flag.auto_take_off_land = AUTO_TAKE_OFF;
//解锁、起飞
flag.taking_off = 1;(?暂存)----------
}
}
}
}
void one_key_take_off()
{
if(flag.unlock_en)
{
one_key_taof_start = 1;
flag.fly_ready = 1;
}
}
/*一键降落*/
void one_key_land()
{
flag.auto_take_off_land = AUTO_LAND;//AUTO_LAND=3
}
这两个函数说是被上面函数调用了 可是我并没有找到 很奇怪。
/*降落检测*/
static s16 ld_delay_cnt ;
void land_discriminat(s16 dT_ms)
这个函数不重要 。
3.9匿名飞控板到了,我看了一下最新的程序和之前的没差多少,我看了飞控手册,了解了怎么安装飞控和上位机的使用,对飞控和遥控器有一点初步的了解。
目前来说如果我安装好飞控应该能实现定高稳定飞行,还差编写程序一键起飞和飞行任务,其实买拓空者不适合做电赛写自动飞行,这个适合学习姿态算法的实现,比赛更适合的是领航者 。
这个也能用但是不能快速二次开发,以后在说把这个作为第二方案4月15日之前还没做出来实际我就换方案。
目前飞控已经到手了还差电机、电调、接收机、遥控器、等
组装无人机的话目前还缺电调,之前有的电调型号不匹配又买的新的明天到,之前用的接收机是pwm模式接了很多线,匿名飞控接收机只留三根线,我查了查是SBUS或PPM模式,我原来的电调是能够使用的我只需要变一下模式就行。
接收机切换模式只需长按三秒,红灯快闪,之后一秒钟按两下就可以切换到ppm或sbus模式 。
一。关于接收机和飞控连接 的原理介绍和使用
二 同上
三 遥控器和接收机对频
电机的话用之前老的新西达的电机就行 ,1400kv,
听别人说这个牌子一般,我就懒得换了,建议别人买其他的牌子。那么过两天电调到了,无人机硬件方面应该也差不多完成了,基本的起飞是可以的,之后需要光流定高,之后需要摄像头巡线。然后完成任务。
3.11学习了姿态处理,具体公式和代码之后整理出来。
3.12写了文献综述和开题报告,校准电调和接收机,出了些问题,没有成功,切换了个模式,按之前的方法不能用 ,目前不知道怎么和遥控器对频,问题不大。明天应该能解决。
3.13问题解决了,新的电调不给接收机供电,接了5v,按步骤校准了,安装好应该能正常飞行,具体程序还没完全了解,所以不能写自动飞行的程序,不过这个月应该就用光流了,进度还行,程序进度有点慢。
3.14
这个是在别的文章里看到的,自己看不懂。
void Swtich_State_Task(u8 dT_ms)
这个写光流模块使用限制:光流质量大于50,或者在飞行之前,认为光流可用
光流高度600cm内有效
光流:需要高度、光的质量达到要求、
并且飞机处于LOC_HOLD模式,光流开关才会打开。
还有激光模块 uwb openmv 开启标志位 不太重要,内容就不填了。
void Flight_Mode_Set(u8 dT_ms)
{
Speed_Mode_Switch();
if(speed_mode_old != flag.speed_mode) //状态改变
{
speed_mode_old = flag.speed_mode;
//xy_speed_pid_init(flag.speed_mode);////////////
}
///////////////////////////////////////////////////////
if(CH_N[AUX1]<-300) CH_N[AUX1]和 2这个是可以更改模式的
{
flag.flight_mode = ATT_STAB; 好像是自稳的标志位
}
else if(CH_N[AUX1]<200)
{
flag.flight_mode = LOC_HOLD;//使program_ctrl.state_ok这个为1 目前还没看懂
}
else
{
flag.flight_mode = RETURN_HOME; 返航 需要gps 暂时不用考虑
}
if(flight_mode_old != flag.flight_mode) //摇杆对应模式状态改变
{
flight_mode_old = flag.flight_mode;
flag.rc_loss_back_home = 0;
}
//
if(rc_in.no_signal==0)//flag.rc_loss ==0)//接收机有信号
{
//CH_N[]+1500为上位机显示通道值
if(CH_N[AUX2]<-300) 第五通道 遥控器的值具体的我还没看 <1200
{
flag.flight_mode2 = 0; 联系到openmv 后续可以更改到自己写的程序
}
else if(CH_N[AUX2]<200)//1200-1700
{
flag.flight_mode2 = 1;
}
else//>=1700
{
flag.flight_mode2 = 2;
}
}
else
{
flag.flight_mode2 = 0;
}
}
至此,一个星期过完了。
任务完成:
把Ano_FlightCtrl看完了,
标志位也熟悉了一些,
姿态解算也学习了但是还没理解透不过应该不难。
飞控和电调买到了,电调和接收机调试好了。
下个阶段任务:学习程序进度要加快,姿态解算过程熟练。