/*!
  \page log_100115_page 2010/01/15 その１

  - 概要
    - 1/4 までの報告
      - \ref log_100115_comment
      - \ref log_100115_myrobot
      - \ref log_100115_circuit
      - つくチャレに提出するレポートの添付
    \n \n
    - 1/15 までの報告
      - 自作ロボットの車輪制御までの報告
      - 地図の教示再生まわりときに問題になりそうな項目について (実機実験)
      - 距離センサのデータが移動障害物かどうかを判別する方法について

  \section log_100115_comment コメントへの返事

  \verbatim
> ロボットの位置をずらすとき
> ・to と from の X, Y の差だけ並行移動させる
> ・to の位置を中心に走行モジュールの座標系を to と from の差の角度だけ回転させる
>   to の位置を原点に移動させ、回転演算を施してから原点を to の位置に戻す
これはなんでto中心？
静止座標系上で考えているから？
・・・いまどの座標系で考えているのか分かるように書いてくれるとありがたいです。 \endverbatim

  to 中心で回転させるのはロボット位置が to にあるとしているから。\n
  平行移動の距離が (x, y) 回転量が t で与えられたとき、私は「平行移動 -> 回転」の順で演算を行いたいので、その順に処理するようになっている。

  あと、原点中心の回転行列を使ったせいで、処理の記述が複雑になっている感もあります。\n
  このあたりは、ソースコードの方が素直な表現になっているかもしれません。

  変換まわりの実装 (BeegoDrive.cpp より)
  \code
// 回転
Angle angle_diff = to.angle - from.angle;
if (angle_diff.to_rad() != 0.0) {
  pimpl->moveMatrix(Position<long>(0, 0, deg(0)) - from);
  pimpl->rotateMatrix(angle_diff);
  pimpl->moveMatrix(from);
  pimpl->angle_offset_ -= angle_diff;
}

// 並行移動
pimpl->moveMatrix(to - from); \endcode

  要はロボットの位置を補正するときに、ロボットが存在する座標系をずらしているだけです。\n
  座標系をずらすのは、移動コマンドをロボットが存在する座標系に対して発行しているためです。

  \image html log_100115_comment_rotate.jpg 30 [deg] だけずらしたときの座標系

  \n
  \verbatim
> 座標系について
> 全ての座標系に関係を定義したい理由は、例えば室内での例を挙げると
> ・部屋の座標系のここに本棚が存在し、
> ・本棚の座標系のここに「東京皇帝☆北条恋歌」(スニーカー文庫) がある、
> といった情報の扱いかをしたかったため。
全座標系に関係を定義することに対してはOKです。
疑問だったのは親子関係にする必要があるのかってとこです。
座標としては見方の違いだけなんで対等なのではないのかなと。
本の例は人間には分かりやすいですけど、
使用するセンサ情報は今のとこ１つなので、マクロ情報からミクロ情報への移行とか考えなくても
「部屋のここに本がある」と一発で示せて、本棚から見ても本から見ても物の相対位置が変わらない・・・
・・・結局同じことになりそうなので、無視してください。
えー一応言いたかったことをまとめると、全座標が同じセンサ情報で彩られるなら対等では？ \endverbatim

  この質問に対しては「センサは２つあるかも」と「親子関係があっても、対等な座標系として扱える」の２通りの解答をします。

  作っている Quick Robot SDK というライブラリは、ある程度の汎用性を持たせようとしているので、まぁ、仕組みとしては複数のセンサを扱えるような座標系システムにしようと思っています。現状で、センサを１つしか使っていない、というのは指摘してもらった通りです。

「親子関係があっても、対等な座標系として扱える」という意味では、作った直後の座標系は、root という特別な座標系を親として持つようになっています。この root が親な座標系は「私は、他の座標系とは関係ありません」という状態とも言えます。

  明示的に「URG をロボットの座標系上に配置する」という設定を行わなければ、そういう使い方もできます。

  座標系については「どういう仕様か、どういう風につかうのか」をちゃんと書き出そうと思いました。Quick Robot SDK にページにそういうページを作りたいです。\n
  今後の作業にさせて下さい。

  \n
  \verbatim
最後に、素人ならではの感覚かもしれませんが。
過度にオドメトリに頼るのは嫌い。（まあまずは完走ですけどね！） \endverbatim

  同意したいところですが、オドメトリは重要です。

  これは、自作ロボットには距離センサとオドメトリしかないので、仕方ないためでもあります。\n
  予選ではオドメトリのみで 66 [m] 走れたように、オドメトリはそれなりに便利です。

  - オドメトリの特徴 (独立駆動二輪の場合)
    - 累積誤差が生じる
    - 距離の誤差よりも、向きの誤差が乗り易い

  独立駆動二輪のオドメトリ誤差の特徴は、人のそれとほぼ同じです。
  なので、外界の情報を基準にして位置補正できれば、それなりの精度で位置が推定できます。

  廊下環境などならば距離センサで交差点を検出することで「次の交差点を右」といった指令体系の走破システムも作れそうですが、つくチャレのコースのような広めの環境だと、そういった指定は少し難しいです。\n
  なので、定期的に

  - 現在の推定位置に、オドメトリから得られたの移動分を加算
  - 環境データをマッチングして、次の推定位置を取得

  という処理を行いたいと思います。

  \n
  \verbatim
> 昨年度の反省
> ・走行しながら自己位置推定して環境地図を作るとか、大それたことをしようとして間に合わなかった
> ・シミュレータを作った割には、あまり有効に使えていなかった
> ・実機実験をほとんどしなかった
反省する順番が気になります。まず実機実験ができる状態を早く確立してください。
さもないと
今年度の反省予定
・一からロボットを作るとか、大それたことをしようとして間に合わなかった
・レポート報告義務を作った割には、あまり有効に使えていなかった
・実機実験ができる状態にならなかった
になりますよ？ \endverbatim

  すごく返事が書きづらいコメントです。\n
  返事としては、

  - 項目を列挙した順番は、反省の重みとは関係ないつもりだった
  - 実機での再現実験を各メンバーの手元で行えるようにするためにも、自作ロボットは作ってしまいたい
  - このレポートの有効性は今現在も実感している

  の３点でしょうか。

  \n
  \verbatim
> ロボットを自作する
> ・３月上旬には、ちゃんと動作する物でデモ走行ができるようにする
スケジュール通りでお願いします。 \endverbatim

  \ref log_091218_schedule の頃の予定だと、2010 年４月までに作ることになっている。\n
  私の中で、優先度が上がったみたいですね。


  \section log_100115_myrobot ロボットの構成図

  まずは、作成した実寸のハリボテ写真です。

  \image html log_100115_myrobot_base.jpg 走行系と底板と URG
  \image html log_100115_myrobot_battery.jpg バッテリーと支柱と天板を追加
  \image html log_100115_myrobot_complete.jpg 斜め正面からの写真

  作ってみて、以外とタイヤが大きいことに気付きました。

  - ロボットの構成部品
    - \ref log_100115_myrobot_motor
    - \ref log_100115_myrobot_encoder
    - \ref log_100115_myrobot_battery
    - \ref log_100115_myrobot_switch

  \subsection log_100115_myrobot_motor モータ、車輪

  - 「380K75&130mmピンスパイクタイヤ(2セット)」のマウンタ寸法
    - http://www.tamiya.com/japan/products/72101motor_tire/index.htm
  \n \n
  - \image html 72102_example.jpg 上記リンクより、モータを底板の上部に取り付けたときの画像
    \n \n
    - モータ寸法
      - http://www.tamiya.com/japan/robocon/robo_parts/g_motor/g_motor_zumen.htm

  - 補助輪 (取り付け高さ 65 [mm] が理想)
    - 車輪 (取り付け高さ 65 [mm])
      - http://www.hammer-caster.co.jp/search/category/seihinData.php?seihin_id=3014&series_id=16&type_id=33
      - ホームセンターでばら売りしていた
    - ボール輪 (取り付け高さ 67 [mm])
      - http://store.shopping.yahoo.co.jp/e-kanamono/csb-pl50.html
      - ホームセンターでばら売りしていた

   - 支柱の候補
     - http://www.kohnan-eshop.com/pro/mokuzaikenzai/sisutemurack/products/457110375031510?page=81
     - 通販だと 10 本セットの販売だが、ホームセンターでばら売りしていた。

  \subsection log_100115_myrobot_encoder エンコーダ

  モータの回転軸にエンコーダ板を取り付け、それを底板に取り付けたエンコーダで読み取ろうとしているが、取り付けの詳細は未定。

  - エンコーダ
    - http://optoeleshop.com/index.php?main_page=product_cohsei_info&products_id=35
  - エンコーダ用のスリット板
    - http://optoeleshop.com/index.php?main_page=product_cohsei_info&cPath=1_7&products_id=36

  \subsection log_100115_myrobot_battery バッテリー

  利用するモータの指定電圧は 7.2 [V] であるため、バッテリーとしては、

  - 1.2 [V] x 6本
  - 6.0 [V] の鉛バッテリー
  - 12 [V] の鉛バッテリー

  の利用を検討したい。\n
  鉛バッテリーを使いたいのは、放電が不要で扱いが簡単なため。(リチウムポリマーは放電が必要なのに対し、鉛バッテリーは充電状態を保つように管理すればよい。)

  - 1.2 [V] x 6本 の場合はラジコン用のものを購入して使う予定。未検討。
  - 6.0 [V] の場合は、以下の鉛バッテリーを使いたい
    - http://akizukidenshi.com/catalog/g/gB-02810/ (約 850 [g])
  - 12 [V] の場合は、以下の鉛バッテリーを使いたい
    - http://akizukidenshi.com/catalog/g/gB-00027/ (約 2 [kg])
    - 12 [V] だと、Top-URG が使いやすい

  \subsection log_100115_myrobot_switch 非常停止スイッチ

  ロボット右後方に板を追加して配置する。\n
  とりつけの詳細は未定。

  \section log_100115_circuit 自作ロボットの回路について

  - 回路の構成
    - 電源
    - CPU
    - モータドライバ・エンコーダ

  電源と CPU は同じ基板上でよいが、モータドライバ・エンコーダはエンコーダを車輪軸の近くに配置したいため、別基板になるようにする。\n
  エンコーダの部品のみ、ケーブルを伸ばして配線することも検討中。

  以下、必要な入出力の書き出し。

  - 電源
    - 入力
      - 6.0 〜 12 [V] の主電源
    - 出力
      - CPU 用の 5 [V]
      - Classic-URG に使うかもしれない 5 [V]
      - Top-URG 用の 12 [V] (主電源が 12 [V] のときのみ)
      - モータ用の電圧 (入力電源と同じ)
      - 電源動作中の LED 点灯用 (出力電圧、未定)

  - CPU
    - 入力
      - エンコーダ信号 (2本 x 2輪)
      - 非常停止のための入力 (1本)
    - 出力
      - モータドライバ用モード出力 (2本 x 2輪)
      - モータドライバ用 PWM 出力 (1 本 x 2輪)
      - CPU 動作中の LED 点灯用 (出力電圧未定)

  - モータドライバ・エンコーダ
    - 入力
      - エンコーダの A相, B 相の各信号 (2本)
      - 回転モード用の入力 (2 本)
    - 出力
      - モータへの動力線 (2本)
      - エンコーダの A相, B 相の各信号 (2本)

  \n
  また、各回路で使う主な電子デバイスを列挙する。

  - 電源
    - DC-DC コンバータ
      - http://akizukidenshi.com/catalog/g/gM-01691/
      - 仕様書が見当たらない...
    - リセッタブル・ヒューズ
      - http://akizukidenshi.com/catalog/g/gP-01337/

  - CPU
    - http://akizukidenshi.com/catalog/g/gI-01832/

  - シリアル USB 変換
    - http://akizukidenshi.com/catalog/g/gI-00821/

  - モータドライバ TA8429HQ
    - 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
    - 使っている人の Web ページ
      - http://www.city.azumino.ed.jp/west_jhs/16_kyouka/10_gizyutu/05_sekigaisen/20071117_ta8429hq/ta8429hq.htm
      - このページを見る限り、周辺回路部品はほとんど必要ないらしい。便利そう。
    - 気付き
      - 入力は電源投入時は Lo にする必要があるらしい
        - 入力を GND 側に 10 [K ohm] くらいでプルダウンする
      - アイソレーション回路は省略する。実験していて基板破損などの問題が起きたら再考する。
      - バッテリー電圧をヒューズを介した上で直接 Vs (モータ用の電源) に接続する
      - 足のピッチは 1.778 (しかも２列) なので、Eagle で部品図を作る
      - 電流の PEAK を越えるようなら、L6203 に変更する

  回路の構成図は、以下の通り。\n

  \image html log_100115_myrobot_system.png 主な部品の接続関係


  \section log_100115_misc 雑多な報告

  - モータの最大効率時のトルクが 4.05 [A] に対し、モータドライバ IC の PEAK 時電流が 4.5 [A] なのが少し不安。
    - リセッタブル・ヒューズも 3 [A] でよいのか不安。

  - タミヤのギヤードモータについて「6V〜12V まで利用可能」って記述しているサイトがあるけど、本当？
    - http://robot.tsukumo.co.jp/goods/4950344997992/
    - 適切にモータ速度を制御すれば、60 [cm/sec] くらいだと、モータへは 7.2 [V] 以下相当の電圧になるはずなので問題ないとは思うが...。

  - 室内での利用も想定したロボットが、あんな凸凹のタイヤでよいのか疑問

  - あんな凸凹のタイヤで、室内の床をグリップできるか不安
    - ビーゴの構成がとても偉大なことが理解できた


  \section log_100115_next 予定

  - 次回にやること
    - 自作ロボット用の部品を入手し、モータを回転させる (実機実験)
    - 地図の教示再生まわりで問題になりそうな項目の検討 (実機実験)
    - 距離センサのデータが移動障害物かどうかを判別する方法の検討
      - 人の足をトラッキングする方法を書き出す

  - いつかやること
    - 座標系についての考え方の説明ページを作る
*/
