@@ -105,7 +105,8 @@ vector<Motion*> MotionParser::createMotions(Robot& robot, string& commandFilePat
105105 // [1]:double 距離[mm], [2]:double 速度[mm/s], [3]:int X座標[px], [4-6]:double PIDゲイン,
106106 // [7-9]int lowerHSV, [10-12]int upperHSV,
107107 // [13-16]int ROI座標[px] ([13]左上隅のx座標, [14]左上隅のy座標, [15]幅, [16]高さ),
108- // [17-18]int 解像度[px] ([17]幅, [18]高さ)
108+ // [17-18]int 解像度[px] ([17]幅, [18]高さ),
109+ // [19]string 停止制御 (continue ならモータを停止せず、stop ならモータを停止) [オプション]
109110 // 補足:ROI(Region of Interest:ライントレース用の画像内注目領域(四角形))
110111 case COMMAND::DCL: {
111112 CameraServer::BoundingBoxDetectorRequest detectionRequest;
@@ -121,9 +122,15 @@ vector<Motion*> MotionParser::createMotions(Robot& robot, string& commandFilePat
121122 = cv::Rect (stoi (params[13 ]), stoi (params[14 ]), stoi (params[15 ]), stoi (params[16 ]));
122123 detectionRequest.resolution = cv::Size (stoi (params[17 ]), stoi (params[18 ]));
123124
125+ bool isStopMotorPower = true ;
126+ if (params.size () >= 20 ) {
127+ isStopMotorPower = convertBool (" DCL" , params[19 ]);
128+ }
129+
124130 auto dcl = new DistanceCameraLineTrace (
125131 robot, stod (params[1 ]), stod (params[2 ]), stoi (params[3 ]),
126- PidGain (stod (params[4 ]), stod (params[5 ]), stod (params[6 ])), detectionRequest);
132+ PidGain (stod (params[4 ]), stod (params[5 ]), stod (params[6 ])), detectionRequest,
133+ isStopMotorPower);
127134 motionList.push_back (dcl);
128135 break ;
129136 }
@@ -132,7 +139,8 @@ vector<Motion*> MotionParser::createMotions(Robot& robot, string& commandFilePat
132139 // [1]:string 色, [2]:double 距離[mm], [3]:double 速度[mm/s], [4]:int X座標[px],
133140 // [5-7]:double PIDゲイン, [8-10]int lowerHSV, [11-13]int upperHSV, [14-17]int ROI座標[px]
134141 // ([14]左上隅のx座標, [15]左上隅のy座標, [16]幅, [17]高さ), [18-19]int 解像度[px] ([18]幅,
135- // [19]高さ) 補足:ROI(Region of Interest:ライントレース用の画像内注目領域(四角形))
142+ // [19]高さ) 補足:ROI(Region of Interest:ライントレース用の画像内注目領域(四角形)),
143+ // [20]string 停止制御 (continue ならモータを停止せず、stop ならモータを停止) [オプション]
136144 case COMMAND::CDCL: {
137145 CameraServer::BoundingBoxDetectorRequest detectionRequest;
138146
@@ -147,10 +155,15 @@ vector<Motion*> MotionParser::createMotions(Robot& robot, string& commandFilePat
147155 = cv::Rect (stoi (params[14 ]), stoi (params[15 ]), stoi (params[16 ]), stoi (params[17 ]));
148156 detectionRequest.resolution = cv::Size (stoi (params[18 ]), stoi (params[19 ]));
149157
158+ bool isStopMotorPower = true ;
159+ if (params.size () >= 21 ) {
160+ isStopMotorPower = convertBool (" CDCL" , params[20 ]);
161+ }
162+
150163 auto cdcl = new ColorDistanceCameraLineTrace (
151164 robot, ColorJudge::convertStringToColor (params[1 ]), stod (params[2 ]), stod (params[3 ]),
152165 stoi (params[4 ]), PidGain (stod (params[5 ]), stod (params[6 ]), stod (params[7 ])),
153- detectionRequest);
166+ detectionRequest, isStopMotorPower );
154167 motionList.push_back (cdcl);
155168 break ;
156169 }
@@ -160,7 +173,8 @@ vector<Motion*> MotionParser::createMotions(Robot& robot, string& commandFilePat
160173 // [5-7]:double PIDゲイン, [8-10]int lowerHSV, [11-13]int upperHSV, [14-17]int ROI座標[px]
161174 // ([14]左上隅のx座標, [15]左上隅のy座標, [16]幅, [17]高さ), [18-19]int 解像度[px] ([18]幅,
162175 // [19]高さ)
163- // 補足:ROI(Region of Interest:ライントレース用の画像内注目領域(四角形))
176+ // 補足:ROI(Region of Interest:ライントレース用の画像内注目領域(四角形)),
177+ // [20]string 停止制御 (continue ならモータを停止せず、stop ならモータを停止) [オプション]
164178 case COMMAND::UDCL: {
165179 CameraServer::BoundingBoxDetectorRequest detectionRequest;
166180
@@ -179,9 +193,15 @@ vector<Motion*> MotionParser::createMotions(Robot& robot, string& commandFilePat
179193 detectionRequest.resolution = cv::Size (stoi (params[18 ]), stoi (params[19 ]));
180194 }
181195
196+ bool isStopMotorPower = true ;
197+ if (params.size () >= 21 ) {
198+ isStopMotorPower = convertBool (" UDCL" , params[20 ]);
199+ }
200+
182201 auto udcl = new UltrasonicDistanceCameraLineTrace (
183202 robot, stod (params[1 ]), stod (params[2 ]), stod (params[3 ]), stoi (params[4 ]),
184- PidGain (stod (params[5 ]), stod (params[6 ]), stod (params[7 ])), detectionRequest);
203+ PidGain (stod (params[5 ]), stod (params[6 ]), stod (params[7 ])), detectionRequest,
204+ isStopMotorPower);
185205 motionList.push_back (udcl);
186206 break ;
187207 }
@@ -192,7 +212,8 @@ vector<Motion*> MotionParser::createMotions(Robot& robot, string& commandFilePat
192212 // [13-15]int 2色目lowerHSV (H, S, V), [16-18]int 2色目upperHSV (H, S, V),
193213 // [19-22]int ROI座標[px] ([19]左上隅のx座標, [20]左上隅のy座標, [21]幅, [22]高さ),
194214 // [23-24]int 解像度[px] ([23]幅, [24]高さ)
195- // 補足:ROI(Region of Interest:ライントレース用の画像内注目領域(四角形))
215+ // 補足:ROI(Region of Interest:ライントレース用の画像内注目領域(四角形)),
216+ // [25]string 停止制御 (continue ならモータを停止せず、stop ならモータを停止) [オプション]
196217 case COMMAND::DTCCL: {
197218 CameraServer::TwoColorBoundingBoxDetectorRequest detectionRequest;
198219
@@ -212,9 +233,15 @@ vector<Motion*> MotionParser::createMotions(Robot& robot, string& commandFilePat
212233 = cv::Rect (stoi (params[19 ]), stoi (params[20 ]), stoi (params[21 ]), stoi (params[22 ]));
213234 detectionRequest.resolution = cv::Size (stoi (params[23 ]), stoi (params[24 ]));
214235
236+ bool isStopMotorPower = true ;
237+ if (params.size () >= 26 ) {
238+ isStopMotorPower = convertBool (" DTCCL" , params[25 ]);
239+ }
240+
215241 auto dtccl = new DistanceTwoColorCameraLineTrace (
216242 robot, stod (params[1 ]), stod (params[2 ]), stoi (params[3 ]),
217- PidGain (stod (params[4 ]), stod (params[5 ]), stod (params[6 ])), detectionRequest);
243+ PidGain (stod (params[4 ]), stod (params[5 ]), stod (params[6 ])), detectionRequest,
244+ isStopMotorPower);
218245 motionList.push_back (dtccl);
219246 break ;
220247 }
@@ -226,7 +253,8 @@ vector<Motion*> MotionParser::createMotions(Robot& robot, string& commandFilePat
226253 // [14-16]int 2色目lowerHSV (H, S, V), [17-19]int 2色目upperHSV (H, S, V),
227254 // [20-23]int ROI座標[px] ([20]左上隅のx座標, [21]左上隅のy座標, [22]幅, [23]高さ),
228255 // [24-25]int 解像度[px] ([24]幅, [25]高さ)
229- // 補足:ROI(Region of Interest:ライントレース用の画像内注目領域(四角形))
256+ // 補足:ROI(Region of Interest:ライントレース用の画像内注目領域(四角形)),
257+ // [26]string 停止制御 (continue ならモータを停止せず、stop ならモータを停止) [オプション]
230258 case COMMAND::CDTCCL: {
231259 CameraServer::TwoColorBoundingBoxDetectorRequest detectionRequest;
232260
@@ -246,10 +274,15 @@ vector<Motion*> MotionParser::createMotions(Robot& robot, string& commandFilePat
246274 = cv::Rect (stoi (params[20 ]), stoi (params[21 ]), stoi (params[22 ]), stoi (params[23 ]));
247275 detectionRequest.resolution = cv::Size (stoi (params[24 ]), stoi (params[25 ]));
248276
277+ bool isStopMotorPower = true ;
278+ if (params.size () >= 27 ) {
279+ isStopMotorPower = convertBool (" CDTCCL" , params[26 ]);
280+ }
281+
249282 auto cdtccl = new ColorDistanceTwoColorCameraLineTrace (
250283 robot, ColorJudge::convertStringToColor (params[1 ]), stod (params[2 ]), stod (params[3 ]),
251284 stoi (params[4 ]), PidGain (stod (params[5 ]), stod (params[6 ]), stod (params[7 ])),
252- detectionRequest);
285+ detectionRequest, isStopMotorPower );
253286 motionList.push_back (cdtccl);
254287 break ;
255288 }
@@ -345,38 +378,45 @@ vector<Motion*> MotionParser::createMotions(Robot& robot, string& commandFilePat
345378 // [2]:int preTargetAngle
346379 // [3]:int postTargetAngle
347380 // [4]:int 回頭基準パワー値
348- // [5]:double threshold(動体検出用)
349- // [6]:double minArea(動体矩形とみなす最小面積)
350- // [7]:int ROIの左上X座標
351- // [8]:int ROIの左上Y座標
352- // [9]:int ROIの幅
353- // [10]:int ROIの高さ
354- // [11]:int position(0=初期位置)
355- // [12]:string 回頭方法(relative or absolute)
356- // [13]:double kp(回頭PIDのP値)[オプション]
357- // [14]:double ki(回頭PIDのI値)[オプション]
358- // [15]:double kd(回頭PIDのD値)[オプション]
381+ // [5]:double preTargetDistance(撮影前の直進距離)
382+ // [6]:double postTargetDistance(撮影後の後退距離)
383+ // [7]:double preTargetSpeed(撮影前の直進速度)
384+ // [8]:double postTargetSpeed(撮影後の後退速度)
385+ // [9]:int armPower(アームを上げるpower値)
386+ // [10]:double threshold(動体検出用)
387+ // [11]:double minArea(動体矩形とみなす最小面積)
388+ // [12]:int ROIの左上X座標
389+ // [13]:int ROIの左上Y座標
390+ // [14]:int ROIの幅
391+ // [15]:int ROIの高さ
392+ // [16]:int position(0=初期位置)
393+ // [17]:string 回頭方法(relative or absolute)
394+ // [18]:double kp(回頭PIDのP値)[オプション]
395+ // [19]:double ki(回頭PIDのI値)[オプション]
396+ // [20]:double kd(回頭PIDのD値)[オプション]
359397
360398 case COMMAND::BCA: {
361399 cv::Rect roi;
362400
363401 bool isClockwise = convertBool (" BCA" , params[1 ]);
364- roi = cv::Rect (stoi (params[7 ]), stoi (params[8 ]), stoi (params[9 ]), stoi (params[10 ]));
402+ roi = cv::Rect (stoi (params[12 ]), stoi (params[13 ]), stoi (params[14 ]), stoi (params[15 ]));
365403
366404 BackgroundPlaCameraAction* bca;
367- if (params.size () >= 16 ) {
405+ if (params.size () >= 21 ) {
368406 // PID値が指定されている場合
369- bca = new BackgroundPlaCameraAction (robot, isClockwise, stoi (params[2 ]), stoi (params[3 ]),
370- stoi (params[4 ]), stod (params[5 ]), stod (params[6 ]),
371- roi, stoi (params[11 ]),
372- convertRotationModeToBool (params[12 ]),
373- stod (params[13 ]), stod (params[14 ]), stod (params[15 ]));
407+ bca = new BackgroundPlaCameraAction (
408+ robot, isClockwise, stoi (params[2 ]), stoi (params[3 ]), stoi (params[4 ]),
409+ stod (params[5 ]), stod (params[6 ]), stod (params[7 ]), stod (params[8 ]), stoi (params[9 ]),
410+ stod (params[10 ]), stod (params[11 ]), roi, stoi (params[16 ]),
411+ convertRotationModeToBool (params[17 ]), stod (params[18 ]), stod (params[19 ]),
412+ stod (params[20 ]));
374413 } else {
375414 // PID値が指定されていない場合、デフォルト値を使用
376- bca = new BackgroundPlaCameraAction (robot, isClockwise, stoi (params[2 ]), stoi (params[3 ]),
377- stoi (params[4 ]), stod (params[5 ]), stod (params[6 ]),
378- roi, stoi (params[11 ]),
379- convertRotationModeToBool (params[12 ]));
415+ bca = new BackgroundPlaCameraAction (
416+ robot, isClockwise, stoi (params[2 ]), stoi (params[3 ]), stoi (params[4 ]),
417+ stod (params[5 ]), stod (params[6 ]), stod (params[7 ]), stod (params[8 ]), stoi (params[9 ]),
418+ stod (params[10 ]), stod (params[11 ]), roi, stoi (params[16 ]),
419+ convertRotationModeToBool (params[17 ]));
380420 }
381421
382422 motionList.push_back (bca);
@@ -416,6 +456,13 @@ vector<Motion*> MotionParser::createMotions(Robot& robot, string& commandFilePat
416456 break ;
417457 }
418458
459+ // STOP: 走行体を停止させる動作
460+ case COMMAND::STOP: {
461+ auto stop = new Stop (robot);
462+ motionList.push_back (stop);
463+ break ;
464+ }
465+
419466 // PCIDS: IMU角度補正直進に、カメラ画像の色検出による停止条件を追加した動作
420467 // [1]:double 距離[mm], [2]:double 速度[mm/s], [3-5]:double 角度補正PIDゲイン(kp, ki, kd),
421468 // [6-8]:int HSV下限, [9-11]:int HSV上限, [12-15]:int ROI座標[px] ([12]左上x, [13]左上y,
@@ -479,7 +526,8 @@ COMMAND MotionParser::convertCommand(const string& str)
479526 { " SS" , COMMAND::SS }, // カメラ撮影動作
480527 { " MCA" , COMMAND::MCA }, // ミニフィグのカメラ撮影動作
481528 { " BCA" , COMMAND::BCA }, // 風景・プラレールのカメラ撮影動作
482- { " CRA" , COMMAND::CRA }, // カメラ検出失敗時の復帰動作
529+ { " CRA" , COMMAND::CRA }, // カメラ復帰動作
530+ { " STOP" , COMMAND::STOP }, // 走行体を停止させる動作
483531 { " PCIDS" , COMMAND::PCIDS }, // 画像ラインを用いた距離直進
484532 { " IS" , COMMAND::IS }, // IMU設定
485533 { " DTCCL" , COMMAND::DTCCL }, // 2色指定距離カメラライントレース
@@ -500,7 +548,20 @@ bool MotionParser::convertBool(const string& command, const string& stringParame
500548 // 末尾の改行を削除
501549 string param = StringOperator::removeEOL (stringParameter);
502550
503- // 回転動作(AR,IMUR,MCA,BCA,CRA)の場合、"clockwise"ならtrue(時計回り)、"anticlockwise"ならfalse(反時計回り)に変換
551+ // カメラPIDトラッキング系の停止制御(continueなら継続、stopなら停止)
552+ if (command == " DCL" || command == " CDCL" || command == " UDCL" || command == " DTCCL"
553+ || command == " CDTCCL" ) {
554+ if (param == " continue" ) {
555+ return false ;
556+ } else if (param == " stop" ) {
557+ return true ;
558+ } else {
559+ cout << " 'continue' か 'stop'を入力してください" << endl;
560+ return true ;
561+ }
562+ }
563+
564+ // 回転動作(AR,IMUR,MCA,BCA)の場合、"clockwise"ならtrue(時計回り)、"anticlockwise"ならfalse(反時計回り)に変換
504565 if (command == " AR" || command == " IMUR" || command == " MCA" || command == " BCA"
505566 || command == " CRA" ) {
506567 if (param == " clockwise" ) {
0 commit comments