Exemple #1
0
int main(void) {
	struct position * pos;
	uint16_t i;

	for(i = 0; i < 64*30; i ++)
	//for(;;)
	{
		prepare_data(0,0,0,-1,-2,-3);
		pos = IMU_update();
		if(pos != 0)
			printf("yaw:%0.2f,roll:%0.2f,pitch:%0.2f\r\n",pos->yaw,pos->roll,pos->pitch); /* prints !!!Hello World!!! */
		//printf("!!!Hello World!!! "); /* prints !!!Hello World!!! */
	}

	return EXIT_SUCCESS;
}
Exemple #2
0
void AHRS_Attitude()
{
	u8 i;
	int tempval1 = 0,tempval2 = 0,tempval3 = 0;
//	float sin2x,sin2y,abs_Roll_Last,abs_Pitch_Last;
	static u8 filpoint = 0;			//滤波器指针

										//非DMP数据处理
//---陀螺仪----------------------------------------------------------------------------------------------------
	GYRO_Raw.X = gyro[0]-GYRO_OFFSET.X;						//陀螺仪原始数据
	GYRO_Raw.Y = gyro[1]-GYRO_OFFSET.Y;
	GYRO_Raw.Z = gyro[2]-GYRO_OFFSET.Z;
	
	if(GYRO_Raw.X<(-5000)||GYRO_Raw.X>(5000)) GYRO_Raw.X = GYRO_Last.X; //如果读数有误,则使用原来值
	if(GYRO_Raw.Y<(-5000)||GYRO_Raw.Y>(5000)) GYRO_Raw.Y = GYRO_Last.Y; 
	if(GYRO_Raw.Z<(-5000)||GYRO_Raw.Z>(5000)) GYRO_Raw.Z = GYRO_Last.Z; 
	
	GYRO_Last.X = GYRO_Raw.X;
	GYRO_Last.Y = GYRO_Raw.Y;
	GYRO_Last.Z = GYRO_Raw.Z;	

//---加速度----------------------------------------------------------------------------------------------------
	ACC_Raw.X = accel[0]-ACC_OFFSET.X;			//陀螺仪原始数据
	ACC_Raw.Y = accel[1]-ACC_OFFSET.Y;
	ACC_Raw.Z = accel[2];//-ACC_OFFSET.Z;			//

	FiltArray_AX[filpoint] = (int)ACC_Raw.X;	//每采集一个,放入队列中
	FiltArray_AY[filpoint] = (int)ACC_Raw.Y;
	FiltArray_AZ[filpoint] = (int)ACC_Raw.Z;

	for(i=0;i<FILTERZISE_ACC;i++)
	{
		tempval1 += FiltArray_AX[i];
		tempval2 += FiltArray_AY[i];
		tempval3 += FiltArray_AZ[i];
	}
	ACC_Last.X = tempval1/FILTERZISE_ACC;
	ACC_Last.Y = tempval2/FILTERZISE_ACC;
	ACC_Last.Z = tempval3/FILTERZISE_ACC;			//求和求平均
	filpoint++;
	if(filpoint==FILTERZISE_ACC) filpoint=0;

//---磁阻------------------------------------------------------------------------------------------------------------
	magtmp.hx = -hmc5883l.hx;									//进行符号和数据类型转换
	magtmp.hy = -hmc5883l.hy;									//磁阻传感器的的坐标系X,Y刚好与机体坐标系相反
	magtmp.hz = hmc5883l.hz;
	
//---四元数刷新姿态----------------------------------------------------------------------------------------------	
	IMU_update(GYRO_Last.X*Gyro_Gr,GYRO_Last.Y*Gyro_Gr,GYRO_Last.Z*Gyro_Gr,
				ACC_Last.X,ACC_Last.Y,ACC_Last.Z);
	
//	AHRS_update(GYRO_Last.X*Gyro_Gr,GYRO_Last.Y*Gyro_Gr,GYRO_Last.Z*Gyro_Gr,
//						 ACC_Last.X,ACC_Last.Y,ACC_Last.Z,magtmp.hx,magtmp.hy,magtmp.hz);
	
	//---横滚、俯仰角度----------------------------------------------------------------------------------------------	
	/*
	// roll这里Roll和Pitch有些书上说的正好相反	这里理清:ACC_X对应Roll 
	*/	
	Roll_Raw_Rad  = asin(-2 * Quat.Q1 * Quat.Q3 + 2 * Quat.Q0* Quat.Q2); 
	Pitch_Raw_Rad = atan2(2 * Quat.Q2 * Quat.Q3 + 2 * Quat.Q0 * Quat.Q1, -2 * Quat.Q1 * Quat.Q1 - 2 * Quat.Q2* Quat.Q2 + 1); // ptich
//	Yaw_Raw_Rad   = atan2(2 * Quat.Q1 * Quat.Q2 + 2 * Quat.Q0 * Quat.Q3, -2 * Quat.Q2*Quat.Q2 - 2 * Quat.Q3* Quat.Q3 + 1);

//--更新相关三角函数值-------------------------------------------------------
	CosPitch = cos(Pitch_Raw_Rad);
	SinPitch = sin(Pitch_Raw_Rad);
	CosRoll = cos(Roll_Raw_Rad);
	SinRoll = sin(Roll_Raw_Rad);

	Yaw_Raw_Rad = Mag_Yaw_Cal(&Magdecp);							//单位弧度
	
	Yaw_Raw		= Yaw_Raw_Rad*57.3f;
	Roll_Raw	= Roll_Raw_Rad*57.3f;
	Pitch_Raw	= Pitch_Raw_Rad*57.3f;
	

	if(Roll_Raw<=(-180)||Roll_Raw>=(180))	Roll_Raw = Roll_Last; 
	if(Pitch_Raw<=(-180)||Pitch_Raw>=(180))	Pitch_Raw = Pitch_Last; 
	
	Roll_Last = Roll_Raw;
	Pitch_Last = Pitch_Raw; 
	Yaw_Last = Yaw_Raw;
	
	Control_proc_att.roll = Roll_Last;
	Control_proc_att.pitch= Pitch_Last;
	
	AHRS_SpeedUpdate();
}