\documentclass{jarticle}
\usepackage{si2002e}
\usepackage{graphicx}

\usepackage{amsmath}
\usepackage[T1]{fontenc}
\usepackage{mathptm}
\usepackage{pifont}

\begin{document}
\title{走行データの記録と再生、およびシミュレーションが可能なロボット用
ソフトウェア・ライブラリの作成}
\author{○上村 聡文}
\engauthor{○Satofumi KAMIMURA}

\abstract{
ロボット用プログラムの迅速な開発とデバッグができることを目標として
作成したロボット用のソフトウェア・ライブラリについて説明する。
このライブラリは実際の走行データを記録して、それを再生する機能を持つ。
この機能により、問題が起きたときのプログラムの動作をオフラインで何度も
再現させることができ、問題解決が容易になる。
また、記録と再生の機能の他に、シミュレータを動作させることができ
作成したアルゴリズムの初期評価を実機を用いずに行うことができる。
}

\keyword{移動ロボット, シミュレータ, デバッグ}

\setlength{\baselineskip}{4.3mm}	% 行間の設定
\maketitle
\thispagestyle{empty}
\pagestyle{empty}


\section{目的}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
私の生活圏とつくばチャレンジのコースは離れているため、
「シミュレータがあったら、アルゴリズムの評価が楽に違いない！」との
思い付きでライブラリの開発を開始した。


\section{実現しようとしたこと}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ライブラリには、シミュレーションする機能と、実環境ならではの問題を
デバッグするための機能を持たせた。

シミュレーションする機能は、アルゴリズムの評価や実装間違いの修正などの
プログラミングにおける問題を修正するために用いる。
この機能は、3D シミュレータで提供する。(Fig.\ref{fig:sim_abst})
%
\begin{figure}[htb]
 \begin{center}
  \includegraphics[width=80mm]{img/sim_abst.eps}\vspace{-1mm}
  \caption{シミュレータ画面}\vspace{-1mm}
  \label{fig:sim_abst}
 \end{center}
\end{figure}

実環境ならではの問題をデバッグする機能は、
子供が想定外の大人数で取り囲んでくるなどの
想定していなかった問題を開発者が理解するために用いる。
この機能は、実機による走行時のログを記録し、同じプログラム上で
再生する機能により提供する。(Fig.\ref{fig:playback_abst})

再生時に記録時と同じ動作をすることは、プログラムが有限状態機械であり、
プログラムへの入力を全て記録して再現できれば、その動作は同じなる、
という考え方に基づいている。
%
\begin{figure}[htb]
 \begin{center}
  \includegraphics[width=50mm]{img/playback_abst.eps}\vspace{-1mm}
  \caption{記録時と再生時の違い}\vspace{-1mm}
  \label{fig:playback_abst}
 \end{center}
\end{figure}
%
この機能により、プログラムがどう動いたかをオフラインで
繰り返し再現させることができ、開発者が問題を理解しやすくなる。

作成するライブラリでは、これら機能に加え、
実機での実行時に画面に情報を出力するモニタ機能を提供し、これらの機能を
実行時のコマンドライン引数で切替えられるようにした。
%
\begin{verbatim}
# 通常の実機実行
% ./program

# simulation: シミュレータ起動
% ./program -s

# record: 実機データの記録
% ./program -r

# playback: 記録済みデータの再生
% ./program -p

# monitor: デバッグ情報を画面に描画しながら動作
% ./program -r
\end{verbatim}

これらの機能の切替えは、C++ プログラムの main() 関数を置換することで
提供しており、ユーザはモードを意識したプログラムをする必要はない。
%
\begin{verbatim}
// 走行モジュール接続までの C++ サンプル
#include <qrk_main.h>
#include <mBeegoDrive.h>

using namespace qrk;
using namespace std;

int main(int argc, char *argv[])
{
  // 接続
  mBeegoDrive run;
  if (! run.connect("/dev/usb/ttyUSB0")) {
    cout << "BeegoDrive::connect: "
         << run.what() << endl;
    return 1;
  }
\end{verbatim}
%
シミュレータ用のデバイス設定、および 3D 環境の定義はユーザプログラムとは
別に Lua スクリプトにて定義する。
%
\begin{verbatim}
-- 走行デバイス作成と初期位置の設定
DeviceManager():createDevice("/dev/ttyUSB0",
                             "BeegoDrive",
                             "run")
DeviceManager():device("run"):activate()
local run = DeviceManager():model("run")
run:setPosition(Position(0, 0, deg(0)),
                nil, false)
\end{verbatim}
%
また、再生とシミュレータでは動作時の処理時間の流れは GUI で変更できる。(Fig.\ref{fig:time_control_gui})
%
\begin{figure}[htb]
 \begin{center}
  \includegraphics[width=50mm]{img/time_control.eps}\vspace{-1mm}
  \caption{処理時間の操作 GUI}\vspace{-1mm}
  \label{fig:time_control_gui}
 \end{center}
\end{figure}
%


\section{ライブラリの実装について}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
ライブラリの構成について記述する。
ライブラリは C++ で実装した。Lua スクリプト用のグルーライブラリも
用意してあり、C++ および Lua スクリプトでのプログラムが可能となっている。
Lua スクリプトが利用できることで、コンパイルレスな開発ができる。

以下、サンプルとして座標系の 1[m] 前方まで走行して停止する
プログラムを示す。
%
\begin{verbatim}
// C++ プログラムより抜粋
run.stopLine(1000, 0, deg(0));
while (! run.isStable()) {
  // 目的位置に移動するまで待つ
  delay(100);
}

-- Lua プログラムより抜粋
run:stopLine(Position(1000, 0, deg(0)), nil)
while not run:isStable() do
   -- 目的位置に移動するまで待つ
   delay(100)
end
\end{verbatim}
%
作成したライブラリでは、デバイスとのやりとりを制御するだけの基本機能と、
それにシミュレータ、記録と再生、の機能を付加した拡張機能との、
２つのクラスを提供している。
走行制御モジュールの場合、URG 用の基本機能が UrgDevice クラスで
提供されており、それに付加機能を追加したクラスを mUrgDevice クラスで
提供している。(Fig.\ref{fig:class_struct})
%
\begin{figure}[htb]
 \begin{center}
  \includegraphics[width=30mm]{img/class_struct.eps}\vspace{-1mm}
  \caption{クラス構成}\vspace{-1mm}
  \label{fig:class_struct}
 \end{center}
\end{figure}
%

\subsection{実装の詳細}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
記録と再生の仕組みは、記録時に RS232 などで通信した内容を記録しておき、
それを再生時に TCP/IP 通信に置き換えてプログラムに渡す方法で実現している。

シミュレータでは、内部に 3D 物理演算エンジンの ODE(Open Dynamics Engine)
を用い、1[msec] でのシミュレーションを行っている。

また、シミュレーション時の 3D 環境の定義は Lua スクリプトで行っており、
シミュレーション環境への物体への追加や削除はコンパイルレスで行える。


\section{対象とするロボット、デバイス}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
今回作成したライブラリでは、独立駆動二輪のロボットと、
レーザレンジ距離センサを対象とした。
これは、参加予定のロボットがレーザレンジ距離センサを搭載した
独立駆動二輪のロボットなためである。
具体的には、テクノクラフト製の「ビーゴ」と北陽電機製の「Top-URG」を
用いてライブラリの動作確認を行った。

ライブラリの評価はビーゴと Top-URG を用いて評価を行ったが、
パラメータを変更することで、同様のロボットやセンサもライブラリの
制御対象とすることができるようにしてある。


\section{課題}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
一通りの機能は動作するが、4 倍速でシミュレーションや再生を行ったときに
動作のぶれが目立つだめ、適切に高速化を行いたい。
また、3D 環境のデータは、Googl SketchUp などの CAD データを
スクリプトで変換して使えるようにしたい。


\section{今後の予定}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
今後は安価なロボットを製作し、その上でライブラリが動作するように調整する。
また、肝心の位置推定、経路走行のアルゴリズムを検討・作成し、
評価を行いたい。

本プロジェクトは下記サイトにて、オープンソースでの開発を行っている。\\
\\
http://qrobosdk.sourceforge.jp/
\end{document}
