/* ビーゴを反時計回りに3回転させなさい、また、時計回りに3回転させなさい Satofumi KAMIMURA $Id$ */ #include <mRunCtrl.h> #include <vutils.h> #include <stdio.h> using namespace VXV; int main(int argc, char *argv[]) { try { mRunCtrl run; if (initConnection(&run, argc, argv) < 0) { exit(1); } vmonitor::show(); run.rotateAngle(deg(360 * 3)); // 反時計回りの場合 // run.rotateAngle(deg(-360 * 3)); // 時計回りの場合 waitStable(run, 100); // 回転が終わるまで待つ VXV::Delay(1000); // vmonitor::show() のため。なくてもよい } catch (std::exception& e) { printf("exception: %s\n", e.what()); } return 0; }
/* ビーゴを 1[m]前進させて停止させなさい、また、1[m]後進させて停止させなさい Satofumi KAMIMURA $Id$ */ #include <mRunCtrl.h> #include <vutils.h> #include <stdio.h> using namespace VXV; int main(int argc, char *argv[]) { try { mRunCtrl run; if (initConnection(&run, argc, argv) < 0) { exit(1); } vmonitor::show(); #if 1 // 前進の場合 run.stopToLine(VXV::Position(1000, 0, deg(0))); waitStable(run, 100); #else // 後進の場合 run.stopToLine(VXV::Position(-1000, 0, deg(0))); waitStable(run, 100); #endif VXV::Delay(1000); } catch (std::exception& e) { printf("exception: %s\n", e.what()); } return 0; }
ちなみに、後進させるためには、目標並進速度を負の値にしてから直線追従コマンドを発行する
/* 後進する場合 Satofumi KAMIMURA $Id$ */ #include <mRunCtrl.h> #include <vutils.h> #include <stdio.h> using namespace VXV; int main(int argc, char *argv[]) { try { mRunCtrl run; if (initConnection(&run, argc, argv) < 0) { exit(1); } vmonitor::show(); // 並進速度を負の値にしてから経路追従コマンドを発行 run.setStraightRefVel(-300); run.followLine(VXV::Position(0, 0, deg(0))); VXV::Delay(3000); run.stop(); VXV::Delay(1000); } catch (std::exception& e) { printf("exception: %s\n", e.what()); } return 0; }
/* 図のように、ビーゴを1[m]前進させて停止し、右90[degree]回転して停止、 さらに1[m]前進して停止させなさい。 この時、ロボットは急に止まれないことを考慮して、プログラムを工夫しなさい。 Satofumi KAMIMURA $Id$ */ #include <mRunCtrl.h> #include <vutils.h> #include <stdio.h> using namespace VXV; static void stopToTarget(mRunCtrl& run, const VXV::Position& target) { run.followLine(target); while (abs(run.getLengthToLine(target)) > 300) { // 条件が成立するまでポーリング。しばらく移動するのを待つため sleep する VXV::Delay(100); } run.stopToLine(target); waitStable(run, 100); } int main(int argc, char *argv[]) { try { mRunCtrl run; if (initConnection(&run, argc, argv) < 0) { exit(1); } vmonitor::show(); // 直進 VXV::Position target(1000, 0, deg(0)); stopToTarget(run, target); // 回転 run.rotateToDirection(deg(-90)); waitStable(run, 100); // 直進 target = VXV::Position(1000, -1000, deg(-90)); stopToTarget(run, target); VXV::Delay(1000); } catch (std::exception& e) { printf("exception: %s\n", e.what()); } return 0; }
むしろ、追従曲率を変化させて動作を確認するとよい
/* 図のように、ビーゴをスタート地点から前方1[m]横方向に伸びる直線に追従させなさい。 1) 2つの直進命令を用いて、直線 L1 を追従してから直線 L2 に追従 2) 1つの直進命令を用いて、直線 L2 に追従 Satofumi KAMIMURA $Id$ */ #include <mRunCtrl.h> #include <vutils.h> #include <stdio.h> using namespace VXV; int main(int argc, char *argv[]) { try { mRunCtrl run; if (initConnection(&run, argc, argv) < 0) { exit(1); } vmonitor::show(); //run.setCurveRadius(300); #if 1 // 1) の場合 VXV::Position target(1000, 0, deg(0)); run.followLine(target); while (abs(run.getLengthToLine(target)) < 300) { VXV::Delay(100); } run.followLine(VXV::Position(1000, 1000, deg(-90))); #else // 2) の場合 run.followLine(VXV::Position(1000, 1000, deg(-90))); #endif waitStable(run, 100); VXV::Delay(2000); run.stop(); VXV::Delay(1000); } catch (std::exception& e) { printf("exception: %s\n", e.what()); } return 0; }
/* 図のように、半径1[m]の 1/4円弧の扇形の軌跡を描くようにビーゴを走行させなさい Satofumi KAMIMURA $Id$ */ #include <mRunCtrl.h> #include <vutils.h> #include <stdio.h> using namespace VXV; static void stopAndTurn(mRunCtrl& run, const VXV::Position& target) { while (abs(run.getLengthToLine(target)) > 300) { VXV::Delay(100); } run.stopToLine(target); waitStable(run, 100); // この課題では、経路の切り替え毎に回転が必要なので、ここで回転させる run.rotateAngle(deg(-90)); waitStable(run, 100); } int main(int argc, char *argv[]) { try { mRunCtrl run; if (initConnection(&run, argc, argv) < 0) { exit(1); } vmonitor::show(); // 最初の直線 VXV::Position target(1000, 0, deg(0)); run.followLine(target); stopAndTurn(run, target); // 円弧 run.followCircle(VXV::Grid(0, 0), 1000); stopAndTurn(run, VXV::Position(0, -1000, deg(180))); // 2番目の直線 target = VXV::Position(0, 0, deg(90)); run.followLine(target); stopAndTurn(run, target); VXV::Delay(1000); } catch (std::exception& e) { printf("exception: %s\n", e.what()); } return 0; }
/* ビーゴの前方に板を置き、測域センサがどのような値を受け取っているかを 画面に表示させなさい。 Satofumi KAMIMURA $Id$ */ #include <mURGCtrl.h> #include <vutils.h> #include <stdio.h> using namespace VXV; int main(int argc, char *argv[]) { try { mURGCtrl urg; if (initConnection(&urg, argc, argv, false) < 0) { exit(1); } vmonitor::show(); unsigned beginTicks = VXV::GetTicks(); while (VXV::GetTicks() - beginTicks < 10000) { // 測定 urg.capture(); urg.convert(); // 描画 vmonitor::clear(); vmonitor::drawPoints(urg.crd_points, Red); } } catch (std::exception& e) { printf("exception: %s\n", e.what()); } return 0; }
/* ビーゴを直進させ、障害物が前方 60[cm]以内に入ったら測域センサで感知し、 ビーゴを停止させなさい。 また、障害物がなくなると再び直進するようにしないさい。 Satofumi KAMIMURA $Id$ */ #include <mURGCtrl.h> #include <mRunCtrl.h> #include <vutils.h> #include <stdio.h> using namespace VXV; enum { BodyWidth = 330, // ビーゴの筐体幅 }; // 筐体の前方にある物体との最も近い距離を返す static int getFrontLength(std::vector<VXV::Grid3D>& points) { int min_length = -1; for (std::vector<Grid3D>::iterator it = points.begin(); it != points.end(); ++it) { if ((abs(it->y) < (BodyWidth + 100)/2) && (it->x > 0)) { if ((min_length < 0) || (min_length > it->x)) { min_length = it->x; } } } return min_length; } int main(int argc, char *argv[]) { try { mRunCtrl run; mURGCtrl urg; if ((initConnection(&run, argc, argv) < 0) || (initConnection(&urg, argc, argv) < 0)) { exit(1); } vmonitor::show(); run.followLine(VXV::Position(0, 0, deg(0))); //run.followCircle(Grid(0, 0), 1000); unsigned long beginTicks = VXV::GetTicks(); bool moving = true; while (VXV::GetTicks() - beginTicks < 30000) { urg.capture(); urg.convert(); int length = getFrontLength(urg.crd_points); if ((length > 0) && (length < 600)) { if (moving) { // 直前の移動コマンドを待避してから停止コマンドを発行 run.push_runState(); run.stop(); run.pop_runState(); moving = false; } } else if (!moving) { // 移動を再開 run.lastMoveCommand(); moving = true; } } VXV::Delay(1000); } catch (std::exception& e) { printf("exception: %s\n", e.what()); } return 0; }