test

Dependencies:   mbed ros_lib_kinetic nhk19mr2_can_info splitData SerialHalfDuplex_HM

Revision:
19:1adc7302cfd9
Parent:
18:0033ef1814ba
Child:
20:70cc6083e9c7
--- a/main.cpp	Thu Feb 14 09:04:25 2019 +0000
+++ b/main.cpp	Fri Feb 15 03:46:52 2019 +0000
@@ -8,13 +8,13 @@
 #include "can.h"
 #include "OneLeg.h" ///足先の座標を保存するクラス。x,yやサーボの角度の保存、サーボの駆動も行う。他の足を考慮した処理は別のクラスに任せる。
 #include "Walk.h"   //歩き方に関するファイル
-#define USE_CAN//can通信するならdefine.しないなら切らないとエラー出る
+#define USE_CAN     //can通信するならdefine.しないなら切らないとエラー出る
 
 ////////////調整すべきパラメータ.全てここに集めた。
-const float kCycleTime_s = 0.03f;              //計算周期
-const float kBetweenServoHalf_m = 0.03f * 0.5; //サーボ間の距離の半分
-const float kLegLength1 = 0.1f;
-const float kLegLength2 = 0.2452f+0.0025f;//0.22529+0.0025
+const float kCycleTime_s = 0.03;              //計算周期
+const float kBetweenServoHalf_m = 0.03 * 0.5; //サーボ間の距離の半分
+float kLegLength1[2] = {0.1, 0.1};
+float kLegLength2[2] = {0.2452 + 0.0025, 0.22529 + 0.0025};
 //サーボの設定
 const int kServoSpan_ms = 10; //サーボの送信間隔
 const double kServoValToDegree = 270.0 / (11500 - 3500);
@@ -26,7 +26,7 @@
                               {
                                   -1,
                                   1,
-                              }}; 
+                              }};
 //欲しい座標系0度でのサーボのICSマネージャーの値
 const double kOriginDegree[2][2] = {
     {
@@ -34,8 +34,8 @@
         (6600 - 3500) * kServoValToDegree + 180,
     },
     {
-        (7523 - 3500) * kServoValToDegree ,
-        (6657 - 3500) * kServoValToDegree-180,//180度の時6657シータ負の方向に動かすと値は減る
+        (7523 - 3500) * kServoValToDegree,
+        (6657 - 3500) * kServoValToDegree - 180, //180度の時6657シータ負の方向に動かすと値は減るので、0度の位置は-180すれば出る
     },
 };
 ///////////////
@@ -51,80 +51,75 @@
     OneLeg(kBetweenServoHalf_m, kLegLength1, kLegLength2),
     OneLeg(kBetweenServoHalf_m, kLegLength1, kLegLength2),
 };
-DigitalOut led[4] = {DigitalOut(LED1),DigitalOut(LED2),DigitalOut(LED3),DigitalOut(LED4)};
+DigitalOut led[4] = {DigitalOut(LED1), DigitalOut(LED2), DigitalOut(LED3), DigitalOut(LED4)};
 
 const float kRadToDegree = 180.0 / M_PI;
 void Move(Walk WalkWay, OneLeg (&leg)[4], float dist_m);
 void MoveServo(OneLeg leg, int legnum, int servo_id);
-
-int IsArrived(int count, int finish){
-    if(count > finish)
+int IsArrived(int count, int finish)
+{
+    if (count > finish)
         return 1;
     else
         return 0;
 }
-
 int main()
 {
     printf("When you push any key, this robot starts.\r\n");
     while (pc.readable() == 0) //キーボード押したらスタート
         ;
-    printf("stand up. 1 sec stand\r\n");
-    
-    //stand時の足の軌道設定
-    Orbit stand_orbits[4];
-    Orbit temp_orbit(ELLIPSE);
-    float stand_stridetime_s = 1, stand_risetime_s = 0, stand_stride_m = 0, stand_height_m = 0.05f, stand_ground_m = 0.25f;
-    temp_orbit.SetStraightParam(stand_stridetime_s, stand_risetime_s, stand_stride_m, stand_height_m, stand_ground_m);
-    for (int i = 0; i < 4; i++)
-        stand_orbits[i] = temp_orbit;
-    
+    printf("stand up for 1 s\r\n");
+
+    //stand時の足の軌道設定.
+    Orbit stand_orbit[4];
+    float stand_offset_y_m = 0.2;
+    stand_orbit[0].SetStandParam(stand_offset_y_m);
+    for (int i = 0; i < 4; i++) //全部足を同じにしてる
+        stand_orbit[i] = stand_orbit[0];
     //4足の位相ずれOffsetTime_sをまとめる
     float stand_offset_time_s[4] = {
         0,
-        stand_orbits[0].GetOneWalkTime() * 0.5,
-        stand_orbits[0].GetOneWalkTime() * 0,
-        stand_orbits[0].GetOneWalkTime() * 0.5,};
+        stand_orbit[0].GetOneWalkTime() * 0.5,
+        stand_orbit[0].GetOneWalkTime() * 0,
+        stand_orbit[0].GetOneWalkTime() * 0.5,
+    };
     //4つの足のorbit, 位相を代入してstraightという歩行パターンを作成している
     //このインスタンスはlegそれぞれの計算を行う役割を担う
-    //orbitはここでしか使わないあくまで鍵のような扱い
-    Walk stand(stand_orbits, stand_offset_time_s, kCycleTime_s);
-    //収束判定用関数。現在は回すループの数
-    float dist_m = 10;
-    //Walkの指示通りに動作
+    //orbitはここでしか使わないあくまでパラメータ設定用クラス
+    Walk stand(stand_orbit, stand_offset_time_s, kCycleTime_s);
+    float dist_m = 10; //収束判定用。現在は回すループの数
+    //動作開始
     Move(stand, leg, dist_m);
-    
     wait(1);
-     DEBUG("move start\r\n");
-    //各足の軌道の設定.今回は全部同じにすることで直線を描く。
-    //直進したパラメータstridetime_s = 0.5, risetime_s = 0.3, stride_m = 0.12f, height_m = 0.03f, ground_m = 0.16f;
-    float stridetime_s = 3, risetime_s = 0.3, stride_m = 0.10f, height_m = 0.1f, ground_m = stand_ground_m;
+
+    DEBUG("move start\r\n");
+    //取り敢えず歩行したパラメータ
+    //stridetime_s = 0.5, risetime_s = 0.3,stride_m= 0.12f, height_m = 0.03f, offset_x_m  = 0, offset_y_m = 0.16f;
+    //曲げてみる
+    float stridetime_s = 2, risetime_s = 0.5,
+          stride_r_m = 0.1, stride_l_m = 0.05, height_m = 0.03,
+          offset_x_m = -0.05, offset_y_m = stand_offset_y_m;
     //軌道の作成
     //代入用の軌道SetStraightParam関数を用いると真っ直ぐ進む前提となる
-    temp_orbit.SetStraightParam(stridetime_s, risetime_s, stride_m, height_m, ground_m);
-    Orbit straightOrbit[4];
-    straightOrbit[1] = temp_orbit;
-    straightOrbit[3]= temp_orbit;
-    //stride_m = 0.075f;
-    float offset_x_m = 0.1;
-    temp_orbit.SetStraightParam(stridetime_s, risetime_s, stride_m, height_m, ground_m, offset_x_m);
-    straightOrbit[0] = temp_orbit;
-    straightOrbit[2]= temp_orbit;
-    
+    Orbit orbit[4];
+    orbit[0].SetStraightParam(stridetime_s, risetime_s, stride_r_m, height_m, offset_x_m, offset_y_m);
+    orbit[1].SetStraightParam(stridetime_s, risetime_s, stride_r_m, height_m, 0, offset_y_m);
+    orbit[2].SetStraightParam(stridetime_s, risetime_s, stride_l_m, height_m, offset_x_m, offset_y_m);
+    orbit[3].SetStraightParam(stridetime_s, risetime_s, stride_l_m, height_m, 0, offset_y_m);
     //4足の軌道と位相ずれOffsetTime_sをまとめる
     float offset_time_s[4] = {
         0,
-        straightOrbit[0].GetOneWalkTime() * 0.25,
-        straightOrbit[0].GetOneWalkTime() * 0.5,
-        straightOrbit[0].GetOneWalkTime() * 0.75,
+        orbit[0].GetOneWalkTime() * 0.5,
+        orbit[0].GetOneWalkTime() * 0.5,
+        orbit[0].GetOneWalkTime() * 0,
     };
-    //4つの足のorbit, 位相を代入してstraightという歩行パターンを作成している
+    //4つの足のorbit, 位相を代入して歩行パターンを作成している
     //このインスタンスはlegそれぞれの計算を行う役割を担う
     //orbitはここでしか使わないあくまで鍵のような扱い
-    Walk straight2(straightOrbit, offset_time_s, kCycleTime_s);
-    //実際にWalkの指示通りに動かす
-    dist_m = 500;
-    Move(straight2, leg, dist_m);
+    Walk walk(orbit, offset_time_s, kCycleTime_s);
+    dist_m = 500000; //収束判定用。取り敢えず今はループ数。
+    //動く
+    Move(walk, leg, dist_m);
     DEBUG("program end\r\n");
 }
 
@@ -138,38 +133,38 @@
     while (is_arrived == 0)
     {
         float time_s = timer.read();
-        //注:未実装。到着したかの判定.LRFからのデータが必要?
+        //注:未実装。到着したかの判定.LRFからのデータが必要.今は取り敢えずループ回数で判断
         is_arrived = IsArrived(count, (int)dist_m);
         ++count;
         //4本の足それぞれの足先サーボ角度更新
         WalkWay.Cal4LegsPosi(leg);
-        #ifdef USE_CAN
+#ifdef USE_CAN
         //slave_mbed分の足の目標位置を送信
-        SendRad(leg[2],leg[3]);
-        #endif
+        SendRad(leg[2], leg[3]);
+#endif
         //自身が動かす足のサーボを動かす
         MoveServo(leg[0], 0, 0);
         MoveServo(leg[1], 1, 0);
         wait_ms(kServoSpan_ms);
         MoveServo(leg[0], 0, 1);
         MoveServo(leg[1], 1, 1);
-        DEBUG("%f, %f, %f, %f\r\n",leg[2].GetRad(0),leg[2].GetRad(1),leg[3].GetRad(0),leg[3].GetRad(1));
+        DEBUG("%f, %f, %f, %f\r\n", leg[2].GetRad(0), leg[2].GetRad(1), leg[3].GetRad(0), leg[3].GetRad(1));
         //計算周期がWalkWay.cycletime_s_になるようwait
         float rest_time_s = WalkWay.cycletime_s_ - (timer.read() - time_s);
         if (rest_time_s > 0)
             wait(rest_time_s);
-        else {//計算周期が達成できないときはDEBUGで知らせるだけ。動きはする。
-            printf("error: rest_time_s = %f in Move()\r\n", rest_time_s);
+        else
+        { //計算周期が達成できないときはDEBUGで知らせるだけ。動きはする。
+            DEBUG("error: rest_time_s = %f in Move()\r\n", rest_time_s);
             led[0] = 1;
         }
     }
 }
-
 void MoveServo(OneLeg leg, int serial_num, int servo_id)
 {
     float degree = leg.GetRad(servo_id) * kRadToDegree;
     //サーボの座標系に変更
     float servo_degree = kServoSign[serial_num][servo_id] * degree + kOriginDegree[serial_num][servo_id];
-    DEBUG("servo_degree[%d][%d],%f\r\n",serial_num,servo_id,servo_degree);
+    DEBUG("servo_degree[%d][%d],%f\r\n", serial_num, servo_id, servo_degree);
     servo[serial_num].set_degree(servo_id, servo_degree);
 }