etrobocon2019 feat.KatLab  ece30a9a007fff7d3ad48592c0d09a74643377bb
公開メンバ関数 | 全メンバ一覧
Navigator クラス

#include <Navigator.h>

Navigator 連携図
Collaboration graph

公開メンバ関数

 Navigator (Controller &controller_, double Kp_=0.60, double Ki_=0.0, double Kd_=0.0)
 Navigatorクラスのコンストラクタ [詳解]
 
void setPidGain (double Kp, double Ki, double Kd)
 SpeedControl用のPidゲインのセッター [詳解]
 
void move (double specifiedDistance, int pwm=30, const double pGain=0.0)
 specifiedDistanceの値でbackwardかforwardを呼び出す。 [詳解]
 
void moveAtSpecifiedSpeed (double specifiedDistance, int specifiedSpeed)
 specifiedDistanceとSpeedControl.calculateSpeedから戻ってきたPWMをmoveに渡す [詳解]
 
void moveToSpecifiedColor (Color specifiedColor, int pwm=30)
 
void spin (double angle, bool clockwise=true, int pwm=10)
 走行体を回頭させる(yawing) [詳解]
 

詳解

Navigator.h18 行目に定義があります。

構築子と解体子

◆ Navigator()

Navigator::Navigator ( Controller controller_,
double  Kp_ = 0.60,
double  Ki_ = 0.0,
double  Kd_ = 0.0 
)
explicit

Navigatorクラスのコンストラクタ

コンストラクタ

引数
&controller_[Controllerインスタンスの参照]
Kp_[SpeedControl用のPゲイン]
Ki_[SpeedControl用のIゲイン]
Kd_[SpeedControl用のDゲイン]

Navigator.cpp10 行目に定義があります。

11  : distance(), controller(controller_), pidForSpeed(Kp_, Ki_, Kd_)
12 {
13 }

関数詳解

◆ move()

void Navigator::move ( double  specifiedDistance,
int  pwm = 30,
const double  pGain = 0.0 
)

specifiedDistanceの値でbackwardかforwardを呼び出す。

前進と後進をする

引数
specifiedDistance[移動したい距離(mm)。正なら前進、負なら後進。]
pwm[モータの強さ]
pGain[PID制御におけるPゲイン (デフォルトは0.0なので指定しなければP制御は実行されない)]
戻り値
なし

Navigator.cpp20 行目に定義があります。

21 {
22  int leftAngle = controller.getLeftMotorCount();
23  int rightAngle = controller.getRightMotorCount();
24  double goalDistance = specifiedDistance + distance.getDistance(leftAngle, rightAngle);
25 
26  // 左車輪の回転量 - 右車輪の回転量
27  // 左車輪の方が多く回転していれば、alphaは正となり右車輪にPWM + alphaの操作量が加えられる
28  Pid pid(0, pGain);
29 
30  if(specifiedDistance < 0) {
31  while(hasArrived(goalDistance, false)) {
32  double alpha = pid.control(controller.getLeftMotorCount() - controller.getRightMotorCount());
33  setPwmValue(-std::abs(pwm), -alpha);
34  controller.tslpTsk(4);
35  }
36  } else {
37  while(hasArrived(goalDistance, true)) {
38  double alpha = pid.control(controller.getLeftMotorCount() - controller.getRightMotorCount());
39  setPwmValue(std::abs(pwm), -alpha);
40  controller.tslpTsk(4);
41  }
42  }
43 
44  controller.stopMotor();
45 }
int getRightMotorCount()
Definition: Controller.cpp:188
void stopMotor()
Definition: Controller.cpp:272
int getLeftMotorCount()
Definition: Controller.cpp:183
static void tslpTsk(int time)
Definition: Controller.cpp:163
Definition: Pid.h:18
double getDistance(int leftAngle, int rightAngle)
左右の平均走行距離を計算して戻り値として返す
Definition: Distance.cpp:15
呼び出し関係図:
被呼び出し関係図:

◆ moveAtSpecifiedSpeed()

void Navigator::moveAtSpecifiedSpeed ( double  specifiedDistance,
int  specifiedSpeed 
)

specifiedDistanceとSpeedControl.calculateSpeedから戻ってきたPWMをmoveに渡す

指定した速度で前進と後進をする

引数
specifiedDistance[移動したい距離(mm)]
specifiedSpeed[移動したい速度]
戻り値
なし

Navigator.cpp47 行目に定義があります。

48 {
49  int leftAngle = controller.getLeftMotorCount();
50  int rightAngle = controller.getRightMotorCount();
51  double goalDistance = specifiedDistance + distance.getDistance(leftAngle, rightAngle);
52 
53  SpeedControl speedControl(controller, specifiedSpeed, pidForSpeed.Kp, pidForSpeed.Ki,
54  pidForSpeed.Kd);
55 
56  if(specifiedDistance < 0) {
57  while(hasArrived(goalDistance, false)) {
58  double pwm = speedControl.calculateSpeed(specifiedSpeed, pidForSpeed.Kp, pidForSpeed.Ki,
59  pidForSpeed.Kd);
60  setPwmValue(static_cast<int>(-std::abs(pwm)));
61  controller.tslpTsk(4);
62  }
63  } else {
64  while(hasArrived(goalDistance, true)) {
65  double pwm = speedControl.calculateSpeed(specifiedSpeed, pidForSpeed.Kp, pidForSpeed.Ki,
66  pidForSpeed.Kd);
67  setPwmValue(static_cast<int>(std::abs(pwm)));
68  controller.tslpTsk(4);
69  }
70  }
71  controller.stopMotor();
72 }
int getRightMotorCount()
Definition: Controller.cpp:188
void stopMotor()
Definition: Controller.cpp:272
double Kp
Definition: Pid.h:11
double Kd
Definition: Pid.h:13
double Ki
Definition: Pid.h:12
int getLeftMotorCount()
Definition: Controller.cpp:183
static void tslpTsk(int time)
Definition: Controller.cpp:163
double getDistance(int leftAngle, int rightAngle)
左右の平均走行距離を計算して戻り値として返す
Definition: Distance.cpp:15
呼び出し関係図:

◆ moveToSpecifiedColor()

void Navigator::moveToSpecifiedColor ( Color  specifiedColor,
int  pwm = 30 
)

指定した色まで前進と後進をする

引数
specifiedColor[指定する色]
pwm[モータの強さ。正なら前進、負なら後進する]
戻り値
なし

Navigator.cpp74 行目に定義があります。

75 {
76  int r = 0;
77  int g = 0;
78  int b = 0;
79 
80  // カラーセンサからrgb値を取得
81  controller.getRawColor(r, g, b);
82  // rgb値をhsv値に変換
83  controller.convertHsv(r, g, b);
84 
85  // 特定の色まで移動する
86  while(controller.hsvToColor(controller.getHsv()) != specifiedColor) {
87  setPwmValue(pwm);
88  // カラーセンサからrgb値を取得
89  controller.getRawColor(r, g, b);
90  // rgb値をhsv値に変換
91  controller.convertHsv(r, g, b);
92  controller.tslpTsk(4);
93  }
94  controller.stopMotor();
95 }
void stopMotor()
Definition: Controller.cpp:272
Color hsvToColor(const HsvStatus &status)
Definition: Controller.cpp:86
void convertHsv(int &r, int &g, int &b)
Definition: Controller.cpp:213
static void tslpTsk(int time)
Definition: Controller.cpp:163
void getRawColor(int &r, int &g, int &b)
Definition: Controller.cpp:78
HsvStatus getHsv() const
Definition: Controller.cpp:261
呼び出し関係図:
被呼び出し関係図:

◆ setPidGain()

void Navigator::setPidGain ( double  Kp,
double  Ki,
double  Kd 
)

SpeedControl用のPidゲインのセッター

引数
Kp_[SpeedControl用のPゲイン]
Ki_[SpeedControl用のIゲイン]
Kd_[SpeedControl用のDゲイン]
戻り値
なし

Navigator.cpp15 行目に定義があります。

16 {
17  pidForSpeed.setPidGain(Kp, Ki, Kd);
18 }
void setPidGain(double Kp_, double Ki_, double Kd_)
Definition: Pid.cpp:15
呼び出し関係図:

◆ spin()

void Navigator::spin ( double  angle,
bool  clockwise = true,
int  pwm = 10 
)

走行体を回頭させる(yawing)

引数
angle[回頭角度(正の値)]
clockwise[時計回りに回転するかどうか(デフォルトで時計回り)]
pwm[モーターパワー]

Navigator.cpp97 行目に定義があります。

98 {
99  // angleの絶対値を取る
100  angle = std::abs(angle);
101  Rotation rotation;
102 
103  controller.resetMotorCount();
104 
105  while(rotation.calculate(controller.getLeftMotorCount(), controller.getRightMotorCount())
106  < angle) {
107  controller.setLeftMotorPwm(clockwise ? pwm : -pwm);
108  controller.setRightMotorPwm(clockwise ? -pwm : pwm);
109  controller.tslpTsk(4);
110  }
111 
112  controller.stopMotor();
113 }
int getRightMotorCount()
Definition: Controller.cpp:188
void stopMotor()
Definition: Controller.cpp:272
double calculate(const int leftAngle, const int rightAngle)
自転したときの角度を求める
Definition: Rotation.cpp:10
void setLeftMotorPwm(const int pwm)
Definition: Controller.cpp:203
int getLeftMotorCount()
Definition: Controller.cpp:183
void setRightMotorPwm(const int pwm)
Definition: Controller.cpp:208
void resetMotorCount()
Definition: Controller.cpp:266
static void tslpTsk(int time)
Definition: Controller.cpp:163
呼び出し関係図:
被呼び出し関係図:

このクラス詳解は次のファイルから抽出されました: