etrobocon2018 feat.KatLab  770af34cce41ae9c30c41303275e1add2daae0c3 (with uncommitted changes)
 全て クラス 名前空間 ファイル 関数 変数 列挙型 列挙値 フレンド マクロ定義 ページ
Navigator.cpp
[詳解]
1 
6 #include "Navigator.h"
7 
13 {
14  walker.reset();
15  odometry.reset();
16 }
17 
25 void Navigator::spin(float angle, bool clockwise, std::int8_t pwm)
26 {
27  // 測定角度の初期化
28  reset();
29  angle = (angle < 0) ? -angle : angle;
30 
31  while(odometry.getRotationAngle(walker.get_count_L(), walker.get_count_R()) < angle) {
32  // 時計回りのときは-pwmを渡す
33  walker.run(0, clockwise ? -pwm : pwm);
34  controller.tslpTsk(4);
35  }
36 
37  // 回転停止
38  walker.run(0, 0);
39  reset();
40 }
41 
48 void Navigator::move(float distance, std::int8_t pwm)
49 {
50  // 測定距離の初期化
51  reset();
52  float radius = 0.0f;
53 
54  while(radius < distance) {
55  walker.run(pwm, 0);
56  odometry.update(walker.get_count_L(), walker.get_count_R());
57  radius = odometry.getCoordinate().radius;
58  controller.tslpTsk(4);
59  }
60 
61  // 移動停止
62  walker.run(0, 0);
63  reset();
64 }
65 
72 void Navigator::back(float distance, std::int8_t pwm)
73 {
74  // 測定距離の初期化
75  reset();
76  float radius = 0.0f;
77 
78  while(radius < distance) {
79  walker.run(-pwm, 0);
80  odometry.update(walker.get_count_L(), walker.get_count_R());
81  radius = -odometry.getCoordinate().radius;
82  controller.tslpTsk(4);
83  }
84 }
85 
92 void Navigator::moveWhileDetecting(float distance, std::int16_t black, std::int8_t pwm)
93 {
94  // 測定距離の初期化
95  reset();
96  controller.ledSetColorGreen();
97  while(odometry.update(walker.get_count_L(), walker.get_count_R()).radius < distance) {
98  walker.run(pwm, 0);
99  if(binarization(black) == false)
100  controller.ledSetColorOrange();
101  else
102  controller.ledSetColorGreen();
103  controller.tslpTsk(4);
104  }
105 
106  walker.run(0, 0);
107  reset();
108 }
109 
116 {
117  return controller.getBrightness();
118 }
119 
126 std::int8_t Navigator::getNearbyBrightness(float distance)
127 {
128  auto center = getBrightness();
129 
130  // distanceだけ前に移動した点のセンサ値を取る
131  move(distance, 10);
132  auto front_value = getBrightness();
133  back(distance, 10);
134 
135  // distanceだけ後ろに移動した点のセンサ値を取る
136  back(distance, 10);
137  auto back_value = getBrightness();
138  move(distance, 10);
139 
140  return std::min({ front_value, center, back_value });
141 }
142 
149 bool Navigator::binarization(std::int16_t black)
150 {
151  auto brightness = getBrightness();
152  return (brightness < black) ? false : true;
153 }
154 
163 void Navigator::moveOnLine(float distance, std::int16_t target, std::int8_t pwm,
164  bool is_leftside_line)
165 {
166  // 測定距離の初期化
167  reset();
168  float radius = 0.0f;
169 
170  // ライントレースで用いるPID値のセット
171  line_tracer.speedControl.setPid(2.0, 0.8, 0.1, pwm);
172  line_tracer.turnControl.setPid(1.1, 0.1, 0.2, target);
173  // 左エッジか右エッジか設定
174  line_tracer.isLeftsideLine(is_leftside_line);
175 
176  while(radius < distance) {
177  odometry.update(walker.get_count_L(), walker.get_count_R());
178  radius = odometry.getCoordinate().radius;
179  line_tracer.runLine(walker.get_count_L(), walker.get_count_R(), getBrightness());
180  if(line_tracer.getForward() < 0)
181  walker.run(0, 0);
182  else
183  walker.run(line_tracer.getForward(), line_tracer.getTurn());
184  controller.tslpTsk(4);
185  }
186 
187  walker.run(0, 0);
188  reset();
189 }
190 
191 void Navigator::moveToColorCheck(float distance, Color target_color, std::int8_t pwm)
192 {
193  reset();
194  float radius = 0.0f;
195  while(radius < distance) {
196  color = distinguisher.getColor();
197  odometry.update(walker.get_count_L(), walker.get_count_R());
198  radius = odometry.getCoordinate().radius;
199  walker.run(pwm, 0);
200  if(color == target_color) {
201  controller.speakerPlayTone(NOTE_A4, 300);
202  break;
203  }
204  controller.tslpTsk(4); // 4msec周期
205  }
206  walker.run(0, 0);
207  reset();
208  color = Color::NONE;
209 }
210 
211 void Navigator::moveToColor(float distance, std::int16_t target_brightness, Color target_color,
212  std::int8_t speed, bool is_leftside_line)
213 {
214  reset(); // 距離の初期化
215  float radius = 0.0f;
216  line_tracer.isLeftsideLine(is_leftside_line); // 左エッジか右エッジか設定
217  // ライントレースで用いるPID値のセット
218  line_tracer.speedControl.setPid(2.0, 0.8, 0.1, speed);
219  line_tracer.turnControl.setPid(1.1, 0.1, 0.2, target_brightness);
220  // 距離を超過するか目的の色を見つけるまでループ
221  while(radius < distance) {
222  color = distinguisher.getColor();
223  odometry.update(walker.get_count_L(), walker.get_count_R());
224  radius = odometry.getCoordinate().radius;
225  line_tracer.runLine(walker.get_count_L(), walker.get_count_R(), getBrightness());
226  walker.run(line_tracer.getForward(), line_tracer.getTurn());
227  controller.printDisplay(5, "color: %d", color);
228  if(color == target_color) {
229  controller.speakerPlayTone(NOTE_A5, 300);
230  break;
231  }
232  controller.tslpTsk(4); // 4msec周期
233  }
234 
235  color = Color::NONE;
236  walker.run(0, 0);
237  reset();
238 }
void isLeftsideLine(bool b)
void speakerPlayTone(uint16_t frequency, int32_t duration)
Definition: Controller.cpp:9
void tslpTsk(int16_t time)
Definition: Controller.cpp:74
void moveOnLine(float distance, std::int16_t target, std::int8_t pwm=20, bool is_leftside_line=true)
指定した距離だけライントレースする
Definition: Navigator.cpp:163
void move(float distance, std::int8_t pwm=20)
指定した距離まで走行体を移動させる
Definition: Navigator.cpp:48
void moveWhileDetecting(float distance, std::int16_t target, std::int8_t pwm=10)
指定した距離まで黒色の点を検出しながら走行体を移動させる
Definition: Navigator.cpp:92
const Coordinate & getCoordinate()
走行体の位置情報を返す
float getRotationAngle(std::int32_t left_motor, std::int32_t right_motor)
走行体の回転角度を返す
void setPid(double p_gain_, double i_gain_, double d_gain_, double target_)
Definition: Pid.cpp:40
void moveToColor(float distance, std::int16_t target_brightness, Color target_color, std::int8_t speed=20, bool is_leftside_line=true)
指定した距離分ライントレースして指定した色があると停止する
Definition: Navigator.cpp:211
Color
Definition: Distinguisher.h:16
float radius
Definition: WheelOdometry.h:17
void runLine(int32_t countL, int32_t countR, int16_t light_value)
void reset()
座標とエンコーダの値を初期化する
Definition: Navigator.cpp:12
void run(std::int8_t pwm, std::int8_t turn)
Definition: Walker.cpp:30
const Coordinate & update(std::int32_t left_motor, std::int32_t right_motor)
走行体の位置情報を更新する
std::int8_t getNearbyBrightness(float distance=20.0f)
現在位置の周辺における光センサ値を取得する
Definition: Navigator.cpp:126
std::int16_t getBrightness()
光センサの値を取得する
Definition: Navigator.cpp:115
int16_t getBrightness()
Definition: Controller.cpp:59
void back(float distance, std::int8_t pwm=10)
指定した距離まで走行体を後退させる
Definition: Navigator.cpp:72
void ledSetColorOrange()
Definition: Controller.cpp:14
void spin(float angle, bool clockwise=false, std::int8_t pwm=10)
指定した角度まで走行体を回転させる(基本左エッジ)
Definition: Navigator.cpp:25
void ledSetColorGreen()
Definition: Controller.cpp:19
const Coordinate & reset()
走行体の位置情報を初期化する
void reset()
Definition: Walker.cpp:15
std::int32_t get_count_R()
Definition: Walker.cpp:54
TurnControl turnControl
Color getColor()
void printDisplay(int8_t row, const char *format,...)
Definition: Controller.cpp:79
SpeedControl speedControl
std::int32_t get_count_L()
Definition: Walker.cpp:49
bool binarization(std::int16_t target)
2値化処理を実行する
Definition: Navigator.cpp:149
void moveToColorCheck(float distance, Color target_color, std::int8_t pwm=20)
指定した距離特定の色を探しながら進む(ライントレースしない)
Definition: Navigator.cpp:191
走行制御と回転制御を実行するクラス