STM32は水中クワッドローター(5)カスタムナビゲーションデータを実現します

1.はじめに

これは特別なエキストラとして数えられます。他の章を書くときに多くのカスタムデータ型を回避できないというだけなので、私は別の章を書くだけです。

データ型(正確には構造)をカスタマイズする理由は、一方では物理的な意味を持ち、他方ではプログラミングが非常に簡単で、コードの可読性が大幅に向上するためです。 (C ++オブジェクトとして理解できます)。水中クワッドローター(エアクワッドローターを含む)には、ナビゲーションプロセス中に処理される大量のデータがあり、それらが個別の変数として個別に定義されていると、非常に複雑になります。したがって、物理的な意味と機能に応じて、さまざまな種類のデータ(構造)として定義されます。物理的な意味と機能が類似しているデータが構造のメンバーとして使用されます。新しいデータは、構造にメンバーを追加するだけで済みます。開発効率が大幅に向上します。

この一連のブログ投稿の開発プロセスでは、Punctual Atomのオープンソースの小さな4軸のソースコードを参照します。特に、この記事のデータ型定義の部分では、内部の名前を使用しています。ここで説明し、感謝の気持ちを表したいと思います(本当に宝物売り手~~~)。

2.航海データ型の宣言と定義

1.システムパラメータ

システムパラメータには、調整が必要なすべてのデータ、主にpidパラメータが含まれます

pid.hおよびpid.cファイルを作成します。

システム設定に関連する構造タイプは、pid.hで次のように定義されています。ネストのレイヤーの後、最後にconfigParam_t構造を使用するだけでよいことがわかります。これには、固定深度ナビゲーション中のスロットルの参照値を含む、実行中のロボットのすべてのPIDデータが含まれます(これについては後で説明します)。

#ifndef __PID_H
#define __PID_H
#include "sys.h"
#include "stdbool.h"

typedef struct
{
    
    
	float kp;
	float ki;
	float kd;
} pidInit_t;

typedef struct
{
    
    
	pidInit_t roll;
	pidInit_t pitch;
	pidInit_t yaw;
} pidParam_t;

typedef struct
{
    
    
	pidInit_t vx;
	pidInit_t vy;
	pidInit_t vz;
} pidParamPos_t;

typedef struct
{
    
    
	pidParam_t pidAngle;  /*角度PID*/
	pidParam_t pidRate;	  /*角速度PID*/
	pidParamPos_t pidPos; /*位置PID*/
	float thrustBase;		  /*油门基础值*/
	u8 cksum;
} configParam_t;

extern configParam_t configParam;
extern configParam_t configParamDefault;

#endif /* __PID_H */

構造変数はpid.cファイルで定義されています。タイプconfigParam_tの2つのデータが定義されています。configParamは初期化されていません。後でホストコンピューターを介してパラメーターを変更するのは、この変数に依存します。configParamDefaultが初期化されます。これがデフォルトのパラメータです。将来パラメータを調整した後、ここで更新して、デフォルトのパラメータとしてフラッシュに書き込むことができます。

#include "pid.h"

configParam_t configParam;
configParam_t configParamDefault =
{
    
    
	.pidAngle=	/*角度PID*/
	{
    
    	
		.roll=
		{
    
    
			.kp=3.0,
			.ki=0.0,
			.kd=0.0,
		},
		.pitch=
		{
    
    
			.kp=3.0,
			.ki=0.0,
			.kd=0.0,
		},
		.yaw=
		{
    
    
			.kp=3.0,
			.ki=0.0,
			.kd=0.0,
		},
	},	
	.pidRate=	/*角速度PID*/
	{
    
    	
		.roll=
		{
    
    
			.kp=30.0,
			.ki=0.2,
			.kd=0.0,
		},
		.pitch=
		{
    
    
			.kp=30.0,
			.ki=0.2,
			.kd=0.0,
		},
		.yaw=
		{
    
    
			.kp=30.0,
			.ki=0.2,
			.kd=0.0,
		},
	},	
	.pidPos=	/*位置PID*/
	{
    
    	
		.vx=
		{
    
    
			.kp=0.0,
			.ki=0.0,
			.kd=0.0,
		},
		.vy=
		{
    
    
			.kp=0.0,
			.ki=0.0,
			.kd=0.0,
		},
		.vz=
		{
    
    
			.kp=35.0,
			.ki=0.1,
			.kd=0.0,
		},
	},
	.thrustBase = -2000.0,
};

もちろん、pid.cとpid.hにも重要な機能であるPID計算があります。当面は省略します。関連するコンテンツはPIDの章で後ほど追加します。

2.ステータスパラメータ

状態パラメータには、ロボットが取得したセンサー情報とロボットの実際の状態が含まれます。

スタビライザー.hファイルとスタビライザー.cファイルを作成し、次のコンテンツをスタビライザー.hに追加します。

#ifndef __STABILIZER_TYPES_H
#define __STABILIZER_TYPES_H
#include "sys.h"

#if defined(__CC_ARM)
	#pragma anon_unions
#endif

struct vec3_s
{
    
    
	float x;
	float y;
	float z;
};

typedef struct vec3_s positon_t;
typedef struct vec3_s velocity_t;
typedef struct vec3_s acc_t;

//姿态集
typedef struct
{
    
    
	float roll;
	float pitch;
	float yaw;
} attitude_t;

typedef struct
{
    
    
	Axis3f acc;
	Axis3f gyro;
	Axis3f mag;
	positon_t position;  
	float height;
	float depth;  
	float voltage;
	float current;
	float water_temp;
	float water_press;
	float air_press_robot;		// 这个值是 机器人 舱内的压力
	float imu_temp;
} sensorData_t;

typedef struct
{
    
    
	attitude_t realAngle;
	positon_t position;
	velocity_t velocity;
	acc_t acc;
	attitude_t realRate;
	float realDepth;
	float preDepth;
} state_t;

typedef struct
{
    
    
	attitude_t expectedAngle;
	positon_t position;
	velocity_t velocity;
	attitude_t expectedRate;
	float expectedDepth;
	float thrust;
	bool isAltHold;
} setstate_t;

// 控制量,速度环输出
typedef struct
{
    
    
	s16 roll;
	s16 pitch;
	s16 yaw;
	float thrust;			// 油门值 针对四轴
	float forward_thrust;
	float hightOut;
	float depthOut;
	bool isLandMode;
	bool preMode;
} control_t;  

// 四个电机的油门值
typedef struct 
{
    
    
	u16 m1;
	u16 m2;
	u16 m3;
	u16 m4;
}motorPWM_t;

3.制御パラメータ

制御パラメータは、リモコンと上位コンピュータで設定したロボットの目標位置とモードを含む設定量と、各ループpidで計算した制御量です。

命名から理解しやすいです。sensorData_tはすべてのセンサーのデータ(元のデータから計算およびフィルタリングされたもの)、state_tは姿勢角、位置、速度などを含むロボットの現在の状態です。setstate_tが望ましいです。ロボットの姿勢角、位置、速度などを含むロボットの状態、および固定深度モードであるかどうかなどのスロットル。control_tは、PIDによって計算される制御量であり、モーターに直接作用してモーターの動きを制御します。ブラシレスモーターを制御するには、最終的な制御量をPWM値に変換する必要があるため、motorPWM_tも制御量です。

スタビライザー.cは非常に単純です。つまり、対応する構造変数を定義します。

#include "stabilizer.h"

control_t control = {
    
    0};
setstate_t setstate = {
    
    0};
state_t state = {
    
    0};
sensorData_t sensorData = {
    
    0};

motorPWM_t motorPWM = {
    
    0};
motorPWM_t motorPWMSet = {
    
    0, 0, 0, 0};

この章の終わり。

おすすめ

転載: blog.csdn.net/qq_30267617/article/details/114334117