匿名无人机飞控代码整理5

先跳过高度部分,这里看location部分

在这里插入图片描述
可以看出来这部分也是直接与我们的循迹、追踪任务相关的。所以这部分的掌握应该很重要把。
前面有很多暂时不需要看,flyctrl那个巨长。。。所以就先看速度环控制部分了。

if(switchs.uwb_on && (!switchs.of_flow_on) && (!switchs.gps_on))
{
	mode_f[1] = 3;
	if(mode_f[1] != mode_f[0])
	{
		Loc_1level_PID_Init();
		mode_f[0] = mode_f[1];
	}	
	
	loc_ctrl_1.out[X] = (float)MAX_ANGLE/MAX_SPEED *fs.speed_set_h[X] ;
	loc_ctrl_1.out[Y] = (float)MAX_ANGLE/MAX_SPEED *fs.speed_set_h[Y] ;
		
}

如果只有uwb(其实没有),就对loc_ctrl_1.out赋值,这个结构体是这样的:

typedef struct
{
	float exp[VEC_XYZ];
	s32 fb[VEC_XYZ];

	
	float out[VEC_XYZ];
}_loc_ctrl_st;

做pid用。

	else if(switchs.uwb_on && switchs.of_flow_on && (!switchs.gps_on))
	{
		mode_f[1] = 4;
		if(mode_f[1] != mode_f[0])
		{
			Loc_1level_PID_Init();
			mode_f[0] = mode_f[1];
		}	



		h2w_2d_trans(fs.speed_set_h,imu_data.hx_vec,loc_ctrl_1.exp);
		
		LPF_1_(5.0f,dT_ms*1e-3f,imu_data.w_acc[X],vel_fb_d_lpf[X]);
		LPF_1_(5.0f,dT_ms*1e-3f,imu_data.w_acc[Y],vel_fb_d_lpf[Y]);		
	
		if(sens_hd_check.of_ok)
		{
			vel_fb_h[0] = OF_DX2;
			vel_fb_h[1] = OF_DY2;
		}
		else//sens_hd_check.of_df_ok
		{
			vel_fb_h[0] = of_rdf.gnd_vel_est_h[X];
			vel_fb_h[1] = of_rdf.gnd_vel_est_h[Y];	
		}
		
		h2w_2d_trans(vel_fb_h,imu_data.hx_vec,vel_fb_w);
		
		loc_ctrl_1.fb[X] = vel_fb_w[0] + 0.03f *vel_fb_d_lpf[X];
		loc_ctrl_1.fb[Y] = vel_fb_w[1] + 0.03f *vel_fb_d_lpf[Y];
		
		fb_speed_fix[0] = uwb_data.w_vel_cmps[0];
		fb_speed_fix[1] = uwb_data.w_vel_cmps[1];
		
		for(u8 i =0;i<2;i++)
		{
			PID_calculate( dT_ms*1e-3f,           
										loc_ctrl_1.exp[i] ,				
										loc_ctrl_1.exp[i] ,				
										loc_ctrl_1.fb[i] ,			
										&loc_arg_1[i], 
										&loc_val_1[i],	
										50,
										10 *flag.taking_off			
										 )	;	
			
			
			PID_calculate( dT_ms*1e-3f,           
										loc_ctrl_1.exp[i] ,				
										loc_ctrl_1.exp[i] ,				
										fb_speed_fix[i] ,			
										&loc_arg_1_fix[i], 
										&loc_val_1_fix[i],	
										50,
										10 *flag.taking_off		
										 )	;	
			
			pos_ctrl_w_out[i] = loc_val_1[i].out + loc_val_1_fix[i].out;	
		}	
		
		w2h_2d_trans(pos_ctrl_w_out,imu_data.hx_vec,pos_ctrl_h_out); 
		
		loc_ctrl_1.out[0] = pos_ctrl_h_out[0];
		loc_ctrl_1.out[1] = pos_ctrl_h_out[1];	
	}

否则,如果只有光流和uwb,没有gps,那么对mode做相同的操作,接着使用了物坐标系对世界坐标的转换:

void h2w_2d_trans(float h[VEC_XYZ],float ref_ax[VEC_XYZ],float w[VEC_XYZ])
{
	w[X] = h[X] *ref_ax[X] + h[Y] *(-ref_ax[Y]);
	w[Y] = h[X] *ref_ax[Y] + h[Y] *  ref_ax[X];
	
}

也就是把速度(相对于物坐标系的),转换成世界坐标系的,赋给loc_ctrl_1.exp,也就是预期的速度。怎么理解呢。。。不知道,再看。。

低通滤波是干嘛的,不知道。。

	if(sens_hd_check.of_ok)
	{
		vel_fb_h[0] = OF_DX2;
		vel_fb_h[1] = OF_DY2;
	}
	else
	{
		vel_fb_h[0] = of_rdf.gnd_vel_est_h[X];
		vel_fb_h[1] = of_rdf.gnd_vel_est_h[Y];	
	}

如果光流ok,那么把物坐标系的速度期望值赋为,这个,否则赋为那个,是这样吧。。
然后又转坐标系:

h2w_2d_trans(vel_fb_h,imu_data.hx_vec,vel_fb_w);

把物坐标系的测量来的速度信息转化为世界坐标系。

loc_ctrl_1.fb[X] = vel_fb_w[0] + 0.03f *vel_fb_d_lpf[X];
loc_ctrl_1.fb[Y] = vel_fb_w[1] + 0.03f *vel_fb_d_lpf[Y];

对控制结构体中的反馈部分赋值。

	fb_speed_fix[0] = uwb_data.w_vel_cmps[0];
	fb_speed_fix[1] = uwb_data.w_vel_cmps[1];

速度修正,可能利用了uwb。。。
然后用了两个pid,一个结果加一个修正值,结果pos_ctrl_w_out[i]等于两个值相加

w2h_2d_trans(pos_ctrl_w_out,imu_data.hx_vec,pos_ctrl_h_out); 

再把得到的结果转回物坐标系。

	loc_ctrl_1.out[0] = pos_ctrl_h_out[0];
	loc_ctrl_1.out[1] = pos_ctrl_h_out[1];	

转完输出给loc_ctrl_1.out[]。。。要记住这个loc_ctrl_1就是物坐标系

如果仅有光流:

else if(switchs.of_flow_on && (!switchs.gps_on))
{
	mode_f[1] = 1;
	if(mode_f[1] != mode_f[0])
	{
		Loc_1level_PID_Init();
		mode_f[0] = mode_f[1];
	}
	
	loc_ctrl_1.exp[X] = fs.speed_set_h[X];
	loc_ctrl_1.exp[Y] = fs.speed_set_h[Y];
	//
	LPF_1_(5.0f,dT_ms*1e-3f,imu_data.h_acc[X],vel_fb_d_lpf[X]);
	LPF_1_(5.0f,dT_ms*1e-3f,imu_data.h_acc[Y],vel_fb_d_lpf[Y]);		
	
	if(sens_hd_check.of_ok)
	{
		loc_ctrl_1.fb[X] = OF_DX2 + 0.03f *vel_fb_d_lpf[X];
		loc_ctrl_1.fb[Y] = OF_DY2 + 0.03f *vel_fb_d_lpf[Y];
		
		fb_speed_fix[0] = OF_DX2FIX;
		fb_speed_fix[1] = OF_DY2FIX;
	}
	else//sens_hd_check.of_df_ok
	{
		loc_ctrl_1.fb[X] = of_rdf.gnd_vel_est_h[X] + 0.03f *vel_fb_d_lpf[X];
		loc_ctrl_1.fb[Y] = of_rdf.gnd_vel_est_h[Y] + 0.03f *vel_fb_d_lpf[Y];
		
		fb_speed_fix[0] = of_rdf.gnd_vel_est_h[X];
		fb_speed_fix[1] = of_rdf.gnd_vel_est_h[Y];		
	}
	
	for(u8 i =0;i<2;i++)
	{
		PID_calculate( dT_ms*1e-3f,            //ÖÜÆÚ£¨µ¥Î»£ºÃ룩
									loc_ctrl_1.exp[i] ,				//Ç°À¡Öµ
									loc_ctrl_1.exp[i] ,				//ÆÚÍûÖµ£¨É趨ֵ£©
									loc_ctrl_1.fb[i] ,			//·´À¡Öµ£¨£©
									&loc_arg_1[i], //PID²ÎÊý½á¹¹Ìå
									&loc_val_1[i],	//PIDÊý¾Ý½á¹¹Ìå
									50,//»ý·ÖÎó²îÏÞ·ù
									10 *flag.taking_off			//integration limit£¬»ý·ÖÏÞ·ù
									 )	;	
		
		//fix
		PID_calculate( dT_ms*1e-3f,            //ÖÜÆÚ£¨µ¥Î»£ºÃ룩
									loc_ctrl_1.exp[i] ,				//Ç°À¡Öµ
									loc_ctrl_1.exp[i] ,				//ÆÚÍûÖµ£¨É趨ֵ£©
									fb_speed_fix[i] ,			//·´À¡Öµ£¨£©
									&loc_arg_1_fix[i], //PID²ÎÊý½á¹¹Ìå
									&loc_val_1_fix[i],	//PIDÊý¾Ý½á¹¹Ìå
									50,//»ý·ÖÎó²îÏÞ·ù
									10 *flag.taking_off			//integration limit£¬»ý·ÖÏÞ·ù
									 )	;	
		
		loc_ctrl_1.out[i] = loc_val_1[i].out + loc_val_1_fix[i].out;	//(PD)+(I)	
	}		
}

处理差不多好像。。。但是少了坐标变换。。?不太懂

接下来一个就是有gps的。。。好长的判断语句,不看了。。。

最后一个是gps、光流、uwb都没有,那就直接利用期望速度得出期望姿态角,这里比较好理解,但恐怕实际上的情况是有光流无gps、uwb,所以应该是第三段代码,但有光流实际上就是在定位。。。

所以说在实际中,我们想要前进,就改变switch。
打开of的switch,那么就可以实现定位,关闭并设置期望速度,就可以做到前进。。

在具体一点,怎么移动、物坐标系和世界坐标系等等,再看。。。

  • 0
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
无人机飞控代码开源stm32,指的是将无人机飞行控制系统的代码在STM32平台上进行开源。开源意味着将代码公开并允许他人免费使用、修改和分发。 无人机飞控代码是指用于控制无人机飞行的软件程序,包括飞行姿态控制、高度控制、航向控制等算法和逻辑。而STM32是一款由意法半导体公司开发的微控制器平台,具有高性能、低功耗和丰富的外设接口。 开源无人机飞控代码在STM32平台上的好处包括: 1. 自由定制:开源代码允许开发者自由定制和修改飞控算法,以满足不同无人机应用的需求。 2. 共享经验:开源代码可以促进开发者之间的经验共享和合作,有助于无人机飞控系统的技术进步和创新。 3. 代码审核:开源代码可以被更多人审查,发现和纠正潜在的错误和漏洞,提高系统的可靠性和安全性。 4. 提高可信度:开源代码可以增加对无人机飞控系统的可信度和透明度,减少对商业封闭系统的依赖。 5. 降低成本:开源代码可以免费获取和使用,减少开发无人机飞行控制系统的成本,推动无人机技术的普及和发展。 总而言之,将无人机飞控代码开源在STM32平台上有助于推动无人机技术的发展和创新,提高无人机飞行控制系统的性能和可靠性,降低无人机开发的成本。同时,开源还能够促进开发者之间的合作和经验共享,推动无人机行业的繁荣和壮大。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值