test
Dependencies: mbed ros_lib_kinetic nhk19mr2_can_info splitData SerialHalfDuplex_HM
Walk/Walk.h
- Committer:
- shimizuta
- Date:
- 2019-02-27
- Revision:
- 27:79b4b932a6dd
- Parent:
- 22:787a764271dd
- Child:
- 29:7d8b8011a88d
File content as of revision 27:79b4b932a6dd:
#ifndef INCLUDED_WALK_H #define INCLUDED_WALK_H #include "OneLeg.h" enum EllipseParams { STRIDE_M, HEIGHT_M, GROUND_M, ELLIPSE_CENTER_X_M, ELLIPSE_CENTER_Y_M, }; class EllipseOrbit { float stride_m_; float height_m_; //足の上げ幅 float ellipsecenter_y_m_; //楕円軌道の中心高さ float ellipsecenter_x_m_; //楕円軌道の中心x座標 float ground_m_; //地面の高さ int StrideLine_(OneLeg &leg, float phasetime_s); //着地している間の軌道 int StrideLineAccel_(OneLeg &leg, float phasetime_s); //着地中に慣性力を考慮して加減速 int RiseEllipse_(OneLeg &leg, float phasetime_s); //空中を楕円軌道の半分の軌道で動く int RiseEllipse2_(OneLeg &leg, float phasetime_s); //空中を楕円軌道の一部欠けの形で動く public: int GetOrbit(OneLeg &leg, float phasetime_s); //paramセット用。普段はこれを使う void SetParam(float stridetime_s, float risetime_s, float stride_m, float height_m, float ground_m, float ellipsecenter_x_m, float ellipsecenter_y_m); // ひとつのparamだけ変更 void ChangeOneParam(EllipseParams param, float val); float GetOneWalkTime(); //足一周の時間 float stridetime_s_; float risetime_s_; }; struct LineParam { float time_s; //次の点に到達するまでにかける時間 float x_m; float y_m; }; class FreeLineOrbit { LineParam lineparams_[10]; //pointの数はmax10としている。多めにとっているだけ。 int point_num_; //pointの数 public: void SetFreeLinesParam(LineParam lineparams[], int point_num); //任意の直線の軌道を設定 int GetOrbit(OneLeg &leg, float phasetime_s); float GetOneWalkTime(); //足一周の時間 //Standupのparam設定 void SetStandParam(float x_m, float y_m, float time_s); }; enum OrbitPattern { ELLIPSE, FREELINES, }; //足の軌道を設定するクラスの皮。全ての軌道クラスを継承して一つにまとめる。patternで使い分ける class Orbit : public EllipseOrbit, public FreeLineOrbit { OrbitPattern pattern_; public: Orbit(){}; //ただ宣言する用 Orbit(OrbitPattern pattern); float GetOneWalkTime(); //足一周の時間 int GetOrbit(OneLeg &leg, float phasetime_s); //legに目標x,yを代入 }; class Walk { Orbit orbit_[4]; float offset_multi_[4]; public: Walk(); static float calctime_s_; //計算周期 float phasetime_s_[4]; //参照渡しされたonelegそれぞれにorbit_::GetOrbit関数を代入 //GetOrbit関数にて軌道, 時間をもとに位置を決める //直接参照しているのはこの関数だけ void Cal4LegsPosi(OneLeg leg[4]); //足一周の時間 float GetOneWalkTime(); //位相ずれの程度(値域[0,1])を入れる。 void SetOffset(float offset_multi0, float offset_multi1, float offset_multi2, float offset_multi3); //軌道がリンク定義外になっていないかチェック。reutn 0:ok 1:out // またoffsetの設定はここで行うので必ず呼び出す。 int CheckOrbit(OneLeg templateleg); //一つの足の軌道を設定.軌道の代入にはこの関数を必ず通るようにする。 void SetOneOrbit(int legnum, Orbit orbit); //全足の軌道を一括で設定. void SetAllOrbit(Orbit orbit); void ChangeOneParam(int legnum, EllipseParams param, float val); //standのparamを4足一括で設定できる void SetAllLegStandParam(float x_m, float y_m, float time_s); //ellipseのparamを4足一括で設定できる void SetAllLegEllipseParam(float stridetime_s, float risetime_s, float stride_m, float height_m, float ground_m, float ellipsecenter_x_m, float ellipsecenter_y_m); }; #endif