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};
この章の終わり。