チュートリアル

QRK を使ったプログラム開発について解説しています。

はじめに

QRK の目的

QRK は、ロボットを研究目的でコアに使う人から、教育用にシミュレータのみを使う人まで、多くの人が使いやすいライブラリを目指しています。
また、ライブラリ開発はオープンソースで行い、省コストで導入できるロボット開発環境を目指します。

QRK を用いたプログラムの開発スタイル

このライブラリは、プログラム開発を効率的に行うことを目指して設計されています。
主な特徴としては、

などがあります。

ロボットが移動するプログラムの作成

それでは、ロボットが移動するプログラムを作ってみましょう。
ロボットは、まっすぐ進んで停止し、180 [deg] 回転して戻ってくるようにします。

move_sample_path.png

作成するプログラムの移動経路

まずは、main() 関数を作ってみましょう。

#include <qrk_main.h>

using namespace qrk;


int main(int argc, char *argv[])
{
  // !!! 未実装

  return 0;
} 

ここまで入力したら move_sample.cpp というファイル名で保存し、コンパイルしてみます。

プログラムのコンパイル

move_sample.cpp と同じフォルダに、move_sample.pro というファイルを作ります。

move_sample.pro

CONFIG += debug
QT += network opengl
TEMPLATE = app
TARGET =
DEPENDPATH += .
INCLUDEPATH += .

QMAKE_CXXFLAGS = `qrk-config --qt_cflags`
QMAKE_LIBS = `qrk-config --qt_libs`

# Input
SOURCES += move_sample.cpp 

あとは、

% qmake
% make 

と入力すると、コンパイルが行われます。1度 qmake を実行した後は make と入力するだけでコンパイルが行われます。

プログラムの実行

では、プログラムを実行してみましょう。ターミナルか DOS プロンプトから以下のように入力します。(Linux の場合は ./move_sample というファイル名になります。)

% ./debug/move_sample.exe 

まだ、何も処理を記述していないので、すぐに実行が終わると思います。
では、次にシミュレータを起動するよう指定して実行してみましょう。プログラムの引数に -s を指定して実行します。

% ./debug/move_sample.exe -s 

今度は、シミュレーション画面が表示されたと思います。
(もし、シミュレーションしか実行しないのであれば simulation_only.txt という空のファイルを配置しておくことで -s の指定を省略できます。)

simulation_nothing.png

何もないシミュレーション画面

シミュレータ上にロボットを配置するには、ロボットの種類や位置をシミュレータに指示する必要があり、それを記述しておくのが simulation_settings.lua というファイルです。
ビーゴをシミュレータ上に配置するには、以下のように記述します。

simulation_settings.lua

-- シミュレーションの設定ファイル

-- 利用デバイスの初期化
-- !!! ビーゴを /dev/usb/ttyUSB という通信デバイスに割り当て、run という名前を付ける
DeviceManager():createDevice("/dev/usb/ttyUSB0", "BeegoDrive", "run")

-- デバイスを作成
-- !!! run を実際に生成する
DeviceManager():device("run"):activate()

-- デバイス位置を設定
-- !!! モデルの位置を設定する
local run = DeviceManager():model("run")
run:setPosition(Position(0, 0, deg(0)), nil, false) 

この設定ファイルを move_sample と同じフォルダに入れてシミュレータを起動すると、今度はロボットが表示されます。

simulation_beego.png

シミュレータに配置されたロボット

それでは、実際にプログラムを記述して、シミュレータ上で実行してみましょう。
今回のプログラムは、以下のようになります。

#include <qrk_main.h>
#include <mBeegoDrive.h>
#include <delay.h>
#include <iostream>

using namespace qrk;
using namespace std;


int main(int argc, char *argv[])
{
  mBeegoDrive run;

  // 接続
  if (! run.connect("/dev/usb/ttyUSB0")) {
    cout << "BeegoDrive::connect: %s\n" << run.what() << endl;
    return 1;
  }

  // まっすぐ進んで停止
  run.stopLine(1000, 0, deg(0));
  while (! run.isStable()) {
    delay(100);
  }

  // 180 [deg] 回転
  run.rotate(deg(-180));
  while (! run.isStable()) {
    delay(100);
  }

  // 戻ってきて停止
  run.stopLine(0, 0, deg(-180));
  while (! run.isStable()) {
    delay(100);
  }

  return 0;
}

シミュレーション実行したときの動画

!!! 実行したときの動画サンプル

シミュレーション上でロボットが移動して戻ってきたら、プログラムは正常に動作しています。
ロボットを制御するプログラミングについては サンプルプログラム をご覧下さい。

環境をスキャンするプログラムの作成

!!!

!!! オブジェクトを配置しましょう。

!!! プログラムの動作を変えない範囲ならば、シミュレータ画面にデバッグ表示を追加し、なぜ思い通りに動かなかったかが理解しやすくなります。

!!! 画像

!!! このデバッグ表示は、レーザレンジセンサのデータから線分を抽出する場合などの、アルゴリズムの作成時にも利用できます。

Lua によるプログラムの作成

!!! 動作の仕組みについて

!!! C++ プログラムの準備

!!! Lua スクリプトでの動作確認

!!!

Lua で提供されている関数を使うだけならば、再コンパイルは必要ありません。 再コンパイルが必要になるのは、以下の場合です。

シミュレーションを一時停止させておき、その間に Lua スクリプトを変更して実行を再開することすら可能です。

!!! 以下の項目は、別のページにて詳細に解説する

シミュレーションでのプログラム実行

!!!

!!! Windows の場合、セキュリティの警告画面が表示される、という旨、対処法を記述

ロボットの配置

!!! 座標系について説明

!!! 位置、向きについて説明

!!! API については、どこを見ればよいかを説明

!!!

センサの配置

!!!

障害物の配置

!!!

ロボットへセンサを配置

!!!

!!! fixed について説明

実際のロボットでのプログラム実行

!!!

ビーゴ

!!!

Three


--- Top of page ---