test

Dependencies:   mbed ros_lib_kinetic nhk19mr2_can_info splitData SerialHalfDuplex_HM

Walk/Walk.h

Committer:
shimizuta
Date:
2019-03-01
Revision:
34:89d701e15cdf
Parent:
32:dc684a0b8448
Child:
35:b4e1b8f25cd7

File content as of revision 34:89d701e15cdf:

#ifndef INCLUDED_WALK_H
#define INCLUDED_WALK_H
#include "OneLeg.h"
enum LegNum //足とシリアルサーボの番号
{
  RIGHT_B,
  RIGHT_F,
  LEFT_B,
  LEFT_F,
};
enum TriangleParams
{
  OFFSET_X_M,
  OFFSET_Y_M,
  STRIDE_M,
  HEIGHT_M,
  BUFFER_HEIGHT_M,
};
//下記の論文を参照
//https://static1.squarespace.com/static/542ddec8e4b0158794bd1036/t/5a861d1cc83025f3d460dfc3/1518738728029/gait-design-optimization-Final.pdf
class TriangleOrbit
{
  float reverse_tanbeta_; //論文のβのtan
  float offset_x_m_;
  float offset_y_m_;
  float stride_m_;
  float height_m_;        //足上げ幅
  float buffer_height_m_; //着地直前で止める高さ
  float stridetime_s_;
  float toptime_s_;     //頂点に行くまでの時間
  float buffer_time_s_; //一時停止点から着地するまでの時間.

  float top_x_m_, top_y_m_, buffer_x_m_, buffer_y_m_;   //事前に計算して保存しておく
  int StrideLine_(OneLeg &leg, float phasetime_s);      //着地している間の軌道
  int StrideLineAccel_(OneLeg &leg, float phasetime_s); //着地中に慣性力を考慮して加減速

public:
void CalOtherParam();
  void SetTriangleParam(float offset_x_m, float offset_y_m, float stride_m, float height_m, float buffer_height_m,
                        float stridetime_s, float toptime_s, float buffer_time_s);
  int GetOrbit(OneLeg &leg, float phasetime_s);
  float GetOneWalkTime(); //足一周の時間
  void ChangeOneParam(TriangleParams param, float val);
};

struct LineParam
{
  float time_s; //x_m,y_mにいる時間
  float x_m;
  float y_m;
};
class FreeLineOrbit
{
  LineParam lineparams_[30]; //pointの数は多めにとっている。
  int point_num_;            //pointの数
public:
  void SetFreeLinesParam(LineParam lineparams[], int point_num); //任意の直線の軌道を設定
  int GetOrbit(OneLeg &leg, float phasetime_s);
  float GetOneWalkTime();                                 //足一周の時間
  void SetStandParam(float x_m, float y_m, float time_s); //Standupのparam設定
};
enum OrbitPattern
{
  TRIANGLE,
  FREELINES,
};
//足の軌道を設定するクラスの皮。全ての軌道クラスを継承して一つにまとめる。patternで使い分ける
//関数は継承元のものも使えるので、継承元のクラスも見てください
class Orbit : public TriangleOrbit, 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関数にて軌道, 時間をもとに位置を決める
  //直接参照しているのはこの関数だけ
  int Cal4LegsPosi(OneLeg leg[4]); //失敗したら1を返す。成功なら0
  //足一周の時間
  float GetOneWalkTime();
  //位相ずれの程度(値域[0,1])を入れる。
  void SetOffsetTime(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); //全足の軌道を一括で設定.
  //stand用
  void SetOneLegStandParam(int legnum, float x_m, float y_m, float time_s);
  void SetAllLegStandParam(float x_m, float y_m, float time_s); // 4足一括で設定できる
  //triangle
  void SetOneLegTriangleParam(int legnum, float offset_x_m, float offset_y_m, float stride_m, float height_m, float buffer_height_m,
                              float stridetime_s, float toptime_s, float buffer_time_s);
  void SetAllLegTriangleParam(float offset_x_m, float offset_y_m, float stride_m, float height_m, float buffer_height_m,
                              float stridetime_s, float toptime_s, float buffer_time_s);
  void ChangeOneParam(int legnum, TriangleParams param, float val);
  //freeline
  void SetOneLegFreeLinesParam(int legnum, LineParam lineparams[], int point_num);
  void SetAllLegFreeLinesParam(LineParam lineparams[], int point_num);
};

class OverCome
{
  float start_x_m_[4]; //足のスタートx
  float start_y_m_[4]; //足のスタートy
  float d_x_m_;        //目標地点までのx
  float goal_y_m_[4];  //目標地点までのy
  float height_m_[4];
  float gravity_dist_[4]; //重心ずらし距離
  float d_time_;          //各動きの時間
  float d_time_slow_;
  int next_point_;        //次のparamのindex
  LineParam legs_[4][30]; //多めに
  void Rise(int legnum);
  void Land(int legnum);
  void Forward(int legnum);
  void Step(int legnum);
  void GravityMove(int legnum);
  void StartPoint();
  void GoalPoint();
  void GetLine();

public:
  Walk walk;
  OverCome(float start_x_m[4], float start_y_m[4],
           float d_x_m, float goal_y_m[4], float height_m[4], float gravity_dist[4]);
};
#endif