ETrobocon2017 - 片山研究所モデルベース開発推進事業部
PuzzleLineTracer.cpp
[詳解]
1 #include "PuzzleLineTracer.h"
2 
4  colorSensor ( PORT_3 ),
5  traceDistance ( 0 ) {
6  lineTracer.isLeftsideLine ( false ),
7  ev3_speaker_set_volume ( 100 ) ;
8 }
9 
11 {
12  tslp_tsk ( 100 ) ;
13  ev3_speaker_play_tone ( NOTE_FS6, 100 ) ;
14  distance.resetDistance ( walker.get_count_L (), walker.get_count_R () ) ;
15  while ( traceDistance < 1860 ) {
16  traceDistance = distance.getDistanceTotal ( walker.get_count_L (), walker.get_count_R () ) ;
17  lineTracer.speedControl.setPid ( 1.0, 0.8, 0.08, 60.0 ) ;
18  lineTracer.turnControl.setPid ( 2.8, 0.8, 0.06, 30.0 ) ;
19  color = colorSensor.getBrightness () ;
20  lineTracer.runLine ( walker.get_count_L (), walker.get_count_R (), color ) ;
21  walker.run( lineTracer.getForward (), lineTracer.getTurn () ) ;
22  tslp_tsk ( 4 ) ;
23  }
24  walker.run ( 0, 0 ) ;
25  walker.reset () ;
26  tslp_tsk ( 100 ) ;
27 }
28 
29 void PuzzleLineTracer::puzzleLineTrace ( int8_t currentPosition, int8_t beforePosition, int8_t nextPosition )
30 {
31  // 現在位置からの接続番号の付与
32  connectPosition = connectNumberManager[currentPosition][nextPosition] ;
33  // 行先への角度を取得する
34  if ( beforePosition == 0x00 ) {
35  beforeDegree = 0 ;
36  } else {
37  beforeConnectPosition = connectNumberManager[beforePosition][currentPosition] ;
38  beforeDegree = allConnectPosition[beforePosition][beforeConnectPosition][DEGREE] ;
39  }
40  nextDegree = allConnectPosition[currentPosition][connectPosition][DEGREE] ;
41  // 行先までの距離を取得する
42  traceDistance = distance.getDistanceCurrent ( walker.get_count_L (), walker.get_count_R () ) ;
43  nextDistance = allConnectPosition[currentPosition][connectPosition][DISTANCE] + traceDistance ;
44  // 現在の角度と行先への角度から車体を動かす角度を計算する
45  moveDegree = nextDegree - beforeDegree ;
46  // 値が取れているか確認用のログ
47  char msg[32] ;
48  sprintf ( msg, "Degree> Current:%d,Next:%d", currentDegree, nextDegree ) ;
49  msg_f ( msg, 4 ) ;
50  sprintf ( msg, " Move:%d", moveDegree ) ;
51  msg_f ( msg, 5 ) ;
52  sprintf ( msg, "Position>Current:%d,Next:%d", currentPosition, connectPosition ) ;
53  msg_f ( msg, 6 ) ;
54  sprintf ( msg, "Distance>Next:%ld,Trace:%ld", nextDistance, traceDistance ) ;
55  msg_f ( msg, 7 ) ;
56  // 車体を動かして角度を合わせる
57  ev3_speaker_play_tone ( NOTE_FS6, 100 ) ;
58  tslp_tsk ( 100 ) ;
59  for ( int i = 0 ; i < moveDegree ; i++ ) {
60  walker.run ( 0, ( ( moveDegree * 3 ) / 4 ) * -1 ) ;
61  tslp_tsk ( 4 ) ;
62  }
63  walker.run ( 0, 0 ) ;
64  tslp_tsk ( 100 ) ;
65  // ラインをトレースする
66  ev3_speaker_play_tone ( NOTE_FS6, 100 ) ;
67  msg_f ( "OK", 8 ) ;
68  while ( traceDistance < nextDistance ) {
69  traceDistance = distance.getDistanceCurrent ( walker.get_count_L (), walker.get_count_R () ) ;
70  lineTracer.speedControl.setPid ( 1.2, 2.4, 0.04, 30.0 );
71  lineTracer.turnControl.setPid ( 2.4, 0.8, 0.02, 30.0 );
72  lineTracer.runLine ( walker.get_count_L (), walker.get_count_R (), colorSensor.getBrightness () ) ;
73  walker.run( lineTracer.getForward (), lineTracer.getTurn () ) ;
74  tslp_tsk ( 4 ) ;
75  }
76  lineTracer.setForward ( -1 ) ;
77  ev3_speaker_play_tone ( NOTE_FS6, 100 ) ;
78 }
int32_t get_count_L()
Definition: Walker.cpp:48
void isLeftsideLine(bool b)
void setForward(int8_t setValue)
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
std::int32_t getDistanceCurrent(std::int32_t countL, std::int32_t countR)
Definition: Distance.cpp:15
void preparatePuzzle(void)
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
void puzzleLineTrace(int8_t, int8_t, int8_t)
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 reset()
Definition: Walker.cpp:18
int8_t getBrightness(void) const
Definition: ColorSensor.cpp:34
TurnControl turnControl
void run(int8_t pwm, int8_t turn)
Definition: Walker.cpp:31
SpeedControl speedControl