test
Dependencies: mbed ros_lib_kinetic nhk19mr2_can_info splitData SerialHalfDuplex_HM
Diff: Walk/Walk.cpp
- Revision:
- 21:61971fc18b90
- Parent:
- 19:1adc7302cfd9
- Child:
- 22:787a764271dd
diff -r 70cc6083e9c7 -r 61971fc18b90 Walk/Walk.cpp --- a/Walk/Walk.cpp Fri Feb 15 06:46:39 2019 +0000 +++ b/Walk/Walk.cpp Sat Feb 16 05:00:19 2019 +0000 @@ -3,45 +3,57 @@ #include "pi.h" //Orbitは足毎の軌道をあらわす。 -Orbit::Orbit(OrbitPattern orbitType) -{ - orbitType_ = orbitType; -} - -void Orbit::SetStraightParam(float stridetime_s, float risetime_s, float stride_m, float height_m, float offset_x_m, float offset_y_m) +void Orbit::SetStraightParam(float stridetime_s, float risetime_s, + float stride_m, float height_m, float ground_m, + float ellipse_center_x_m, float ellipse_center_y_m) { stridetime_s_ = stridetime_s; risetime_s_ = risetime_s; stride_m_ = stride_m; height_m_ = height_m; - offset_x_m_ = offset_x_m; - offset_y_m_ = offset_y_m; + ground_m_ = ground_m; + ellipse_center_x_m_ = ellipse_center_x_m; + ellipse_center_y_m_ = ellipse_center_y_m; } -void Orbit::SetStandParam(float offset_y_m) +void Orbit::SetStandParam(float ground_m) { stridetime_s_ = 1; risetime_s_ = 0; stride_m_ = 0; height_m_ = 0; - offset_x_m_ = 0; - offset_y_m_ = offset_y_m; + ground_m_ = ground_m; + ellipse_center_x_m_ = 0; + ellipse_center_y_m_ = ground_m; } //着地中の動き.直線軌道.等速 OneLeg Orbit::StrideLine_(OneLeg leg, float phasetime_s) { - float x_m = -stride_m_ * phasetime_s / stridetime_s_ + stride_m_ * 0.5 + offset_x_m_; - float y_m = offset_y_m_; + float x_m = -stride_m_ * phasetime_s / stridetime_s_ + stride_m_ * 0.5 + ellipse_center_x_m_; + float y_m = ellipse_center_y_m_; leg.SetXY_m(x_m, y_m); return leg; } -//空中の動き.楕円軌道 +//空中の動き.半分にきれいに切れる楕円軌道 OneLeg Orbit::RiseEllipse_(OneLeg leg, float phasetime_s) { float rad = M_PI * (phasetime_s - stridetime_s_) / risetime_s_ + M_PI; - float x_m = stride_m_ * 0.5 * cos(rad) + offset_x_m_; - float y_m = height_m_ * sin(rad) + offset_y_m_; + float x_m = stride_m_ * 0.5 * cos(rad) + ellipse_center_x_m_; + float y_m = height_m_ * sin(rad) + ellipse_center_y_m_; + leg.SetXY_m(x_m, y_m); + return leg; +} + +//空中の動き.完全に半分には切れない楕円軌道 +OneLeg Orbit::RiseEllipse2_(OneLeg leg, float phasetime_s) +{ + ///////////x,yを計算.注:計算は正しくないので直す必要がある。 + float rad = M_PI * (phasetime_s - stridetime_s_) / risetime_s_ + M_PI; + float x_m = stride_m_ * 0.5 * cos(rad) + ellipse_center_x_m_; + float y_m = height_m_ * sin(rad) + ellipse_center_y_m_; + /////////// + //x,yを代入 leg.SetXY_m(x_m, y_m); return leg; }