主頁 >  其他 > 我覺得還是把ACfly的傳感器的邏輯弄清楚,這樣再去二次開發好一些。(折騰半天發現有很關鍵一部分沒有開源,怪不得找不到,這讓我很失望)

我覺得還是把ACfly的傳感器的邏輯弄清楚,這樣再去二次開發好一些。(折騰半天發現有很關鍵一部分沒有開源,怪不得找不到,這讓我很失望)

2020-10-03 15:44:21 其他

我覺得還是把ACfly的傳感器的邏輯弄清楚,這樣再去二次開發好一些,確實是這樣的,還是得真正搞清楚,不然弄不成,真正把他這個工程啃透,我先不說語法上,先邏輯上啃透,

他覺得二次開發簡單那是因為他對整個工程有了透徹的了解了,

一個剛來的人聽他講那二次開發還是會亂的,

acfly的基本邏輯是,你先把傳感器注冊上,然后它會有函式自動判斷你傳感器的資料質量如何,并選擇用什么傳感器,

還有問題默認注冊的位置傳感器的資料單位是多少,

傳感器的處理邏輯都在sensor.c里面,包括像經緯度投影到平面,那幾種傳感器的資料怎么處理的看這個檔案就夠了,

從contrlsystem.hpp這個檔案就可以看書ctrl_attitude.cpp和ctrL_position.cpp這兩個檔案里面有哪些函式,這也是那個華清老師說的,高手都是先看頭檔案,不然你直接看那兩個C++檔案幾千行,很亂的,ctrL_position.cpp是沒有單獨的頭檔案的,

ACfly的用戶手冊里面也說了單位是cm

找到那個進行傳感器資料質量判斷,還有根據傳感器優先級進行傳感器選擇的函式,

我們這么來想,所謂傳感器的選擇實際是位置傳感器的選擇,姿態傳感器就是用IMU,不用選擇什么

位置傳感器無非就是在氣壓計,光流,超聲波,GPS,攝像頭這之間選擇,

所以只需要對位置傳感器進行判斷就可以了

所以你在sensor.h里可以看到,有這么多個位置傳感器的偏移量,

在sensor.cpp也可以看到

/*傳感器位置偏移*/

	struct SensorPosOffset
	{
		//飛控位置偏移
		float Fc_x[2];
		float Fc_y[2];
		float Fc_z[2];
		
		//傳感器0位置偏移
		float S0_x[2];
		float S0_y[2];
		float S0_z[2];
		
		//傳感器1位置偏移
		float S1_x[2];
		float S1_y[2];
		float S1_z[2];
		
		//傳感器2位置偏移
		float S2_x[2];
		float S2_y[2];
		float S2_z[2];
		
		//傳感器3位置偏移
		float S3_x[2];
		float S3_y[2];
		float S3_z[2];
		
		//傳感器4位置偏移
		float S4_x[2];
		float S4_y[2];
		float S4_z[2];
		
		//傳感器5位置偏移
		float S5_x[2];
		float S5_y[2];
		float S5_z[2];
		
		//傳感器6位置偏移
		float S6_x[2];
		float S6_y[2];
		float S6_z[2];
		
		//傳感器7位置偏移
		float S7_x[2];
		float S7_y[2];
		float S7_z[2];
		
		//傳感器8位置偏移
		float S8_x[2];
		float S8_y[2];
		float S8_z[2];
		
		//傳感器9位置偏移
		float S9_x[2];
		float S9_y[2];
		float S9_z[2];
		
		//傳感器10位置偏移
		float S10_x[2];
		float S10_y[2];
		float S10_z[2];
		
		//傳感器11位置偏移
		float S11_x[2];
		float S11_y[2];
		float S11_z[2];
		
		//傳感器12位置偏移
		float S12_x[2];
		float S12_y[2];
		float S12_z[2];
		
		//傳感器13位置偏移
		float S13_x[2];
		float S13_y[2];
		float S13_z[2];
		
		//傳感器14位置偏移
		float S14_x[2];
		float S14_y[2];
		float S14_z[2];
		
		//傳感器15位置偏移
		float S15_x[2];
		float S15_y[2];
		float S15_z[2];
	};

/*傳感器位置偏移*/

這有個傳感器位置讀取函式,

所以其實最關鍵的就是這個位置傳感器的判斷和選擇了,我們自己注冊傳感器也是注冊位置傳感器,它已經給我們定義好了三種位置傳感器,

我發現對傳感器資料是否健康的判斷在傳感器更新函式里面,不是的,這里應該只是簡單判斷有沒有資料這樣子,

比如下面這是其中一個位置傳感器更新函式 ,這里面有看傳感器是否可用,

bool PositionSensorUpdatePosition( uint8_t index, vector3<double> position, bool available, double delay, double xy_trustD, double z_trustD, double TIMEOUT )
		{
			if( index >= Position_Sensors_Count )
				return false;
			
			bool inFlight;
			get_is_inFlight(&inFlight);
			uint64_t log = 0;
			ReadParam( "SDLog_PosSensor", 0, 0, (uint64_t*)&log, 0 );
			
			TickType_t TIMEOUT_Ticks;
			if( TIMEOUT >= 0 )
				TIMEOUT_Ticks = TIMEOUT*configTICK_RATE_HZ;
			else
				TIMEOUT_Ticks = portMAX_DELAY;
			if( xSemaphoreTake(Position_Sensors_Mutex[index],TIMEOUT_Ticks) )
			{	//鎖定傳感器
				if( Position_Sensors[index] == 0 )
				{
					xSemaphoreGive(Position_Sensors_Mutex[index]);
					return false;
				}
				
				Position_Sensor* sensor = Position_Sensors[index];
				//判斷傳感器型別、資料是否正確
				bool data_effective;
				switch( sensor->sensor_DataType )
				{
					case Position_Sensor_DataType_s_xy:
						if( __ARM_isnan( position.x ) || __ARM_isnan( position.y ) || \
								__ARM_isinf( position.x ) || __ARM_isinf( position.y ) )
							data_effective = false;
						else
							data_effective = true;
						break;
						
					case Position_Sensor_DataType_s_z:
						if( __ARM_isnan( position.z ) || __ARM_isinf( position.z ) )
							data_effective = false;
						else
							data_effective = true;
						break;
						
					case Position_Sensor_DataType_s_xyz:
						if( __ARM_isnan( position.x ) || __ARM_isnan( position.y ) || __ARM_isnan( position.z ) || \
								__ARM_isinf( position.x ) || __ARM_isinf( position.y ) || __ARM_isinf( position.z ) )
							data_effective = false;
						else
							data_effective = true;
						break;
						
					default:
						data_effective = false;
						break;
				}
				if( !data_effective )
				{	//資料出錯退出
					xSemaphoreGive(Position_Sensors_Mutex[index]);
					return false;
				}
				
				//更新可用狀態
				if( sensor->available != available )
					sensor->available_status_update_time = TIME::now();
				sensor->available = available;
				
				//更新資料
				sensor->position = position;
				
				//更新采樣時間
				sensor->sample_time = sensor->last_update_time.get_pass_time_st();			
				
				//延時大于0更新延時
				if( delay > 0 )
					sensor->delay = delay;
				//更新信任度
				if( xy_trustD >= 0 )
					sensor->xy_trustD = xy_trustD;
				if( z_trustD >= 0 )
					sensor->z_trustD = z_trustD;
				
				//記錄位置資料
				if(inFlight && log)
					SDLog_Msg_PosSensor( index, *sensor );
				
				xSemaphoreGive(Position_Sensors_Mutex[index]);
				return true;
			}	//解鎖傳感器
			return false;
		}

這才是位置控制的代碼,當然是在ctrl_position.cpp里面,只是你之前沒有細看找到,我覺得位置傳感器的選擇應該也是在這里面,因為之前這個檔案里面大部分函式都是設定一些目標值,但是你用PID或者ADRC肯定是要用當前值減去目標值得到誤差輸入誤差的啊,對不對,這個應該是在位置控制里面完成,那么肯定就有當前值,那我們就可以去找他怎么確定當前值的,

比如下面這個就是目標值減去當前值,可以可以根據這個進一步去找,

右鍵查看position的定義會跳到這里,會發現這里定義了三個向量,位置,速度,加速度,

vector3其實就是這樣一種資料,包含x y z

但是我沒有找到position是在哪里得到具體值的,

void ctrl_Position()
{	
	bool Attitude_Control_Enabled;	is_Attitude_Control_Enabled(&Attitude_Control_Enabled);
	if( Attitude_Control_Enabled == false )
	{
		Altitude_Control_Enabled = false;
		Position_Control_Enabled = false;
		return;
	}
	
	double e_1_n;
	double e_1;
	double e_2_n;
	double e_2;
	
	bool inFlight;	get_is_inFlight(&inFlight);
	vector3<double> Position;	get_Position_Ctrl(&Position);
	vector3<double> VelocityENU;	get_VelocityENU_Ctrl(&VelocityENU);
	vector3<double> AccelerationENU;	get_AccelerationENU_Ctrl(&AccelerationENU);
	get_throttle_force(&AccelerationENU.z);	AccelerationENU.z-=GravityAcc;
	
	//位置速度濾波
	double Ps = cfg.P1[0];
	double Pv = cfg.P2[0];
	double Pa = cfg.P3[0];
	
	static vector3<double> TAcc;
	vector3<double> TargetVelocity;
	vector3<double> TargetVelocity_1;
	vector3<double> TargetVelocity_2;
	
	//XY或Z其中一個為非3D模式則退出3D模式
	if( Is_3DAutoMode(HorizontalPosition_ControlMode) && Is_3DAutoMode(Altitude_ControlMode)==false )
		HorizontalPosition_ControlMode = Position_ControlMode_Locking;
	else if( Is_3DAutoMode(HorizontalPosition_ControlMode)==false && Is_3DAutoMode(Altitude_ControlMode) )
		Altitude_ControlMode = Position_ControlMode_Locking;
	
	if( Position_Control_Enabled )
	{	//水平位置控制
		if( get_Position_MSStatus() != MS_Ready )
		{
			Position_Control_Enabled = false;
			goto PosCtrl_Finish;
		}
		
		switch( HorizontalPosition_ControlMode )
		{
			case Position_ControlMode_Position:
			{
				if( inFlight )
				{
					vector2<double> e1;
					e1.x = target_position.x - Position.x;
					e1.y = target_position.y - Position.y;
					vector2<double> e1_1;
					e1_1.x = - VelocityENU.x;
					e1_1.y = - VelocityENU.y;
					vector2<double> e1_2;
					e1_2.x = - TAcc.x;
					e1_2.y = - TAcc.y;
					double e1_length = safe_sqrt(e1.get_square());
					e_1_n = e1.x*e1_1.x + e1.y*e1_1.y;
					if( !is_zero(e1_length) )
						e_1 = e_1_n / e1_length;
					else
						e_1 = 0;
					e_2_n = ( e1.x*e1_2.x + e1.y*e1_2.y + e1_1.x*e1_1.x + e1_1.y*e1_1.y )*e1_length - e_1*e_1_n;
					if( !is_zero(e1_length*e1_length) )
						e_2 = e_2_n / (e1_length*e1_length);
					else
						e_2 = 0;
					smooth_kp_d2 d1 = smooth_kp_2( e1_length, e_1, e_2 , Ps, 200 );
					vector2<double> T2;
					vector2<double> T2_1;
					vector2<double> T2_2;
					if( !is_zero(e1_length*e1_length*e1_length) )
					{
						vector2<double> n = e1 * (1.0/e1_length);
						vector2<double> n_1 = (e1_1*e1_length - e1*e_1) / (e1_length*e1_length);
						vector2<double> n_2 = ( (e1_2*e1_length-e1*e_2)*e1_length - (e1_1*e1_length-e1*e_1)*(2*e_1) ) / (e1_length*e1_length*e1_length);
						T2 = n*d1.d0;
						T2_1 = n*d1.d1 + n_1*d1.d0;
						T2_2 = n*d1.d2 + n_1*(2*d1.d1) + n_2*d1.d0;
					}
					TargetVelocity.x = T2.x;	TargetVelocity.y = T2.y;
					TargetVelocity_1.x = T2_1.x;	TargetVelocity_1.y = T2_1.y;
					TargetVelocity_2.x = T2_2.x;	TargetVelocity_2.y = T2_2.y;
				}
				else
				{
					//沒起飛前在位置控制模式
					//重置期望位置
					target_position.x = Position.x;
					target_position.y = Position.y;
					Attitude_Control_set_Target_RollPitch( 0, 0 );
					goto PosCtrl_Finish;
				}
				break;
			}		
			case Position_ControlMode_Velocity:
			{
				if( !inFlight )
				{
					//沒起飛時重置期望速度
					Attitude_Control_set_Target_RollPitch( 0, 0 );
					goto PosCtrl_Finish;
				}
				else
				{
					TargetVelocity.x = target_velocity.x;
					TargetVelocity.y = target_velocity.y;
					Pv = cfg.P2_VelXY[0];
				}
				break;
			}
			
			case Position_ControlMode_RouteLine:
			{
				if( inFlight )
				{
					//計算垂足
					vector2<double> A( target_position.x, target_position.y );
					vector2<double> C( Position.x, Position.y );
					vector2<double> A_C = C - A;
					vector2<double> A_B( route_line_A_B.x, route_line_A_B.y );
					double k = (A_C * A_B) * route_line_m;
					vector2<double> foot_point = (A_B * k) + A;
					
					//計算偏差
					vector2<double> e1r = A - foot_point;
					vector2<double> e1d = foot_point - C;
					double e1r_length = safe_sqrt(e1r.get_square());
					double e1d_length = safe_sqrt(e1d.get_square());
					
					//計算route方向單位向量
					vector2<double> route_n;
					if( e1r_length > 0.001 )
						route_n = e1r * (1.0/e1r_length);
					
					//計算d方向單位向量
					vector2<double> d_n;
					if( e1d_length > 0.001 )
						d_n = e1d * (1.0/e1d_length);
					
					//計算e1導數
					vector2<double> e1_1( VelocityENU.x, VelocityENU.y );
					double e1r_1 = -(e1_1 * route_n);
					double e1d_1 = -(e1_1 * d_n);
					//e1二階導
					vector2<double> e1_2( TAcc.x, TAcc.y );
					double e1r_2 = -(e1_2 * route_n);
					double e1d_2 = -(e1_2 * d_n);
					
					/*route方向*/
						smooth_kp_d2 d1r = smooth_kp_2( e1r_length, e1r_1, e1r_2 , Ps, AutoVelXY );
						vector2<double> T2r = route_n * d1r.d0;
						vector2<double> T2r_1 = route_n * d1r.d1;
						vector2<double> T2r_2 = route_n * d1r.d2;
					/*route方向*/
					
					/*d方向*/
						smooth_kp_d2 d1d = smooth_kp_2( e1d_length, e1d_1, e1d_2 , Ps, AutoVelXY );
						vector2<double> T2d = d_n * d1d.d0;
						vector2<double> T2d_1 = d_n * d1d.d1;
						vector2<double> T2d_2 = d_n * d1d.d2;
					/*d方向*/
						
					TargetVelocity.x = T2r.x+T2d.x;	TargetVelocity.y = T2r.y+T2d.y;
					TargetVelocity_1.x = T2r_1.x+T2d_1.x;	TargetVelocity_1.y = T2r_1.y+T2d_1.y;
					TargetVelocity_2.x = T2r_2.x+T2d_2.x;	TargetVelocity_2.y = T2r_2.y+T2d_2.y;
						
					if( e1r.get_square() + e1d.get_square() < 20*20 )
						HorizontalPosition_ControlMode = Position_ControlMode_Position;
				}
				else
				{
					//沒起飛時重置期望速度
					Attitude_Control_set_Target_RollPitch( 0, 0 );
					return;
				}
				break;
			}
			
			case Position_ControlMode_RouteLine3D:
			{
				if( inFlight )
				{
					//計算垂足
					vector3<double> A_C = Position - target_position;
					double k = (A_C * route_line_A_B) * route_line_m;
					vector3<double> foot_point = (route_line_A_B * k) + target_position;
					
					//計算偏差
					vector3<double> e1r = target_position - foot_point;
					vector3<double> e1d = foot_point - Position;
					double e1r_length = safe_sqrt(e1r.get_square());
					double e1d_length = safe_sqrt(e1d.get_square());
					
					//計算route方向單位向量
					vector3<double> route_n;
					if( e1r_length > 0.001 )
						route_n = e1r * (1.0/e1r_length);
					
					//計算e1導數
					double e1r_1_length = -(VelocityENU * route_n);	
					vector3<double> e1r_1 = route_n * e1r_1_length;					
					vector3<double> e1d_1 = -(VelocityENU + e1r_1);
					//e1二階導
					vector3<double> e1_2( TAcc.x, TAcc.y, AccelerationENU.z );
					double e1r_2_length = -(e1_2 * route_n);
					vector3<double> e1r_2 = route_n * e1r_2_length;					
					vector3<double> e1d_2 = -(e1_2 + e1r_2);
					
					/*route方向*/
						smooth_kp_d2 d1r = smooth_kp_2( e1r_length, e1r_1_length, e1r_2_length , Ps, AutoVelXYZ );
						vector3<double> T2r = route_n * d1r.d0;
						vector3<double> T2r_1 = route_n * d1r.d1;
						vector3<double> T2r_2 = route_n * d1r.d2;
					/*route方向*/
					
					/*d方向*/
						e_1_n = e1d.x*e1d_1.x + e1d.y*e1d_1.y + e1d.z*e1d_1.z;
						if( !is_zero(e1d_length) )
							e_1 = e_1_n / e1d_length;
						else
							e_1 = 0;
						e_2_n = ( e1d.x*e1d_2.x + e1d.y*e1d_2.y + e1d.z*e1d_2.z + e1d_1.x*e1d_1.x + e1d_1.y*e1d_1.y + e1d_1.z*e1d_1.z )*e1d_length - e_1*e_1_n;
						if( !is_zero(e1d_length*e1d_length) )
							e_2 = e_2_n / (e1d_length*e1d_length);
						else
							e_2 = 0;
						smooth_kp_d2 d1d = smooth_kp_2( e1d_length, e_1, e_2 , Ps, AutoVelXYZ );
						vector3<double> T2d;
						vector3<double> T2d_1;
						vector3<double> T2d_2;
						if( !is_zero(e1d_length*e1d_length*e1d_length) )
						{
							vector3<double> n = e1d * (1.0/e1d_length);
							vector3<double> n_1 = (e1d_1*e1d_length - e1d*e_1) / (e1d_length*e1d_length);
							vector3<double> n_2 = ( (e1d_2*e1d_length-e1d*e_2)*e1d_length - (e1d_1*e1d_length-e1d*e_1)*(2*e_1) ) / (e1d_length*e1d_length*e1d_length);
							T2d = n*d1d.d0;
							T2d_1 = n*d1d.d1 + n_1*d1d.d0;
							T2d_2 = n*d1d.d2 + n_1*(2*d1d.d1) + n_2*d1d.d0;
						}
					/*d方向*/
						
					TargetVelocity = T2r + T2d;
					TargetVelocity_1 = T2r_1 + T2d_1;
					TargetVelocity_2 = T2r_2 + T2d_2;
						
					if( e1r.get_square() + e1d.get_square() < 20*20 )
						HorizontalPosition_ControlMode = Altitude_ControlMode = Position_ControlMode_Position;
				}
				else
				{
					//沒起飛時重置期望速度
					Attitude_Control_set_Target_RollPitch( 0, 0 );
					return;
				}
				break;
			}
			
			case Position_ControlMode_Locking:
			default:
			{	//剎車鎖位置
				static uint16_t lock_counter = 0;
				if( inFlight )
				{					
					TargetVelocity.x = 0;
					TargetVelocity.y = 0;
					if( VelocityENU.x*VelocityENU.x + VelocityENU.y*VelocityENU.y < 10*10 )
					{
						if( ++lock_counter >= CtrlRateHz*0.7 )
						{
							lock_counter = 0;
							target_position.x = Position.x;
							target_position.y = Position.y;
							HorizontalPosition_ControlMode = Position_ControlMode_Position;
						}
					}
					else
						lock_counter = 0;
				}
				else
				{
					lock_counter = 0;
					target_position.x = Position.x;
					target_position.y = Position.y;
					HorizontalPosition_ControlMode = Position_ControlMode_Position;
					Attitude_Control_set_Target_RollPitch( 0, 0 );
					return;
				}
				break;
			}
		}	
		
		//計算期望加速度
		vector2<double> e2;
		e2.x = TargetVelocity.x - VelocityENU.x;
		e2.y = TargetVelocity.y - VelocityENU.y;
		vector2<double> e2_1;
		e2_1.x = TargetVelocity_1.x - TAcc.x;
		e2_1.y = TargetVelocity_1.y - TAcc.y;
		double e2_length = safe_sqrt(e2.get_square());
		e_1_n = e2.x*e2_1.x + e2.y*e2_1.y;
		if( !is_zero(e2_length) )
			e_1 = e_1_n / e2_length;
		else
			e_1 = 0;
		smooth_kp_d1 d2;
		if( Is_AutoMode(HorizontalPosition_ControlMode) )
			d2 = smooth_kp_1( e2_length, e_1 , Pv, cfg.maxAutoAccXY[0] );
		else
			d2 = smooth_kp_1( e2_length, e_1 , Pv, cfg.maxAccXY[0] );
		vector2<double> T3;
		vector2<double> T3_1;
		if( !is_zero(e2_length*e2_length) )
		{
			vector2<double> n = e2 * (1.0/e2_length);
			vector2<double> n_1 = (e2_1*e2_length - e2*e_1) / (e2_length*e2_length);
			T3 = n*d2.d0;
			T3_1 = n*d2.d1 + n_1*d2.d0;
		}
		T3 += vector2<double>( TargetVelocity_1.x, TargetVelocity_1.y );
		T3_1 += vector2<double>( TargetVelocity_2.x, TargetVelocity_2.y );
		
		vector2<double> e3;
		e3.x = T3.x - TAcc.x;
		e3.y = T3.y - TAcc.y;
		double e3_length = safe_sqrt(e3.get_square());
		double d3;
		if( Is_AutoMode(HorizontalPosition_ControlMode) )
			d3 = smooth_kp_0( e3_length , Pa, cfg.maxAutoJerkXY[0] );
		else
			d3 = smooth_kp_0( e3_length , Pa, cfg.maxJerkXY[0] );
		vector2<double> T4;
		if( !is_zero(e3_length) )
		{
			vector2<double> n = e3 * (1.0/e3_length);
			T4 = n*d3;
		}
		if( Is_AutoMode(HorizontalPosition_ControlMode) )
			T4.constrain( cfg.maxAutoJerkXY[0] );
		else
			T4.constrain( cfg.maxJerkXY[0] );
		T4 += T3_1;
		
		TAcc.x += T4.x*(1.0/CtrlRateHz);
		TAcc.y += T4.y*(1.0/CtrlRateHz);	
		
		//去除風力擾動
		vector3<double> WindDisturbance;
		get_WindDisturbance( &WindDisturbance );
		vector2<double> target_acceleration;
//		target_acceleration.x = TAcc.x - WindDisturbance.x;
//		target_acceleration.y = TAcc.y - WindDisturbance.y;
		target_acceleration.x = T3.x - WindDisturbance.x;
		target_acceleration.y = T3.y - WindDisturbance.y;
		
		//旋轉至Bodyheading
		Quaternion attitude;
		get_Attitude_quat(&attitude);
		double yaw = attitude.getYaw();		
		double sin_Yaw, cos_Yaw;
		fast_sin_cos( yaw, &sin_Yaw, &cos_Yaw );
		double target_acceleration_x_bodyheading = ENU2BodyHeading_x( target_acceleration.x , target_acceleration.y , sin_Yaw , cos_Yaw );
		double target_acceleration_y_bodyheading = ENU2BodyHeading_y( target_acceleration.x , target_acceleration.y , sin_Yaw , cos_Yaw );
//		target_acceleration_x_bodyheading = ThrOut_Filters[0].run(target_acceleration_x_bodyheading);
//		target_acceleration_y_bodyheading = ThrOut_Filters[1].run(target_acceleration_y_bodyheading);
		
		//計算風力補償角度
		double WindDisturbance_Bodyheading_x = ENU2BodyHeading_x( WindDisturbance.x , WindDisturbance.y , sin_Yaw , cos_Yaw );
		double WindDisturbance_Bodyheading_y = ENU2BodyHeading_y( WindDisturbance.x , WindDisturbance.y , sin_Yaw , cos_Yaw );
		//計算角度
		double AccUp = GravityAcc + AccelerationENU.z;
		double AntiDisturbancePitch = atan2( -WindDisturbance_Bodyheading_x , AccUp );
		double AntiDisturbanceRoll = atan2( WindDisturbance_Bodyheading_y , AccUp );
		
		//計算目標角度
		double target_Roll = atan2( -target_acceleration_y_bodyheading , AccUp );
		double target_Pitch = atan2( target_acceleration_x_bodyheading , AccUp );
		if( HorizontalPosition_ControlMode==Position_ControlMode_Velocity )
		{	//角度限幅
			if( VelCtrlMaxRoll>0 && VelCtrlMaxPitch>0 )
			{
				target_Roll = constrain( target_Roll , AntiDisturbanceRoll - VelCtrlMaxRoll, AntiDisturbanceRoll + VelCtrlMaxRoll );
				target_Pitch = constrain( target_Pitch , AntiDisturbancePitch - VelCtrlMaxPitch, AntiDisturbancePitch + VelCtrlMaxPitch );
			}
			else if( VelCtrlMaxRoll>0 )
			{
				vector2<double> Tangle( target_Roll - AntiDisturbanceRoll, target_Pitch - AntiDisturbancePitch );
				Tangle.constrain(VelCtrlMaxRoll);
				target_Roll = AntiDisturbanceRoll + Tangle.x;
				target_Pitch = AntiDisturbancePitch + Tangle.y;
			}
		}

		//設定目標角度
		Attitude_Control_set_Target_RollPitch( target_Roll, target_Pitch );
		
		//獲取真實目標角度修正TAcc
		Attitude_Control_get_Target_RollPitch( &target_Roll, &target_Pitch );
		target_acceleration_x_bodyheading = tan(target_Pitch)*GravityAcc;
		target_acceleration_y_bodyheading = -tan(target_Roll)*GravityAcc;
		target_acceleration.x = BodyHeading2ENU_x( target_acceleration_x_bodyheading, target_acceleration_y_bodyheading , sin_Yaw, cos_Yaw );
		target_acceleration.y = BodyHeading2ENU_y( target_acceleration_x_bodyheading, target_acceleration_y_bodyheading , sin_Yaw, cos_Yaw );
		TAcc.x = target_acceleration.x + WindDisturbance.x;
		TAcc.y = target_acceleration.y + WindDisturbance.y;
	}//水平位置控制
	else
	{
		ThrOut_Filters[0].reset(0);
		ThrOut_Filters[1].reset(0);
	}
	
PosCtrl_Finish:	
	if( Altitude_Control_Enabled )
	{//高度控制
			
		//設定控制量限幅
		Target_tracker[2].r2p = cfg.maxVelUp[0];
		Target_tracker[2].r2n = cfg.maxVelDown[0];
		Target_tracker[2].r3p = cfg.maxAccUp[0];
		Target_tracker[2].r3n = cfg.maxAccDown[0];
		Target_tracker[2].r4p = cfg.maxJerkUp[0];
		Target_tracker[2].r4n = cfg.maxJerkDown[0];
		
		if( !Is_3DAutoMode(Altitude_ControlMode) )
		{
			switch( Altitude_ControlMode )
			{
				case Position_ControlMode_Position:
				{	//控制位置
					if( inFlight )
					{
						Target_tracker[2].r2p = 0.3*cfg.maxVelUp[0];
						Target_tracker[2].r2n = 0.3*cfg.maxVelDown[0];
						Target_tracker[2].track4( target_position.z , 1.0 / CtrlRateHz );
					}
					else
					{
						//沒起飛前在位置控制模式
						//不要起飛
						Target_tracker[2].reset();
						target_position.z = Target_tracker[2].x1 = Position.z;
						Attitude_Control_set_Throttle( get_STThrottle() );
						goto AltCtrl_Finish;
					}
					break;
				}
				case Position_ControlMode_Velocity:
				{	//控制速度
					if( inFlight || target_velocity.z > 0 )
					{
						double TVel;
						if( target_velocity.z > cfg.maxVelUp[0] )
							TVel = cfg.maxVelUp[0];
						else if( target_velocity.z < -cfg.maxVelDown[0] )
							TVel = -cfg.maxVelDown[0];
						else
							TVel = target_velocity.z;
						Target_tracker[2].track3( TVel , 1.0 / CtrlRateHz );
					}
					else
					{
						//沒起飛且期望速度為負
						//不要起飛
						Target_tracker[2].reset();
						Target_tracker[2].x1 = Position.z;
						Attitude_Control_set_Throttle( get_STThrottle() );
						goto AltCtrl_Finish;
					}
					break;
				}
				
				case Position_ControlMode_Takeoff:
				{	//起飛
					
					//設定控制量最大值
					Target_tracker[2].r3p = cfg.maxAutoAccUp[0];
					Target_tracker[2].r3n = cfg.maxAutoAccDown[0];
					Target_tracker[2].r4p = cfg.maxAutoJerkUp[0];
					Target_tracker[2].r4n = cfg.maxAutoJerkDown[0];
					
					if( inFlight )
					{
						//已起飛
						//控制達到目標高度
						double homeZ;
						getHomeLocalZ(&homeZ);
						if( Position.z - homeZ < 100 )
							Target_tracker[2].r2n = Target_tracker[2].r2p = 50;
						else
							Target_tracker[2].r2n = Target_tracker[2].r2p = ( AutoVelZ < cfg.maxAutoVelUp[0] ) ? AutoVelZ : cfg.maxAutoVelUp[0];
						Target_tracker[2].track4( target_position.z , 1.0 / CtrlRateHz );
						if( fabs( target_position.z - Position.z ) < 10 && \
								in_symmetry_range( Target_tracker[2].x2 , 0.1 ) && \
								in_symmetry_range( Target_tracker[2].x3 , 0.1 )	)
							Altitude_ControlMode = Position_ControlMode_Position;
					}
					else
					{
						//未起飛
						//等待起飛
						target_position.z =  Position.z + TakeoffHeight;
						Target_tracker[2].x1 = Position.z;
						Target_tracker[2].track3( 50 , 1.0 / CtrlRateHz );
					}
					break;
				}
				case Position_ControlMode_RouteLine:
				{	//飛到指定高度
					
					//設定控制量最大值
					Target_tracker[2].r3p = cfg.maxAutoAccUp[0];
					Target_tracker[2].r3n = cfg.maxAutoAccDown[0];
					Target_tracker[2].r4p = cfg.maxAutoJerkUp[0];
					Target_tracker[2].r4n = cfg.maxAutoJerkDown[0];
					
					if( inFlight )
					{
						//已起飛
						//控制達到目標高度
						Target_tracker[2].r2n = Target_tracker[2].r2p = AutoVelZ;
						Target_tracker[2].track4( target_position.z , 1.0f / CtrlRateHz );
						if( fabs( target_position.z - Position.z ) < 10 && \
								in_symmetry_range( VelocityENU.z , 10.0f ) &&  \
								in_symmetry_range( AccelerationENU.z , 50.0f ) && \
								in_symmetry_range( Target_tracker[2].x2 , 0.1f ) && \
								in_symmetry_range( Target_tracker[2].x3 , 0.1f )	)
							Altitude_ControlMode = Position_ControlMode_Position;
					}
					else
					{
						//未起飛
						//不要起飛
						Target_tracker[2].reset();
						Target_tracker[2].x1 = Position.z;
						Attitude_Control_set_Throttle( 0 );
						goto AltCtrl_Finish;
					}
					break;
				}
				
				case Position_ControlMode_Locking:
				default:
				{	//鎖位置(減速到0然后鎖住高度)
					if( inFlight )
					{
						Target_tracker[2].track3( 0 , 1.0 / CtrlRateHz );
						if( in_symmetry_range( VelocityENU.z , 10.0 ) && \
								in_symmetry_range( Target_tracker[2].x2 , 0.1 ) && \
								in_symmetry_range( Target_tracker[2].x3 , 0.1 )	)
						{
							target_position.z = Target_tracker[2].x1;
							Altitude_ControlMode = Position_ControlMode_Position;
						}
					}
					else
					{
						Altitude_ControlMode = Position_ControlMode_Position;
						Attitude_Control_set_Throttle( get_STThrottle() );
						goto AltCtrl_Finish;
					}
					break;
				}
			}
		}
		
		if( inFlight )
		{
			//計算期望速度
			double target_velocity_z;
			//期望垂直速度的導數
			double Tvz_1, Tvz_2;
			if( Is_3DAutoMode(Altitude_ControlMode) )
			{
				target_velocity_z = TargetVelocity.z;
				Tvz_1 = TargetVelocity_1.z;
				Tvz_2 = TargetVelocity_2.z;
				Target_tracker[2].reset();
				Target_tracker[2].x1 = target_position.z;
			}
			else
			{
				if( Target_tracker[2].get_tracking_mode() == 4 )
				{
					double max_fb_vel = ( Target_tracker[2].x1 - Position.z ) > 0 ? cfg.maxAutoVelUp[0] : cfg.maxAutoVelDown[0];
					smooth_kp_d2 TvFb = smooth_kp_2(
							Target_tracker[2].x1 - Position.z,
							Target_tracker[2].x2 - VelocityENU.z, 
							Target_tracker[2].x3 - AccelerationENU.z, 
							Ps, max_fb_vel );
					target_velocity_z = TvFb.d0 + Target_tracker[2].x2;
					Tvz_1 = TvFb.d1 + Target_tracker[2].x3;
					Tvz_2 = TvFb.d2 + Target_tracker[2].x4;
				}
				else
				{
					target_velocity_z = Target_tracker[2].x2;
					Tvz_1 = Target_tracker[2].x3;
					Tvz_2 = Target_tracker[2].x4;
				}
			}
			
			//計算期望加速度
			double max_fb_acc = ( target_velocity_z - VelocityENU.z ) > 0 ? cfg.maxAutoAccUp[0] : cfg.maxAutoAccDown[0];
			smooth_kp_d1 TaFb = smooth_kp_1(
					target_velocity_z - VelocityENU.z,
					Tvz_1 - AccelerationENU.z, 
					Pv, max_fb_acc );
			double target_acceleration_z = TaFb.d0 + Tvz_1;
			double target_acceleration_z_1 = TaFb.d1 + Tvz_2;
			//target_acceleration_z = TargetVelocityFilter[2].run( target_acceleration_z );
			//加速度誤差
			double acceleration_z_error = target_acceleration_z - AccelerationENU.z;
			
			//獲取傾角cosin
			Quaternion quat;
			get_Airframe_quat(&quat);
			double lean_cosin = quat.get_lean_angle_cosin();
			
			//獲取電機起轉油門
			double MotorStartThrottle = get_STThrottle();
			//獲取懸停油門 - 電機起轉油門
			double hover_throttle;
			get_hover_throttle(&hover_throttle);
			hover_throttle = hover_throttle - MotorStartThrottle;	
			
			//計算輸出油門
			double force, T, b;
			get_throttle_force(&force);
			get_ESO_height_T(&T);
			get_throttle_b(&b);
			if( force < 1 )
				force = 1;
			double throttle = ( force + T * ( acceleration_z_error * Pa + target_acceleration_z_1 ) )/b;
			//傾角補償
			if( lean_cosin > 0.1 )				
				throttle /= lean_cosin;
			else	//傾角太大
				throttle = (100 - MotorStartThrottle) / 2;
			
			if( inFlight )
			{
				double logbuf[10];
				logbuf[0] = throttle;
				logbuf[1] = hover_throttle;
				logbuf[2] = force;
				logbuf[3] = target_acceleration_z;
				logbuf[4] = AccelerationENU.z;
				SDLog_Msg_DebugVect( "thr", logbuf, 5 );
			}
			
			//油門限幅
			throttle += MotorStartThrottle;
			if( throttle > 90 )
				throttle = 90;
			if( inFlight )
			{
				if( throttle < MotorStartThrottle )
					throttle = MotorStartThrottle;
			}
			
			//側翻保護
			static uint32_t RollOverProtectCounter = 0;
			if( lean_cosin < 0 )
			{
				if( ++RollOverProtectCounter >= CtrlRateHz*3 )
				{
					RollOverProtectCounter = CtrlRateHz*3;
					throttle = 0;
				}
			}
			else
				RollOverProtectCounter = 0;
			
//			throttle = ThrOut_Filters[2].run(throttle);
			//輸出
			Attitude_Control_set_Throttle( throttle );
		}
		else
		{
			//沒起飛
			//均勻增加油門起飛
			double throttle;
			get_Target_Throttle(&throttle);
			ThrOut_Filters[2].reset(throttle);
			Attitude_Control_set_Throttle( throttle + 1.0/CtrlRateHz * 15 );
		}
		
	}//高度控制
AltCtrl_Finish:
	return;
}

發現一個新檔案,在crtl_position.cpp右鍵查看下面這個函式的定義時發現的,是和position一起定義的,我嘗試著想看看,因為沒有找到position賦值的地方,

這個檔案所處的檔案夾我之前還真沒注意,莫非這部分不開源的?我看到一個lib檔案,怪不得我之前找不到啊!!!!不開源的,這樣很多東西自己都沒法去改啊,他說他弄了好長時間的例外檢測,估計這部分不開源,position的值怎么得到的這部分不開源,這樣我想嘗試一下自己制定只用T265的資料都沒法指定了,這樣有點不方便,辛虧先把背后基本邏輯挖了下,不然到時候你想弄單純的SLAM實驗可能都弄不了,也不一定,我把其他位置傳感器都拔掉只剩T265這樣或許應該可以測驗,無名只是光流融合部分不開源,這個我無所謂,但是ACfly這個核心關鍵部分不開源,就給你一些API,我是不太喜歡的,或者找找他以前部分有沒有開源,這樣在他以前的代碼上改改,

他這里自己也說了

https://blog.csdn.net/weixin_40767422/article/details/88081309

姿態解算是哪些呢,他在用戶手冊里面也有寫,正是我找到的這個

是的,你關心的那些函式都在這個MeasurementSystem.hpp頭檔案里,比如傳感器資料好壞的判斷,真正position資料的獲取,但是你想查看這些函式的實作,跳轉不了,

#pragma once

#include "vector2.hpp"
#include "vector3.hpp"
#include "Quaternion.hpp"
#include "map_projection.hpp"

//獲取三位元組WGA識別碼
void MS_get_WGA( uint32_t* WGA );
//獲取正版驗證結果
bool MS_WGA_Correct();

//獲取當前使用的陀螺儀
uint8_t get_current_use_IMUGyroscope();
//獲取當前使用的加速度計
uint8_t get_current_use_IMUAccelerometer();

enum MS_Status
{
	MS_Initializing ,
	MS_Ready ,
	MS_Err ,
};

/*健康度資訊*/
	struct PosSensorHealthInf1
	{
		//傳感器序號
		uint8_t sensor_ind;
		//解算位置
		vector3<double> PositionENU;
		//傳感器位置
		double sensor_pos;
		//傳感器偏移(傳感器健康時更新)
		//HOffset+PositionENU = 傳感器估計值
		double HOffset;
		//上次健康時間
		TIME last_healthy_TIME;
		//是否可用(不可用時噪聲無效)
		bool available;
		//傳感器噪聲上下界(傳感器-解算)
		double NoiseMin, NoiseMax;
		//速度噪聲
		double VNoise;
	};
	struct PosSensorHealthInf2
	{
		//傳感器序號
		uint8_t sensor_ind;
		//是否全球定位傳感器
		//是才有定位轉換資訊
		bool global_sensor;
		//定位坐標轉換資訊
		Map_Projection mp;
		//解算位置
		vector3<double> PositionENU;
		//傳感器位置
		vector2<double> sensor_pos;
		//傳感器偏移(傳感器健康時更新)
		//HOffset+PositionENU = 傳感器估計值
		vector2<double> HOffset;
		//上次健康時間
		vector2<TIME> last_healthy_TIME;
		//是否可用(不可用時噪聲無效)
		bool available;
		//傳感器噪聲上下界(傳感器-解算)
		vector2<double> NoiseMin, NoiseMax;
		//速度噪聲
		vector2<double> VNoise;
	};
	struct PosSensorHealthInf3
	{
		//傳感器序號
		uint8_t sensor_ind;
		//是否全球定位傳感器
		//是才有定位轉換資訊
		bool global_sensor;
		//定位坐標轉換資訊
		Map_Projection mp;
		//解算位置
		vector3<double> PositionENU;
		//傳感器位置
		vector3<double> sensor_pos;
		//傳感器偏移(傳感器健康時更新)
		//HOffset+PositionENU = 傳感器估計值
		vector3<double> HOffset;
		//上次健康時間
		vector3<TIME> last_healthy_TIME;
		//是否可用(不可用時噪聲無效)
		bool available;
		//傳感器噪聲上下界(傳感器-解算)
		vector3<double> NoiseMin, NoiseMax;
		//速度噪聲
		vector3<double> VNoise;		
	};

	/*XY傳感器健康度*/
		//獲取當前XY傳感器
		int8_t get_Current_XYSensor();
	
		//指定序號傳感器健康度
		bool get_PosSensorHealth_XY( PosSensorHealthInf2* result, uint8_t sensor_ind, double TIMEOUT = -1 );
		//當前傳感器健康度
		bool get_Health_XY( PosSensorHealthInf2* result, double TIMEOUT = -1 );
		//最優測距傳感器健康度
		bool get_OptimalRange_XY( PosSensorHealthInf2* result, double TIMEOUT = -1 );
		//最優全球定位傳感器健康度
		bool get_OptimalGlobal_XY( PosSensorHealthInf2* result, double TIMEOUT = -1 );
	/*XY傳感器健康度*/
	
	/*Z傳感器健康度*/
		//獲取當前Z傳感器
		int8_t get_Current_ZSensor();
	
		//指定序號傳感器健康度
		bool get_PosSensorHealth_Z( PosSensorHealthInf1* result, uint8_t sensor_ind, double TIMEOUT = -1 );
		//當前傳感器健康度
		bool get_Health_Z( PosSensorHealthInf1* result, double TIMEOUT = -1 );
		//最優測距傳感器健康度
		bool get_OptimalRange_Z( PosSensorHealthInf1* result, double TIMEOUT = -1 );
		//最優全球定位傳感器健康度
		bool get_OptimalGlobal_Z( PosSensorHealthInf1* result, double TIMEOUT = -1 );
	/*Z傳感器健康度*/
	
	/*XYZ傳感器健康度*/
		//指定序號傳感器健康度
		bool get_PosSensorHealth_XYZ( PosSensorHealthInf3* result, uint8_t sensor_ind, double TIMEOUT = -1 );
		//最優測距傳感器健康度
		bool get_OptimalRange_XYZ( PosSensorHealthInf3* result, double TIMEOUT = -1 );
		//最優全球定位傳感器健康度
		bool get_OptimalGlobal_XYZ( PosSensorHealthInf3* result, double TIMEOUT = -1 );
	/*XYZ傳感器健康度*/
/*健康度資訊*/

/*姿態資訊獲取介面*/
	//獲取解算系統狀態
	MS_Status get_Attitude_MSStatus();

	//獲取用于控制的濾波后的角速度
	bool get_AngularRate_Ctrl( vector3<double>* result, double TIMEOUT = -1 );
	//獲取姿態四元數
	bool get_Attitude_quat( Quaternion* result, double TIMEOUT = -1 );	
	//獲取機體四元數(偏航不對準)
	bool get_Airframe_quat( Quaternion* result, double TIMEOUT = -1 );
	//獲取機體四元數(偏航對準)
	bool get_AirframeY_quat( Quaternion* result, double TIMEOUT = -1  );
	//獲取歷史四元數
	bool get_history_AttitudeQuat( Quaternion* result, double t, double TIMEOUT = -1 );
	//獲取歷史機體四元數(偏航不對準)
	bool get_history_AirframeQuat( Quaternion* result, double t, double TIMEOUT = -1 );
	//獲取歷史機體四元數(偏航對準)
	bool get_history_AirframeQuatY( Quaternion* result, double t, double TIMEOUT = -1 );
/*姿態資訊獲取介面*/

/*位置資訊獲取介面*/
	//獲取解算系統狀態
	MS_Status get_Altitude_MSStatus();
	MS_Status get_Position_MSStatus();
	
	//獲取實時位置
	bool get_Position( vector3<double>* result, double TIMEOUT = -1 );
	//獲取實時速度(東北天方向)
	bool get_VelocityENU( vector3<double>* result, double TIMEOUT = -1 );
	//獲取實時地理系加速度(東北天)
	bool get_AccelerationENU( vector3<double>* result, double TIMEOUT = -1 );
	//獲取用于控制的濾波后的地理系加速度
	bool get_AccelerationENU_Ctrl( vector3<double>* result, double TIMEOUT = -1 );
	bool get_VelocityENU_Ctrl( vector3<double>* result, double TIMEOUT = -1 );
	bool get_Position_Ctrl( vector3<double>* result, double TIMEOUT = -1 );
	//獲取低通濾波后的未補償(零偏靈敏度溫度)的陀螺加速度資料
	bool get_AccelerationNC_filted( vector3<double>* vec, double TIMEOUT = -1 );
	bool get_AngularRateNC_filted( vector3<double>* vec, double TIMEOUT = -1 );
/*位置資訊獲取介面*/

/*電池資訊介面*/
	struct BatteryCfg
	{
		//標準電壓(V)
		float STVoltage[2];
		//電壓測量增益(V)
		float VoltMKp[2];
		//電流測量增益(A)
		float CurrentMKp[2];
		//容量(W*h)
		float Capacity[2];
		//功率電壓點0(0%電量時相對標準電壓的電壓差,此序列必須遞增)
		float VoltP0[2];
		//功率電壓點1(10%電量時相對標準電壓的電壓差,此序列必須遞增)
		float VoltP1[2];
		//功率電壓點2(20%電量時相對標準電壓的電壓差,此序列必須遞增)
		float VoltP2[2];
		//功率電壓點3(30%電量時相對標準電壓的電壓差,此序列必須遞增)
		float VoltP3[2];
		//功率電壓點4(40%電量時相對標準電壓的電壓差,此序列必須遞增)
		float VoltP4[2];
		//功率電壓點5(50%電量時相對標準電壓的電壓差,此序列必須遞增)
		float VoltP5[2];
		//功率電壓點6(60%電量時相對標準電壓的電壓差,此序列必須遞增)
		float VoltP6[2];
		//功率電壓點7(70%電量時相對標準電壓的電壓差,此序列必須遞增)
		float VoltP7[2];
		//功率電壓點8(80%電量時相對標準電壓的電壓差,此序列必須遞增)
		float VoltP8[2];
		//功率電壓點9(90%電量時相對標準電壓的電壓差,此序列必須遞增)
		float VoltP9[2];
		//功率電壓點10(100%電量時相對標準電壓的電壓差,此序列必須遞增)
		float VoltP10[2];
	}__PACKED;
	
	//電壓
	float get_MainBatteryVoltage();
	//濾波電壓(V)
	float get_MainBatteryVoltage_filted();
	//總使用功耗(W*h)
	float get_MainBatteryPowerUsage();
	//濾波功率(W)
	float get_MainBatteryPower_filted();
	//電池電流(A)
	float get_MainBatteryCurrent();
	//CPU溫度(℃)
	float get_CPUTemerature();
	//獲取電池資訊
	void get_MainBatteryInf( float* Volt, float* Current, float* PowerUsage, float* Power_filted, float* RMPercent );
/*電池資訊介面*/

說實話我想找一個真開源的飛控,來做SLAM實驗,我想起有一個是真開源的,匿名是真開源的,

github上的ACfly似乎開源了這部分,可能放的早期的版本,這還是讓我自己有一定折騰的可能性,不對,里面也有兩個Lib檔案,實際也是沒有開源,

https://github.com/weihli/ACFly-Prophet/tree/master/MeasurementSystem

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/151832.html

標籤:其他

上一篇:解決IAR for msp430的工程檔案報xxx.sfr檔案有問題的warning

下一篇:.NET 是資訊技術應用創新產業重要參與者

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more