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