ETrobocon2017 - 片山研究所モデルベース開発推進事業部
example_Navigation.cpp
[詳解]
1 
11 #include <iostream>
12 #include <random>
13 #include <unistd.h>
14 #include "LineTracerWalker.h"
15 #include "Navigation.h"
16 
17 // グローバル変数
20 
21 // プロトタイプ宣言
22 void run(Navigation &navi, float goal_x, float goal_y, bool);
23 void calcVirtualWheels(int, int);
24 
25 int main(){
27 
29  Navigation navi(0, 0);
30 
31  std::cout << "スピード(100ms), forword値, Target値, turn値, 前進値" << std::endl;
32  run(navi, -100.0, 100.0, true);
33  run(navi, -300.0, 80.0, true);
34  run(navi, -150.0, 100.0, false);
35  run(navi, -150.0, 400.0, false);
36 
37  return 0;
38 }
39 
40 void run(Navigation &navi, float goal_x, float goal_y, bool isBack){
41  bool isEndAngle = false;
42  int minus = 1;
43  if(isBack == true)minus = -1;
44  navi.turnControl.setPid(4.0, 0.5, 3.0, 0.0);
45  navi.speedControl.setPid(2.0, 2.0, 0.024, 60.0 * minus);
46 
47  navi.setLine(navi.sl.getPointX(), navi.sl.getPointY(), goal_x, goal_y);
48  navi.getDiffLine(navi.sl.getPointX(), navi.sl.getPointY());
49  navi.calculate_line_angle(isBack);
50  navi.sl.init_normal_vector(navi.start_x, navi.start_y, navi.goal_x, navi.goal_y, navi.current_x, navi.current_y);
51  while(!navi.sl.is_over_normal_vector(navi.current_x, navi.current_y)){
52  if(! isEndAngle){
53  isEndAngle = navi.calculateAngle(left_motor, right_motor, isBack);
54  }else{
55  navi.calculateValue(left_motor, right_motor, isBack);
56  }
58  calcVirtualWheels(navi.getForward(), navi.getTurn());
60  // 結果を画面に出力
61  std::cout << navi.sl.getPointX() << ", " << navi.sl.getPointY() << std::endl;
62  //std::cout << "スピード(100ms) " << speed100ms << ", forword値 " << forword << ",Target値" << target << ", turn値 " << turn << ", 前進値" << (right_motor + left_motor) / 2 << std::endl;
63  //std::cout << speed100ms << "," << forword << "," << target << "," << turn << "," << (right_motor + left_motor) / 2 << std::endl;
64  }
65 
66 }
67 
68 // 仮想的なモータエンコーダです。
69 void calcVirtualWheels(int forward, int turn){
70  // モータの前進にランダム性を持たせる
71  std::random_device rnd;
72  std::mt19937 mt(rnd());
73  std::uniform_int_distribution<int> rand50(0,50); // 1~10の一様乱数
74  double r_forword = rand50(mt) * 0.3;
75 
76  // 実際に進んだ距離とする
77  left_motor += (speed100ms/15 - turn + forward + r_forword) * 0.1;
78  right_motor += (speed100ms/15 + turn + forward + r_forword) * 0.1;
79 }
float current_y
Definition: Navigation.h:61
float getDiffLine(float, float)
Definition: Navigation.cpp:24
bool calculateValue(std::int32_t, std::int32_t, bool)
Definition: Navigation.cpp:46
void init_normal_vector(float _start_x, float _start_y, float _goal_x, float _goal_y, float _current_x, float _current_y)
int right_motor
bool calculateAngle(std::int32_t, std::int32_t, bool)
Definition: Navigation.cpp:59
float goal_y
Definition: Navigation.h:57
void setPid(double _p_gain, double _i_gain, double _d_gain, double _target)
Definition: Pid.cpp:40
SelfLocalization sl
Definition: Navigation.h:44
void run(Navigation &navi, float goal_x, float goal_y, bool)
void update(std::int32_t left_motor_sl, std::int32_t right_motor_sl)
void calculate_line_angle(bool)
Definition: Navigation.cpp:38
2点間を結ぶ仮想直線をライントレースするクラスのヘッダファイル
float start_y
Definition: Navigation.h:53
int left_motor
float current_x
Definition: Navigation.h:59
2点間を結ぶ仮想直線をライントレースするクラス
Definition: Navigation.h:19
bool setLine(float, float, float, float)
Definition: Navigation.cpp:12
TurnControl turnControl
float goal_x
Definition: Navigation.h:55
std::int16_t getSpeed100ms()
int speed100ms
bool is_over_normal_vector(float _current_x, float _current_y)
float start_x
Definition: Navigation.h:51
void calcVirtualWheels(int, int)
int main()
SpeedControl speedControl