四轴飞控总结2:结构体与数据类型

Union-Axis3i16-int16_t axis[3]- axis.x、axis.y、axis.z
      Axis3i32-int32_t axis[3]
      Axis3i64-int64_t axis[3]
      Axis3f-float axis[3]

  1. struct在实际问题中,一组数据往往具有不同的数据类型。struct关键字就可以将这些不同数据类型的数据打包成一种构造数据类型。这种构造类型由多个成员组成,每一个成员可以是一个基本数据类型或者另一个构造类型。一般情况下,结构体所占内存大小是其成员所占内存之和。
  2. union关键字用法与struct非常相似,但也有区别。struct中的所有数据成员是共存的,不管有没有调用,编译器都会分配内存;而union中的数据成员是互斥的,它只配置一个足够大的空间来容纳最大长度的数据成员。即union中所有数据成员共用一个空间,同一时间只能存储其中一个数据成员,所有数据成员具有相同起始地址。
//静态全局变量
static sensorData_t sensors;
static sensorData_t sensors1;
static Axis3i16	gyroRaw;
static Axis3i16	gyroRaw1;
static Axis3i16	accRaw;
static Axis3i16	accRaw1;
static Axis3i16 magRaw;


//数据类型
typedef union 
{
	struct
	{
		int16_t x;
		int16_t y;
		int16_t z;
	};
	int16_t axis[3];
} Axis3i16;

 Axis3i16是定义数据类型的,例如:int16_t   axis.x/y/z

typedef struct
{
	Axis3f     bias;
	bool       isBiasValueFound;
	bool       isBufferFilled;
	Axis3i16*  bufHead;
	Axis3i16   buffer[SENSORS_NBR_OF_BIAS_SAMPLES];
}BiasObj;

BiasObj	gyroBiasRunning;
BiasObj	gyroBiasRunning1;
static Axis3f  gyroBias;
static Axis3f  gyroBias1;

static bool gyroBiasFound = false;
static bool gyroBiasFound1 = false;
static float accScaleSum = 0;
static float accScale = 1;

static bool isInit = false;
static sensorData_t sensors;
static sensorData_t sensors1;
static Axis3i16	gyroRaw;
static Axis3i16	accRaw;
static Axis3i16	gyroRaw1;
static Axis3i16	accRaw1;
static Axis3i16 magRaw;

 BiasObj是定义数据类型的,例如, BiasObj中bias->isBiasValueFound

gyroBiasRunning->x                                         bias->isBufferFilled

gyroBiasRunning->y                                         bias->bufHead->x

gyroBiasRunning->z                                         bias->bufHead->y                                                                                                                                bias->bufHead->z

                                                                          bias->buffer[i].x
                                                                          bias->buffer[i].y
                                                                          bias->buffer[i].z

                                                                          bias->bias.x
                                                                          bias->bias.y 
                                                                          bias->bias.z 

 QUESTION:

//为什么不是如下输出?
state.attitude.pitch
state.attitude.roll
state.attitude.yaw

//而是
state->attitude.pitch
state->attitude.roll
state->attitude.yaw
//上位机获取的姿态
void getAttitudeData(attitude_t* get)
{
	get->pitch = -state.attitude.pitch;
	get->roll = state.attitude.roll;
	get->yaw = -state.attitude.yaw;
}

 

temp_pry[0]=state->attitude.pitch和state.attitude.pitch出来的值有什么不一样?

是否存在一个是MCU直接算出来的值(每加PID算出来的)

              一个是MCU出来再用PID算出来的姿态?

typedef struct
{
	attitude_t attitude;
	quaternion_t attitudeQuaternion;
	point_t position;
	velocity_t velocity;
	acc_t acc;
	bool isRCLocked;
} state_t;

//

typedef struct  
{
	u32 timestamp;	/*时间戳*/

	float roll;
	float pitch;
	float yaw;
} attitude_t;

//

箭头运算符“->” ,箭头运算获取指针指向对象的成员

箭头运算符作用一个指针的运算对象,结果为左值

表达式ptr->men等价于(*ptr).mem。

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
配件: 1、STC8A8K16S4A12 LQFP44做的1块。 2、MPU-6050三轴陀螺仪、三轴加速度传感器模块1块。MC6B遥、接收机1套。 3、F450玻纤四轴机架1套。 4、2212无刷电机4个(配香蕉插)。20A电调4个。T插插头1个。 5、9450正反桨2对(实际买多些,因为新手会有损耗)。3S锂电池4200mAH 1块(用户可以购买多块爽)。B6平衡充(带12V 5A电源)1套。 6、12号硅胶线红、黑色给20cm。魔术带(捆绑电池的)1条。3M双面胶(3*7cm,粘电调、用)2片。 7、扎丝或扎带若干(扎丝,因为可以方便的拧下来)。 本仅仅是姿态制,没有GPS、电子罗盘、气压高度计、超声波测距、光流传感器等等,不能实现定点悬停,但是行感觉非常好,稳定,特别是暴力行的刺激,是很多玩家所喜欢的。用户可以自行增加这些传感器,编写相关的程序,以获得更好的行性能。 本通过调整PID参数可以适应从250mm轴距到750mm 轴距的,都实际装机验证过,效果很好。 本例实用F450的四轴机架,大约40元,安装简单,入门快,让玩家可以快速的装配成功,如动手能力强可以自己买配件做机架,铝合金或碳纤维均可。我喜欢用铝合金方管,好加工,强度好,还很轻。 配套使用MC6B的遥、接收套件,左手油门(俗称“美国手”),大约130元,是我能找到的最便宜的遥器了,不差钱的玩家可以使用更昂贵的遥器套件。四轴实物照片如下图所示。 文件包含:程序+原理图+技术文档

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值