/*!
  \page log_091218_page 2009/12/18 その１

  - 概要
    - \ref log_091218_schedule
    - \ref log_091218_coordinate
    - \ref log_091218_sh7045f
    - \ref log_091218_robedo
    - \ref log_091218_myrobot
    - \ref log_091218_poles


  \section log_091218_schedule 日時を付加した開発スケジュールの送付

  \ref log_091204_schedule について
  \verbatim
「月日のついたスケジュールはないんですか？」 \endverbatim

  とのコメントをもらったので、予定を書き出してみる。\n
  "(2010/04)" と記述した場合、2010 年の 4 月までに終わることを目指す。

  - ロボットの準備
    - 走るものを作る (2010/04)
    - センサを取り付けて走行させる (2010/05)

  - 基礎アルゴリズムの評価 (2010/06)
    - 壁沿い走行
    - 点列の追従走行
    - A* を用いた障害物回避のモジュール化
    - 壁を用いた位置推定
    - ポールを用いた位置推定
    - ICP マッチングを作った位置推定の評価
    - 向き推定
    - 移動物体の検出
      - 移動物体のトラッキング
    - 地図の画像生成
      - 画像に追加したデータからの経路、壁、ポール位置データの生成
    - URG データだけからの地図生成
    - データから壁沿い走行やポールを用いた位置推定を使い分けて走行する方法の検討

  - ライブラリを作成する
    - 室内環境のナビゲーション用プログラムを作る (2010/07)
      - 推定位置、URG データを用いて 通路と交差点を判別し、ナビゲーションを行う
        - 経路上に障害物がある場合の対処もできるようにする
          - 可能ならば避ける
          - 避けられないならば、別ルートを探索する (つくチャレとは関係なさそう)
    \n \n
    - 移動物のトラッキングを、センサを固定した状態で行う (2010/07)
      - 環境中の物体か、移動物体かを判別するのに用いる
    \n \n
    - 屋外環境への対処 (2010/08)
      - 特徴的な木の配置などのパターンから自己位置を推定できるようにする
      - しげみなどの特徴点の取りにくい環境データの処理方法を検討して実装する
        - 詳細未定

  - 実環境でのテスト (2010/09)
    - 実際のコースでなくてよいので、屋外環境のコースを走らせる
      - 大学、会社の敷地内、河川敷など


  \section log_091218_coordinate 座標系のデータ構成について

  \ref log_091204_coordinate について
  \verbatim
「親座標系が子座標系の原点を持っているのはおかしい気がする
  親座標系に対する原点を持っているのは子座標系自身であるべきじゃない？
  今の方法だと、例えば、親座標系をコピーしたときに、子座標系がついてくることになっちゃうよ」 \endverbatim

  とのコメントをもらったので、再考してみる。

  - 考察
    - 座標系のコピーについて
      - 確かにコピーの際に子の座標系もコピーするのは問題がありそうなので、子の座標系はコピーしない
      - 親の座標系へのポインタと、親座標系のどこに自座標系の原点があるかは、コピー後も保持する
    \n \n
    - 座標系を定義する API について
      - 内部のデータ構造とは関係なく API を決める
        - 子のメソッドで親座標系に原点を定義する方法と、親のメソッドで子の座標系に定義する方法があるが、意味は同じなので、どちらかのみ提供する
        \verbatim
// 子のメソッドで親座標系に原点を定義する方法 (案)
coordinate.setOriginTo(parent, Position<long>(100, 0, deg(0)));

// 親のメソッドで子の座標系に定義する方法 (案)
coordinate.setChild(child, Position<long>(100, 0, deg(0))); \endverbatim
        - 個人的には「子のメソッドで親座標系に原点を定義する方法」にしたい
    \n \n
    - 座標変換の処理について
      - 座標変換は親から子に向かう方向と、子から親に向かう方向の両方が考えられるが、子から親へノードがたどれれば、どちらの変換も可能。
        - 子から親へたどるのは、指定ノードに向かうときの処理が楽そうだから
          - 子から親へ向かって座標変換するときは、子の座標系が親へのポインタを持って入ればよい
          - 親から子へ向かって座標変換するときは、子から親へたどるときの処理を再帰関数で呼び出し、再起呼び出しから戻るときに座標変換の処理を行えばよい
      - ある座標系を削除するときに、その子の座標系の張り替えを行うときのために、親座標系は子の座標系へのポインタも持つ
        - 結果的に、各座標系は親座標系へのポインタと子座標系のポインタの両方を持つ


  \section log_091218_robedo Robedo three のモータを回転させる

  下記の Phidget の Programming サイトから "C/C++ Code Sample" をダウンロード。

  http://www.phidgets.com/programming_resources.php

  MotorControl-simple.c をコンパイルして実行。

  - 左側の車輪が回転するのを確認。(左側の車輪が ID 0 らしい)
  - 地面に片輪のみ接地させて走行速度を確認した感じでは、秒速 1.2 [m] くらい

  回転にとっかかりがあるようなので強引に回したら、ギヤが欠けたらしく回転がガタガタするようになった。なので分解した。

  \image html log_091218_motors.jpg 分解したときの写真

  分解した結果、ギヤが欠けているのを確認した。

  \image html log_091218_gears.jpg ギヤの拡大図 (赤で囲んだ箇所が欠けた)

  日本橋に行き、同じギヤがあるか探してみようと思う。\n
  DC モータを買い直してもよい。
  - 正直、あきらめてもよい気がしている。Robedo は、もういい

  また、自作ロボットで経路追従ができるコントローラを作るまでは、速度制御ができるコントローラとして Phidget のコントローラを使うことを検討したい。


  \section log_091218_myrobot 自作ロボット作成予定の書き出し

  \subsection log_091218_myrobot_spec 仕様

  - 独立駆動２輪、補助輪１つ
  - ノート PC (モバイル PC) を搭載して動作を制御する
  - バッテリーを搭載する
  - URG センサを取り付けられるようにする

  \subsection log_091218_myrobot_task 実現すること

  - ユーザからのコマンドによる両輪の速度(加速度)の制御
  - ユーザからのコマンドによる直線、円弧の経路への追従制御
  - (可能ならば)エンコーダなどを用いて、推定の自己位置を返す

  \subsection log_091218_myrobot_schedule 予定

  - 概略
    - モータ、モータドライバの購入 (12月中)
    - 評価用の制御基板を作成し、モータのみで回転制御させる (1月中)
    - CPU (PIC) を接続した評価用の制御基板を作成し、USB 接続で制御する (2月中)
    - モータを筐体にとりつけて走行制御させる (3月中)

  - 詳細検討
    - モータについて
      - 最初のロボットでは、エンコーダなしの DC モータを用いる
        - 左右輪の制御を厳密にしたくなったら、別途検討する
      - 候補
        - AO-8008 タミヤギヤードモーター 3633K75
          - http://www.tamiya.com/japan/robocon/robo_parts/g_motor/g_motor.htm
    \n \n
    - 車輪について
      - 屋外での利用を予定しているため、大きめの直径のものを使う
        - モンスタートラック用のタイヤが候補
          - ラジコンショップで実際に見てから考える。とりあえず適当に買う。
    \n \n
    - モータドライバについて
      - 千石電商のリストから候補を検討する
        - http://www.sengoku.co.jp/mod/sgk_cart/search.php?toku=%2594%25BC%2593%25B1%2591%25CC%2582%25C7%2582%25E7%2582%25A2%2582%25CE&cond8=or&dai=&chu=&syo=&k3=0&pflg=n&list=1
    \n \n
    - 電源について
      - タミヤのギヤードモータは 7.2 V 駆動なので、ラジコン用の 7.2 V 電源の利用を検討する
        - 単三電池の 6 本を直接につなぐのでもよい
      \n \n
      - Top-URG が 12.0 V 駆動な点について
        - モータも 12.0 V 系にするか、Top-URG 用に別電源を追加するかは別途検討する
          - Classic-URG を USB バスパワーで動作させる場合には電源が不要なのも、URG の電源を別にする要因のひとつ
          - COSEL あたりの DC-DC コンバータをモータ用に使おうと思ったが、7.2 V 出力とか、見当たらない...
      \n \n
      - 可能ならば、現在の電圧を表示するためのパネルを用意する
    \n \n
    - 制御コントローラについて
      - PC との通信を簡単に行うため、USB 接続を検討している
        - 各輪の速度制御のみならば、PIC 程度でよさそう
        - 経路追従を実現するなら、マイコンの利用を検討すべき


  \section log_091218_tamiya ギヤードモータの回転実験

  "タミヤギヤードモーター 3633K36"(以下 3633K36) を購入し、回転実験を行った。実験についての概説と、実際に回転させたときの感想について記述する。\n
  とりあえず、回転するのは確認できたが、トルク不足なように思えた。

  - 購入したモータ
    - http://www.tamiya.com/japan/robocon/robo_parts/g_motor/g_motor.htm

  - 実験のシステム図 \n
    \image html log_091218_tamiya_system.jpg
    - モータと PC 以外は、Robedo の Three の部品を用いている
    - モータへの電圧は Phidget の基板で制御した

  - 写真 \n
    \image html log_091218_tamiya_picture.jpg

  \subsection log_091218_tamiya_notice 使ってみた感想

  - 回転音は、割と静か (ビーゴと比べて)
  - 車輪が大き過ぎるせいかトルクが足りていない。車輪を軽く設置させた状態から、回転を始めるほどのトルクが出ないこともあった
    - 車輪径が大き過ぎた
    - ギヤ比が倍の 3633K72 を使うべきだった
    - いっそのこと、もう少しトルクが高そうな 380K72 を使ってみたい
  \n \n
  - 次は、もう少し高めのトルクが出る 380K72 を使ったタイヤ付きの下記セットを購入してみようと思う
    - http://www.tamiya.com/japan/products/72101motor_tire/index.htm
    - つか、これと同様のセットを使ってノート PC を搭載させるロボット作成のブログがあった
      - http://kougaku.blog28.fc2.com/blog-entry-200.html


  \section log_091218_misc 雑多な報告

  - 何でも力任せで解決しようとしてはいけない
    - ギアのかみ合わせで違和感を感じたら、力を入れて壊す前に分解できないか再確認すべきだった。

  - ラジコン専門店に行ってみた
    - 大きめのタイヤとホイールはセットで、4000 円くらい。地味に高い
    - ギヤとかいっぱいあったが、壊れたギヤと同じ物があるかは不明
      - 次は、壊れたものを持って行き、比較しながら購入を検討しようと思う


  \section log_091218_next 次回の予定

  - SH7045F の開発環境の構築
  - ポールを使った位置推定サンプルを実機でちゃんと動作させる
*/
