ETrobocon2017 - 片山研究所モデルベース開発推進事業部
PuzzleField.cpp
[詳解]
1 #include "PuzzleField.h"
2 
4  colorSensor ( PORT_3 ),
5  traceDistance ( 0 ) {
6  lineTracer.isLeftsideLine ( false ),
7  ev3_speaker_set_volume ( 5 ) ;
8 }
9 
11  tslp_tsk ( 100 ) ;
12  ev3_speaker_play_tone ( NOTE_FS6, 100 ) ;
13  distance.resetDistance ( walker.get_count_L (), walker.get_count_R () ) ;
14  while ( traceDistance < 1860 ) {
15  traceDistance = distance.getDistanceTotal ( walker.get_count_L (), walker.get_count_R () ) ;
16  lineTracer.speedControl.setPid ( 1.0, 0.8, 0.08, 60.0 ) ;
17  lineTracer.turnControl.setPid ( 2.8, 0.8, 0.06, 30.0 ) ;
18  color = colorSensor.getBrightness () ;
19  lineTracer.runLine ( walker.get_count_L (), walker.get_count_R (), color ) ;
20  walker.run( lineTracer.getForward (), lineTracer.getTurn () ) ;
21  tslp_tsk ( 4 ) ;
22  }
23  basicWalker.goStraight ( 10, 60 ) ;
24  walker.run ( 0, 0 ) ;
25  walker.reset () ;
26  tslp_tsk ( 100 ) ;
27 }
28 
29 void PuzzleField::runPuzzleField ( int8_t currentPosition, int8_t beforePosition, int8_t nextPosition ) {
30  runPuzzleFieldVectorChange ( currentPosition, beforePosition, nextPosition, 0 ) ;
31 }
32 
33 void PuzzleField::avoidBlock ( int8_t currentPosition, int8_t beforePosition, int8_t nextPosition ) {
34  basicWalker.backStraight ( 40, allconnectNumber[currentPosition][connectNumberManager[currentPosition][beforePosition]][DISTANCE] ) ;
35  runPuzzleFieldVectorChange ( currentPosition, beforePosition, nextPosition, 180 ) ;
36  ev3_speaker_play_tone ( NOTE_FS6, 75 ) ;
37  tslp_tsk ( 500 ) ;
38  ev3_speaker_play_tone ( NOTE_FS6, 75 ) ;
39  tslp_tsk ( 500 ) ;
40  ev3_speaker_play_tone ( NOTE_FS6, 75 ) ;
41 }
42 
43 void PuzzleField::runPuzzleFieldVectorChange ( int8_t currentPosition, int8_t beforePosition, int8_t nextPosition, int32_t vectorStatus )
44 {
45  char msg[32] ;
46  // 現在位置からの接続番号の付与
47  connectNumber = connectNumberManager[currentPosition][nextPosition] ;
48  // 行先への角度を取得する
49  if ( beforePosition == X ) {
50  currentDegree = 60 ;
51  } else {
52  beforeconnectNumber = connectNumberManager[beforePosition][currentPosition] ;
53  currentDegree = allconnectNumber[beforePosition][beforeconnectNumber][DEGREE] - vectorStatus ;
54  if ( vectorStatus == 180 && currentDegree < -180 ) {
55  currentDegree += 360 ;
56  }
57  }
58  nextDegree = allconnectNumber[currentPosition][connectNumber][DEGREE] ;
59  spinDegree = nextDegree - currentDegree ;
60  if ( spinDegree < 0 ) {
61  spinVector = basicWalker.SPIN_RIGHT ;
62  spinDegree *= -1 ;
63  sprintf ( msg, "Spin Vector:SPIN_RIGHT" ) ;
64  msg_f ( msg, 6 ) ;
65  } else if ( 180 < spinDegree ) {
66  spinVector = basicWalker.SPIN_RIGHT ;
67  spinDegree -= 360 ;
68  spinDegree *= -1 ;
69  sprintf ( msg, "Spin Vector:SPIN_RIGHT" ) ;
70  msg_f ( msg, 6 ) ;
71  } else {
72  spinVector = basicWalker.SPIN_LEFT ;
73  sprintf ( msg, "Spin Vector:SPIN_LEFT " ) ;
74  msg_f ( msg, 6 ) ;
75  }
76  // 行先までの距離を取得する
77  nextDistance = allconnectNumber[currentPosition][connectNumber][DISTANCE] ;
78  // 値が取れているか確認用のログ
79  sprintf ( msg, "Degree>Current:%ld,Next:%ld", currentDegree, nextDegree ) ;
80  msg_f ( msg, 4 ) ;
81  sprintf ( msg, " Spin:%ld", spinDegree ) ;
82  msg_f ( msg, 5 ) ;
83  sprintf ( msg, "Position>Current:%d->Next:%d", currentPosition, nextPosition ) ;
84  msg_f ( msg, 7 ) ;
85  sprintf ( msg, "Distance>Next:%ld", nextDistance ) ;
86  msg_f ( msg, 8 ) ;
87  // 車体を動かして角度を合わせる
88  ev3_speaker_play_tone ( NOTE_FS5, 100 ) ;
89  basicWalker.spin ( 16, spinVector, spinDegree ) ;
90  tslp_tsk ( 100 ) ;
91  // ラインをトレースする
92  ev3_speaker_play_tone ( NOTE_FS6, 100 ) ;
93  msg_f ( "OK", 9 ) ;
94  if ( connectNumber < 4 && nextPosition != 0 ) {
95  /*
96  basicWalker.goStraight ( 30, nextDistance / 4 ) ;
97  modifiedSpinDegree = 0 ;
98  modifiedSpinVector = basicWalker.SPIN_LEFT ;
99  while ( colorSensor.getBrightness () > 80 ) {
100  tslp_tsk ( 50 ) ;
101  basicWalker.backStraight ( 36, nextDistance / 4 ) ;
102  tslp_tsk ( 50 ) ;
103  modifiedSpinVector *= -1 ;
104  modifiedSpinDegree += 5 ;
105  basicWalker.spin ( 30, modifiedSpinVector, modifiedSpinDegree ) ;
106  basicWalker.goStraight ( 30, nextDistance / 4 ) ;
107  }
108  basicWalker.goStraight ( 30, ( nextDistance / 4 ) * 3 ) ;
109  */
110  tslp_tsk ( 100 ) ;
111  ev3_speaker_play_tone ( NOTE_FS6, 100 ) ;
112  distance.resetDistance ( walker.get_count_L (), walker.get_count_R () ) ;
113  while ( traceDistance < nextDistance || colorSensor.getColorNumber () == COLOR_RED || colorSensor.getColorNumber () == COLOR_BLUE || colorSensor.getColorNumber () == COLOR_GREEN || colorSensor.getColorNumber () == COLOR_YELLOW ) {
114  traceDistance = distance.getDistanceTotal ( walker.get_count_L (), walker.get_count_R () ) ;
115  lineTracer.speedControl.setPid ( 1.0, 0.8, 0.08, 60.0 ) ;
116  lineTracer.turnControl.setPid ( 2.8, 0.8, 0.06, 30.0 ) ;
117  color = colorSensor.getBrightness () ;
118  lineTracer.runLine ( walker.get_count_L (), walker.get_count_R (), color ) ;
119  walker.run( lineTracer.getForward (), lineTracer.getTurn () ) ;
120  tslp_tsk ( 4 ) ;
121  }
122  basicWalker.goStraight ( 10, 60 ) ;
123  walker.run ( 0, 0 ) ;
124  walker.reset () ;
125  tslp_tsk ( 100 ) ;
126  } else {
127  basicWalker.goStraight ( 30, nextDistance ) ;
128  }
129  tslp_tsk ( 100 ) ;
130  ev3_speaker_play_tone ( NOTE_FS5, 100 ) ;
131  tslp_tsk ( 1000 ) ;
132 }
133 
134 void PuzzleField::testGame ( void ) {
135  runPuzzleField ( 10, X, 1 ) ;
136  runPuzzleField ( 1, 10, 5 ) ;
137  runPuzzleField ( 5, 1, 8 ) ;
138  runPuzzleField ( 8, 5, 6 ) ;
139  runPuzzleField ( 6, 8, 0 ) ;
140  avoidBlock ( 6, 0, 9 ) ;
141  runPuzzleField ( 9, 6, 14 ) ;
142  runPuzzleField ( 14, 9, 0 ) ;
143  avoidBlock ( 14, 0, 8 ) ;
144  runPuzzleField ( 8, 14, 2 ) ;
145  runPuzzleField ( 2, 8, 3 ) ;
146  runPuzzleField ( 3, 2, 9 ) ;
147  runPuzzleField ( 9, 3, 15 ) ;
148  runPuzzleField ( 15, 9, 11 ) ;
149 
150  basicWalker.goStraight ( 20, 640 ) ;
151  basicWalker.spin ( 10, basicWalker.SPIN_LEFT, 60 ) ;
152 
153 }
int32_t get_count_L()
Definition: Walker.cpp:48
void isLeftsideLine(bool b)
void resetDistance(int32_t countL, int32_t countR)
Definition: Distance.cpp:22
#define DEGREE
Definition: PuzzleField.h:18
int32_t get_count_R()
Definition: Walker.cpp:52
#define X
Definition: PuzzleField.h:11
void backStraight(int32_t, int32_t)
Definition: BasicWalker.cpp:48
Definition: Port.h:22
void runLine(int32_t countL, int32_t countR, int8_t light_value)
void setPid(double _p_gain, double _i_gain, double _d_gain, double _target)
Definition: Pid.cpp:40
const bool SPIN_LEFT
Definition: BasicWalker.h:17
void testGame(void)
const bool SPIN_RIGHT
Definition: BasicWalker.h:18
void msg_f(const char *str, int32_t line)
Definition: util.cpp:17
#define DISTANCE
Definition: PuzzleField.h:19
std::int32_t getDistanceTotal(std::int32_t countL, std::int32_t countR)
Definition: Distance.cpp:9
void spin(int32_t, bool, int32_t)
Definition: BasicWalker.cpp:8
void reset()
Definition: Walker.cpp:18
int8_t getBrightness(void) const
Definition: ColorSensor.cpp:34
void preparatePuzzle(void)
Definition: PuzzleField.cpp:10
colorid_t getColorNumber(void) const
Definition: ColorSensor.cpp:41
TurnControl turnControl
void goStraight(int32_t, int32_t)
Definition: BasicWalker.cpp:31
void run(int8_t pwm, int8_t turn)
Definition: Walker.cpp:31
SpeedControl speedControl