etrobocon2018 feat.KatLab  770af34cce41ae9c30c41303275e1add2daae0c3 (with uncommitted changes)
 全て クラス 名前空間 ファイル 関数 変数 列挙型 列挙値 フレンド マクロ定義 ページ
LeftNormalCourse.cpp
[詳解]
1 
7 #include "LeftNormalCourse.h"
8 
9 LeftNormalCourse::LeftNormalCourse() : isChangedEdge(false), time_count(0)
10 {
12  status = old_status = LeftStatus::STRAIGHT;
13 }
14 
15 bool LeftNormalCourse::runNormalCourse(int32_t countL, int32_t countR, int16_t light_value,
16  int16_t target_brightness)
17 {
18  switch(status) {
19  case LeftStatus::START:
20  lineTracerWalker.speedControl.setPid(1.2, 0.01, 0.12, 170.0);
21  lineTracerWalker.turnControl.setPid(2.0, 0.1, 0.1, target_brightness);
22  lineTracerWalker.runLine(countL, countR, light_value);
23  break;
24 
26  lineTracerWalker.speedControl.setPid(8.0, 1.0, 0.1, 200.0);
27  lineTracerWalker.turnControl.setPid(2.0, 1.0, 0.1, target_brightness);
28  lineTracerWalker.runLine(countL, countR, light_value);
29  break;
30 
32  lineTracerWalker.speedControl.setPid(3.5, 0.01, 0.12, 180.0);
33  lineTracerWalker.turnControl.setPid(2.0, 1.0, 0.1, target_brightness);
34  lineTracerWalker.runLine(countL, countR, light_value);
35  break;
36 
38  lineTracerWalker.speedControl.setPid(2.0, 0.5, 0.7, 180.0);
39  lineTracerWalker.turnControl.setPid(2.0, 0.01, 0.2, target_brightness);
40  lineTracerWalker.runLine(countL, countR, light_value);
41  break;
42 
44  lineTracerWalker.speedControl.setPid(2.0, 0.5, 0.6, 180.0);
45  lineTracerWalker.turnControl.setPid(4.2, 0.08, 0.4, target_brightness);
46  lineTracerWalker.runLine(countL, countR, light_value);
47  break;
48 
50  lineTracerWalker.speedControl.setPid(4.0, 0.8, 0.1, 150.0);
51  lineTracerWalker.turnControl.setPid(4.5, 0, 0.4, target_brightness);
52  lineTracerWalker.runLine(countL, countR, light_value);
53  break;
54 
56  lineTracerWalker.speedControl.setPid(8.0, 1.0, 0.1, 200.0);
57  lineTracerWalker.turnControl.setPid(1.0, 1.0, 0.2, target_brightness);
58  lineTracerWalker.runLine(countL, countR, light_value);
59  break;
60 
61  /*
62  case LeftStatus::STRAIGHT_SLOW:
63  lineTracerWalker.setForward(15);
64  lineTracerWalker.setTurn(-2);
65  lineTracerWalker.isLeftsideLine(false);
66  time_count++;
67  if(light_value > target_brightness && time_count > 125) isChangedEdge = true;
68  break;
69 
70  case LeftStatus::NEUTRAL:
71  lineTracerWalker.speedControl.setPid(4.0, 0.2, 0.08, 100.0);
72  lineTracerWalker.turnControl.setPid(2.0, 1.0, 0.048, target_brightness - 5.0);
73  lineTracerWalker.runLine(countL, countR, light_value);
74  break;
75 
76  case LeftStatus::CURVE_RIGHT:
77  lineTracerWalker.speedControl.setPid(4.0, 0.8, 0.08, 10.0);
78  lineTracerWalker.turnControl.setPid(4.0, 2.0, 0.1, target_brightness + 5.0);
79  // lineTracerWalker.turnControl.setPid ( 4.0, 2.0, 0.096, 40.0 );
80  lineTracerWalker.runLine(countL, countR, light_value);
81  break;
82 
83  case LeftStatus::STRAIGHT_THIRD:
84  lineTracerWalker.speedControl.setPid(8.0, 1.0, 0.1, 160.0);
85  lineTracerWalker.turnControl.setPid(2.0, 1.0, 0.1, target_brightness - 10);
86  lineTracerWalker.runLine(countL, countR, light_value);
87  break;
88 
89  case LeftStatus::START:
90  lineTracerWalker.speedControl.setPid(1.5, 0.01, 0.12, 170.0);
91  lineTracerWalker.turnControl.setPid(2.0, 0.1, 0.1, target_brightness);
92  lineTracerWalker.runLine(countL, countR, light_value);
93  break;*/
94 
95  case LeftStatus::STOP:
96  stop();
97  break;
98  default:
99  stop();
100  }
101  if(status == LeftStatus::STOP) return false;
102  return true;
103 }
104 
105 bool LeftNormalCourse::statusCheck(int32_t countL, int32_t countR)
106 {
107  std::int32_t distance_total = motor_angle.absoluteAngleMean(countL, countR);
108  old_status = status;
109  if(distance_total < 300)
110  status = LeftStatus::START;
111  else if(distance_total < 2850)
112  status = LeftStatus::STRAIGHT;
113  else if(distance_total < 6600)
114  status = LeftStatus::STRAIGHT;
115  else if(distance_total < 7400)
116  status = LeftStatus::EDGE_RESET;
117  else if(distance_total < 8150)
118  status = LeftStatus::STRAIGHT_SLOW;
119  else if(distance_total < 9000)
120  status = LeftStatus::CURVE_LEFT;
121  else if(distance_total < 11700)
122  status = LeftStatus::STRAIGHT;
123  else if(distance_total < 12900)
125  else
126  status = LeftStatus::STOP;
127 
128  if(isChangedEdge) {
129  status = LeftStatus::STOP;
130  }
131  if(old_status != status) return true;
132  return false;
133 }
134 
136 {
137  return (int)status;
138 }
void isLeftsideLine(bool b)
bool runNormalCourse(int32_t countL, int32_t countR, int16_t light_value, int16_t target_brightness)
bool statusCheck(int32_t countL, int32_t countR)
void setPid(double p_gain_, double i_gain_, double d_gain_, double target_)
Definition: Pid.cpp:40
void runLine(int32_t countL, int32_t countR, int16_t light_value)
LコースのNormalCourseの処理を行うクラス
float absoluteAngleMean(std::int32_t left_motor, std::int32_t right_motor)
左右モータの絶対角度の平均値を計算する
Definition: MotorAngle.cpp:39
LineTracerWalker lineTracerWalker
Definition: NormalCourse.h:13
MotorAngle motor_angle
Definition: NormalCourse.h:16
TurnControl turnControl
SpeedControl speedControl