etrobocon2018 feat.KatLab  770af34cce41ae9c30c41303275e1add2daae0c3 (with uncommitted changes)
 全て クラス 名前空間 ファイル 関数 変数 列挙型 列挙値 フレンド マクロ定義 ページ
RightCourse.cpp
[詳解]
1 
6 #include "RightCourse.h"
7 #include "BasicWalker.h"
8 #include "Distinguisher.h"
9 #include "Lifter.h"
10 #include "LineTracerWalker.h"
11 
15 void RightCourse::run(std::int16_t brightness, std::int16_t black, std::int16_t white,
16  std::int16_t gray)
17 {
18  LineTracerWalker lineTracer;
19  runNormalCourse(brightness, black, white, gray);
20  controller.tslpTsk(400);
21  solveBlockPuzzle(brightness);
22  runParking(brightness, lineTracer, black, white);
23 }
24 
25 void RightCourse::solveBlockPuzzle(std::int16_t brightness)
26 {
27  walker.reset();
28  BlockSolver blockSolver{ controller, walker, initialPositionCode, brightness };
29  blockSolver.run();
30 }
31 
32 void RightCourse::runParking(std::int16_t brightness, LineTracerWalker lineTracer,
33  std::int16_t black, std::int16_t white)
34 {
35  Parking parking{ controller };
36  parking.runParpendicular(brightness, lineTracer, black, white);
37 }
38 
39 void RightCourse::moveBlockAreaTo8(std::int16_t target_brightness)
40 {
41  Distinguisher d{ controller };
42  MotorAngle motor_angle;
43  bool isAlreadyChangedGear = false;
44 
45  lineTracer.speedControl.setPid(5.0, 1.0, 0.1, 90.0);
46  lineTracer.turnControl.setPid(2.0, 1.0, 0.14, target_brightness);
47  controller.tslpTsk(500);
48 
49  walker.reset();
50  while(1) {
51  Color result = d.getColor();
52  auto luminance = controller.getBrightness();
53  lineTracer.runLine(walker.get_count_L(), walker.get_count_R(), luminance);
54  walker.run(lineTracer.getForward(), lineTracer.getTurn());
55  controller.printDisplay(4, "Brightness: %d, Target: %d", luminance, result);
56  if(result == Color::RED) break;
57  if(!isAlreadyChangedGear
58  && motor_angle.absoluteAngleMean(walker.get_count_L(), walker.get_count_R()) > 1750) {
59  lineTracer.speedControl.setPid(5.0, 1.0, 0.1, 25.0);
60  lineTracer.turnControl.setPid(1.0, 1.0, 0.14, target_brightness);
61  controller.speakerPlayTone(controller.noteFs6, 100);
62  isAlreadyChangedGear = true;
63  }
64  controller.tslpTsk(4);
65  }
66 }
67 
68 void RightCourse::runPuzzle(std::int16_t target_brightness)
69 {
70  Controller controller;
71  Distinguisher d{ controller };
72  LineTracerWalker lineTracerWalker;
73 
74  lineTracerWalker.speedControl.setPid(1.0, 0.8, 0.8, 60.0);
75  lineTracerWalker.turnControl.setPid(1.0, 1.7, 0.6, target_brightness);
76  walker.reset();
77  Color result = d.getColor();
78  controller.printDisplay(6, "in the loop, Color: %d", static_cast<int>(result));
79  controller.speakerPlayTone(controller.noteFs4, 100);
80  while(1) {
81  Color result = d.getColor();
82  auto luminance = controller.getBrightness();
83  lineTracerWalker.runLine(walker.get_count_L(), walker.get_count_R(), luminance);
84  walker.run(lineTracerWalker.getForward(), lineTracerWalker.getTurn());
85  controller.printDisplay(4, "Brightness: %d, Target: %d", luminance, result);
86  controller.printDisplay(6, "out the loop, Color: %d", static_cast<int>(result));
87  }
88  controller.tslpTsk(4);
89 }
90 
92 {
93  //ブロックエリアを通り過ぎる関数
94  BasicWalker basic{ controller };
95  Controller controller;
96  controller.speakerPlayTone(controller.noteFs4, 100);
97  basic.reset();
98  basic.setPidWithoutTarget(5.0, 1.0, 0.1);
99  basic.goStraight(15, 140);
100 }
101 
102 void RightCourse::runNormalCourse(std::int16_t brightness, std::int16_t black, std::int16_t white,
103  std::int16_t gray)
104 {
105  RightNormalCourse normalCourse;
106  bool isNormalCourse;
107 
108  /*灰色を検知用*/
109  /*
110  int8_t counter = 0;
111  std::int16_t target_brightness_gray = (white + gray) / 2;
112  */
113 
114  // NormalCourseを抜けるまでループする
115  while(1) {
116  auto luminance = controller.getBrightness();
117 
118  /*灰色を検知用*/
119  /*
120  auto distance_total_r = (walker.get_count_L() + walker.get_count_R()) / 2;
121  */
122  controller.printDisplay(4, "Brightness: %d, Target: %d", luminance, brightness);
123  if(normalCourse.statusCheck(walker.get_count_L(), walker.get_count_R()))
124  controller.speakerPlayTone(controller.noteFs6, 100);
125  isNormalCourse = normalCourse.runNormalCourse(brightness, black, white, gray);
126  normalCourse.lineTracerWalker.runLine(walker.get_count_L(), walker.get_count_R(), luminance);
127 
128  normalCourse.runOrStop(walker);
129  if(!isNormalCourse) {
130  walker.run(0, 0);
131  break;
132  }
133  if(controller.buttonIsPressedBack()) {
134  walker.run(0, 0);
135  break;
136  }
137  /*灰色を検知したら止まる*/
138  /*
139  const std::std::int16_t AFTER_GOAL_CURVE_R = 11900;
140  if(distance_total_r > AFTER_GOAL_CURVE_R && target_brightness_gray + 20 > luminance &&
141  luminance > target_brightness_gray - 3){ if(counter > 10){ controller.printDisplay(4, "Find Gray
142  Line¥n Brightness: %d, Target: %d", luminance, brightness);
143  controller.speakerPlayTone(controller.noteFs6, 100);
144  }
145  controller.speakerPlayTone(controller.noteFs6, 20);
146  counter++;
147  }else{
148  counter = 0;
149  }
150  */
151  controller.tslpTsk(4); // 4msec周期起動
152  }
153 }
駐車クラス
Definition: Parking.h:18
void speakerPlayTone(uint16_t frequency, int32_t duration)
Definition: Controller.cpp:9
void tslpTsk(int16_t time)
Definition: Controller.cpp:74
bool statusCheck(int32_t countL, int32_t countR)
void runParking(std::int16_t brightness, LineTracerWalker lineTracer, std::int16_t black, std::int16_t white)
Definition: RightCourse.cpp:32
void runNormalCourse(std::int16_t brightness)
uint16_t noteFs6
Definition: Controller.h:40
void setPid(double p_gain_, double i_gain_, double d_gain_, double target_)
Definition: Pid.cpp:40
Color
Definition: Distinguisher.h:16
void runLine(int32_t countL, int32_t countR, int16_t light_value)
bool buttonIsPressedBack()
Definition: Controller.cpp:24
void runOrStop(Walker &walker)
Definition: NormalCourse.cpp:8
void run(std::int8_t pwm, std::int8_t turn)
Definition: Walker.cpp:30
void moveBlockAreaTo8(std::int16_t target_brightness)
Definition: RightCourse.cpp:39
void runPuzzle(std::int16_t target_brightness)
Definition: RightCourse.cpp:68
Rコースを走らせるときに呼び出されるクラス
float absoluteAngleMean(std::int32_t left_motor, std::int32_t right_motor)
左右モータの絶対角度の平均値を計算する
Definition: MotorAngle.cpp:39
bool runNormalCourse(int16_t target_brightness, int16_t black, int16_t white, int16_t gray)
int16_t getBrightness()
Definition: Controller.cpp:59
LineTracerWalker lineTracerWalker
Definition: NormalCourse.h:13
uint16_t noteFs4
Definition: Controller.h:41
void solveBlockPuzzle(std::int16_t brightness)
Definition: RightCourse.cpp:25
走行体のカラーセンサを用いて、RGB情報より色を推定するクラス。
void reset()
Definition: Walker.cpp:15
std::int32_t get_count_R()
Definition: Walker.cpp:54
void throughArea()
Definition: RightCourse.cpp:91
走行体のカラーセンサを用いて、RGB情報より色を推定するクラス。
Definition: Distinguisher.h:55
TurnControl turnControl
走行体のアームを操作するクラス。
void printDisplay(int8_t row, const char *format,...)
Definition: Controller.cpp:79
void run(std::int16_t brightness, std::int16_t black, std::int16_t white, std::int16_t gray)
Definition: RightCourse.cpp:15
SpeedControl speedControl
std::int32_t get_count_L()
Definition: Walker.cpp:49