test

Dependencies:   mbed ros_lib_kinetic nhk19mr2_can_info splitData SerialHalfDuplex_HM

Committer:
shimizuta
Date:
Mon Feb 11 13:32:46 2019 +0000
Revision:
12:2ac37fe6c3bb
Parent:
11:e81425872740
Child:
13:e7ecdb20665a
printf debug finish

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shimizuta 11:e81425872740 1 #include "Walk.h"
shimizuta 11:e81425872740 2 #include "math.h"
shimizuta 11:e81425872740 3 const float M_PI = 3.141592;
shimizuta 11:e81425872740 4 Orbit::Orbit(float stridetime_s, float risetime_s, float stride_m, float height_m, float ground_m)
shimizuta 11:e81425872740 5 {
shimizuta 11:e81425872740 6 stridetime_s_ = stridetime_s;
shimizuta 11:e81425872740 7 risetime_s_ = risetime_s;
shimizuta 11:e81425872740 8 stride_m_ = stride_m;
shimizuta 11:e81425872740 9 height_m_ = height_m;
shimizuta 11:e81425872740 10 ground_m_ = ground_m;
shimizuta 11:e81425872740 11 }
shimizuta 11:e81425872740 12 //着地中の動き.直線軌道.等速
shimizuta 11:e81425872740 13 OneLeg Orbit::StrideLine_(OneLeg leg, float phasetime_s)
shimizuta 11:e81425872740 14 {
shimizuta 11:e81425872740 15 float x_m = -stride_m_ * phasetime_s / stridetime_s_ + stride_m_ * 0.5;
shimizuta 11:e81425872740 16 float y_m = ground_m_;
shimizuta 11:e81425872740 17 leg.SetXY_m(x_m, y_m);
shimizuta 11:e81425872740 18 return leg;
shimizuta 11:e81425872740 19 }
shimizuta 11:e81425872740 20 //空中の動き.楕円軌道
shimizuta 11:e81425872740 21 OneLeg Orbit::RiseEllipse_(OneLeg leg, float phasetime_s)
shimizuta 11:e81425872740 22 {
shimizuta 12:2ac37fe6c3bb 23 float rad = M_PI * (phasetime_s -stridetime_s_)/ risetime_s_ + M_PI;
shimizuta 11:e81425872740 24 float x_m = stride_m_ * 0.5 * cos(rad);
shimizuta 11:e81425872740 25 float y_m = height_m_ * sin(rad) + ground_m_;
shimizuta 11:e81425872740 26 leg.SetXY_m(x_m, y_m);
shimizuta 11:e81425872740 27 return leg;
shimizuta 11:e81425872740 28 }
shimizuta 11:e81425872740 29 //楕円軌道
shimizuta 11:e81425872740 30 OneLeg Orbit::OrbitEllipse_(OneLeg leg, float phasetime_s)
shimizuta 11:e81425872740 31 {
shimizuta 11:e81425872740 32 if (phasetime_s < stridetime_s_)
shimizuta 11:e81425872740 33 return StrideLine_(leg, phasetime_s);
shimizuta 11:e81425872740 34 else
shimizuta 11:e81425872740 35 return RiseEllipse_(leg, phasetime_s);
shimizuta 11:e81425872740 36 }
shimizuta 11:e81425872740 37 //将来的には引数などで軌道の種類を変えて出力できるようにしたい。
shimizuta 11:e81425872740 38 OneLeg Orbit::GetOrbit(OneLeg leg, float phasetime_s)
shimizuta 11:e81425872740 39 {
shimizuta 11:e81425872740 40 return OrbitEllipse_(leg, phasetime_s);
shimizuta 11:e81425872740 41 }
shimizuta 11:e81425872740 42 float Orbit::GetOneWalkTime()
shimizuta 11:e81425872740 43 {
shimizuta 11:e81425872740 44 return stridetime_s_ + risetime_s_;
shimizuta 11:e81425872740 45 }
shimizuta 11:e81425872740 46
shimizuta 11:e81425872740 47 Walk::Walk(Orbit orbit[4], float offsettime_s[4], float cycletime_s)
shimizuta 11:e81425872740 48 {
shimizuta 11:e81425872740 49 for (int i = 0; i < 4; i++)
shimizuta 11:e81425872740 50 {
shimizuta 11:e81425872740 51 orbit_[i] = orbit[i];
shimizuta 11:e81425872740 52 offsettime_s_[i] = offsettime_s[i];
shimizuta 11:e81425872740 53 }
shimizuta 11:e81425872740 54 cycletime_s_ = cycletime_s;
shimizuta 11:e81425872740 55 }
shimizuta 11:e81425872740 56 void Walk::Cal4LegsPosi(OneLeg (&leg)[4])
shimizuta 11:e81425872740 57 {
shimizuta 11:e81425872740 58 phasetime_s_ += cycletime_s_;
shimizuta 11:e81425872740 59 for (int i = 0; i < 4; i++)
shimizuta 11:e81425872740 60 {
shimizuta 11:e81425872740 61 float phasetime_s = phasetime_s_ + offsettime_s_[i];
shimizuta 11:e81425872740 62 while (phasetime_s > orbit_[i].GetOneWalkTime())
shimizuta 11:e81425872740 63 phasetime_s -= orbit_[i].GetOneWalkTime();
shimizuta 11:e81425872740 64 leg[i] = orbit_[i].GetOrbit(leg[i], phasetime_s);
shimizuta 11:e81425872740 65 }
shimizuta 11:e81425872740 66 }