/*!
  \page log_091218_2_page 2009/12/18 その２

  - 概要
    - \ref log_091218_sh7045f
    - \ref log_091218_poles
    - \ref log_091218_myrobot


  \section log_091218_sh7045f SH7045F の開発環境の構築

  ビーゴ用の走行コントローラ(SH7045F)で動作させるプログラムの開発を目指し、今回は開発環境の構築を行う。

  \subsection log_091218_sh7045f_goal 目標

  - SH7045F 上で動作し、シリアル通信で "Hello" と表示するプログラムの作成
  - mot ファイルを SH7045F に転送して実行するためのモニタ・プログラムを作成する
    - mot ファイルとは、マイコン用のプログラムを 16 進表記のテキスト形式に変換したもの
    - 今後のプログラム開発はこの枠組を利用する

  \image html log_091218_sh7045_system.jpg モニタのシステム図

  - 行うこと
    - 今まで使っていたライブラリが KPIT のクロスコンパイラで動作しないのを解決する
      - <a href="http://www.kpitgnutools.com/index-ja.php">KPIT の Web サイト</a>
    \n \n
    - 以下の機能が動作するように調整する
      - シリアル送受信 (SCI0, SCI1)
      - タイマー (MTU4)
      - PWM 出力 (MTU1)
      - エンコーダ入力 (MTU2, MTU3)

  \subsection log_091218_sh7045f_progress 進捗

  なし。\n
  この開発環境はビーゴ用なので、いつか作業する必要がある。ただし、自作ロボット用の開発構築を優先すべきかもしれない。


  \section log_091218_poles ポールを使った位置推定サンプルを実機でちゃんと動作させる

  現在の問題は、経路を曲がるときに本来の経路をはみ出して曲がってしまうこと。

  \image html log_091218_poles_path.png 予定経路と実際の経路

  まずは、この問題を解決する。

  \subsection log_091218_poles_adjust 補正を行うと経路追従がおかしくなる問題について

  位置補正と経路追従だけを行うサンプルを作って動作を確認した。\n
  その結果、向きの補正を行うと、走行経路がおかしくなるのを確認した。

  - 点列 (0, 0), (1500, 0) の経路を走るように設定したときに、ロボットの位置を (0, 0, deg(30)) になるように設定した場合の、予定経路と実際の走行経路との違いについて。

  \image html log_091218_poles_step0.png

  \image html log_091218_poles_step1.png

  \image html log_091218_poles_step2.png

  そして、以下がシミュレーション実行したときの走行軌跡 (赤がシミュレータ内での走行軌跡)

  \image html log_091218_poles_simulation.png

  シミュレータ画面において

  - 紫が位置補正しないときの走行経路
  - 青が位置補正の結果、走行するはずの経路
  - 赤が実際に走行した経路

  だが、青に追従せずに赤の経路を走っているあたりがおかしい。\n
  また、ロボット自身が管理している自己位置を定期的に出力したグラフを以下に示す。

  \image html log_091218_poles_plot.png ロボットが走っているつもりの位置

  位置の出力データ
  \include log_091218_poles_plot.txt

  グラフには出力されていないが、プロットのデータから、向き自身は補正されているのがわかる。

  - 最初の角度が 30 [deg] から始まる
  - 後半は、360 [deg] になっており、X 軸に沿って走行している

  問題をまとめると、

  - オフセットを加算させただけだと、線分の両端にオフセットを加算した結果が、１本の直線にならないことがある
  \n \n
  \image html log_091218_poles_wronglines.jpg 加算だけで補正した直線の両端の向きの結果

  これらの問題に対処するために、位置補正は固定オフセットの加算ではなく、アフィン変換で行うことにする。\n
  また、位置補正の API では、移動前と移動後の位置を与えるものとする。

  \code
// ロボット位置の補正
//
// from 変更前のロボット位置
// to 変更後のロボット位置
virtual void Running::changeRobotPosition(const Position<long>& to, const Position<long>& from) = 0; \endcode

  このメソッドの用いた位置補正の処理手順を以下に示す。\n
  位置補正では、変換行列を生成して管理する。

  - ロボットの位置をずらすとき
    - to の位置を中心に走行モジュールの座標系を to と from の差の角度だけ回転させる
      - to の位置を原点に移動させ、回転演算を施してから原点を to の位置に戻す
    - to と from の X, Y の差だけ並行移動させる
  \n \n
  - ずれた位置を走行コマンドに反映させる手順
    - 上記手順の演算を施した変換行列を、指定された走行コマンドの位置に適用する

  - この方法で対処したときの、ロボットの走行軌跡を以下に示す。

  走行モジュールの内部の上記の行列演算を行うように修正した。(実装には Boost ライブラリを使用)

  \image html log_091218_poles_ok.png 想定した経路を走行している

  \image html log_091218_poles_adjusted.png ロボット内での位置をグラフ出力

  \subsection log_091218_poles_conclusion まとめ

  - 今までは座標系の補正方法が分かっていなかったが、修正できた
    - ロボット位置に x, y, theta の値を加算するだけの補正は間違い
    - 正しくは、座標系をまるごとずらすような補正が必要だった

  - 次は、この修正した実装を用いて実機実験を行う



  \section log_091218_myrobot 自作ロボットのイメージ書き出し

  \ref log_091218_tamiya を使った車輪の回転実験についてコメントをもらったので、検討する。

  \verbatim
サーボを使うんだったら加速度をユーザーが制御するのは難しいんじゃないかな
ああ、エンコーダ無しの場合のことかな
モンスタートラックのタイヤは柔らかいので、オドメトリとの相性は悪いと思うよ
タイヤ付きセットの垂直最大負荷が2kgってなってるけど大丈夫？
3633K36の回転数-トルク特性が380K75と同じで直線なら
14.4rpm/kg・cm だから
静止トルクは13.5kg・cmのはず
写真からだとわからないけど、タイヤ半経を7cmとすると、静止駆動力は約2kg程度？(タイヤに巻きつけた糸で2kg弱の重りを持ち上げられる)
電源直結で7.2V出てればタイヤが動かない程弱いってこともなさそうな気がするんだけどなぁ
まぁ、回転数に比例してトルクが減るなら、どっちにしても実用にはならないだろうけど \endverbatim

  \subsection log_091218_myrobot_sugi コメントに対する考察

  - エンコーダについて
    - 12/24 に会って話し合った結果、エンコーダは取り付けて評価することになった
      - 本来はモータ軸にエンコーダを取り付けたいが、加工が難しそうなので、出力軸の先にエンコーダ板を取り付け、それを２相エンコーダで読み取る。
        \n \n
        \image html log_091218_myrobot_motor.jpg ギヤードモータの概略図
        \n \n
        - コーデンシ、エンコーダ IC
          - http://optoeleshop.com/index.php?main_page=product_cohsei_info&products_id=35
        - エンコーダ板
          - http://optoeleshop.com/index.php?main_page=product_cohsei_info&products_id=36
          - エンコーダ板を自作する場合、OHP シートにスリットを印刷して透明プラ板に貼って使うことを検討している
    \n \n
    - また、エンコーダ付きの DC モータには、こういうのがある (注 ギヤヘッドなしの価格)
      - http://robot.tsukumo.co.jp/goods/4582189780448

  - モンスタートラックのタイヤが軟らかそうな件について
    - ラジコン専門店で触った限りでは、割と硬いタイヤもある
    - タミヤのタイヤへの換装は簡単なはずなので、期を見て再検討する

  - タイヤ付きセットの垂直最大負荷が 2kg な件について
    - NetBook や小さいノート PC なら問題ないと思う
    - 他社のでかいノート PC については、想定していない

  - 実験にてタイヤが動かなかった件について
    - 使った Phidget 社のモータドライバが、電流上限をかけただけだと思うが、よくわからない
    - モータを変えて再現するようなら、再度検討する


  \subsection log_091218_gal 自作ロボットのイメージ書き出し
  \verbatim
・座標系の話ですが、いまいちAPIとか分かってないので的外れかもしれませんがご容赦を。
  親座標系や子座標系が座標系間の関係情報を持っている必要はあるんですか？
  ２つの座標系とは別に座標系間の変換式があればいいんじゃないかと。

・ギヤの欠けたモータ
  全部ギヤを変えてしまうのは規格上面倒ですか？
  どうせなら金属ギヤにしてしまった方が良いと思います。
  もう使わないならいいんですけど。

・３輪だと地味に補助輪が重要ですよね。

・ギヤードモータのモータ単体とロベドのモータ単体でロベドの方が優れているなら
  ギヤヘッドだけ使えないんですか？
  ギヤードモータの価格の２/３がギヤヘッドの価格・・・

・ロボットの仕様をまとめていかないんですか？
  徐々にでいいのですが、おおよその重量と登坂可能な角度とか考えた方が・・・
\endverbatim

  - 座標系について
    - 全ての座標系に関係を定義したい理由は、例えば室内での例を挙げると
      - 部屋の座標系のここに本棚が存在し、
      - 本棚の座標系のここに「東京皇帝☆北条恋歌」(スニーカー文庫) がある、
    - といった情報の扱いかをしたかったため。
    \n \n
    - 全ての座標系に関係を定義したとしても使わなければよいので、ユーザの負担にはならずに、実装者と PC の負担になるだけ。
      - なので、せっかくなら座標系に定義をもたせたいな、と思っている

  - ギヤの欠けたモータ
    - ギヤードモータのギヤヘッドの取り付けネジの位置などは、製品によって違う気がする。
    - 日本で売ってなければ自作ロボットの用途として使いづらいので、もう使わないことにしたい。
    - 「勉強になった」ので、よいことにする。

  - ロベドの方が優れているならギヤヘッドだけ使えないんですか？
    - ロベトのギヤヘッドの型番がわからずに、探せてないのが現状
    - 買い直せるなら、そうしたいんですけどね。

  - ３輪だと地味に補助輪が重要ですよね
    - 重要
      - 重心位置が駆動輪に近くなることも重要なはずだが、まだあまり検討していない

  - ロボットの仕様をまとめていかないんですか？
    - はい、やらないといけません
      - 今は、ノートに書き出している最中
      - いずれ、構成図、基板図にしていく予定


  \subsection log_091218_myrobot_motor 自作ロボット用の実機実験の結果

  - 走行速度について
    - 3633K36 で直径 16 [cm] 程度の車輪を取り付けると、最大 2.0 [m/sec] くらいで走行するように思う。ちょっと速過ぎた
    - 次に買うキットは "ギヤードモーター380K75＆130mmピンスパイクタイヤ（2セット）" を予定
      - http://www.tamiya.com/japan/products/72101motor_tire/index.htm
        - 販売サイトの情報によると最大 1.35 [m/sec] らしい


  \section log_091218_misc 雑多な報告

  - 走行コントローラ用の CPU としては、SH7215 あたりを利用したい
    - http://akizukidenshi.com/catalog/g/gK-02300/
      - エンコーダ信号を用いた位置推定から、経路指定の走行コマンドを使えるコントローラにする


  \section log_100101_next 次回の予定

  - SI2009 の学会でつくチャレ 2009 参加者の講演を聞いた感想の報告
  - 今後の走行アルゴリズムについての再検討
  - 自作ロボットの筐体イメージの書き出し
  - 座標系ライブラリの実装、テスト
*/
