以下はその結果です。縦軸がRCサーボへの出力値、横が角度です。 ラジコンで普通に使う±45度程度の範囲で直線性が良く、可動範囲限界の辺りでは 良くないという傾向が見えます。2L1&2L2では±45度程度の範囲しか使わない ので、1本の線で計算していましたが、W6は可動範囲を広く使うので、直線を分割するか、 5次程度の多項式で近似する必要があるとハッキリしました。
今回の結果をW6v3のプログラムに反映したところ、自機位置の測定結果の誤差が 数センチのレベルまで小さくなりました。
首ヨー軸のRCサーボ:サンワ ERG−VR
首ピッチ軸のRCサーボ:サンワ ERG−VR
今後は、壁に近い等接近方向に制約がある場合の移動経路の自動決定や、沢山ある場合に どれから取るかの優先順位の評価方法そして、データベースに記録したものをロボットが 動かした場合や、途中で落として見失った場合など対象の状態が変わったときのデータ ベースの更新方法など、テーマを変えようと思います。そこで、少し違うものを作りながら時間を おいて考えることにしました。
|
頭部ユニット
|
エアコンが切れたあとで、私が寝ながら暑そうにしていたら、W6にエアコンを入れなおさせるか 、もしくは、外の気温が適当ならば窓を開けさせようか等と考えながら測定してみました。
そんなわけで、画像は止めて、温度と明るさだけ、マイコンボードのメモリーに記録し、 時々PCにデータをダウンロードする方式に変えました。コレは良い感じでした。
PCとの通信ケーブルを外して動かしていると、動いているかどうかのモニターに 使えるハードが圧電ブザーしかないので、測定するときに「ピッ」と鳴らすように しました。夜寝ている時に動かすことを考えると、うるさいので、モニター用に LEDが付けたくなりました。
サウンドレコーダーで、雑誌の付録のCDに入っていた「Windowsを起動します」という声を PCM 16kHz 8bitに変換して再生してみました。言っていることは十分聞き取れましたが 音が小さかったです。電車の中でも聞こえるくらいにセットしたヘッドホンステレオのイヤホンを 耳から少し離して聞いているような感じでした。とりあえずはアンプとスピーカー が必要か・・・と思いました。また、このデータはアニメの声優さんのものでしたが、 なんだか、声の特徴が分からなくなってしまった様にも感じました。
ちなみにプログラムはすごく簡単で、ITUを4分周のフリーランニングカウンタモードにして、WAV ファイルのバイナリデータの数字を圧電ブザーのON時間にセットするだけです。
サンプル
for(ii = 0; ii < wav_data_num; ii++) { ITU2.TCNT = 0; P4DR.BIT.B7 = 1; while(ITU2.TCNT < wav_data[ii]); P4DR.BIT.B7 = 0; while(ITU2.TCNT < 390); }プログラムの作成に当たっては下記のHPを参考にさせていただきました。
近藤正芳 さんの「WAV ファイルフォーマット」のページ
http://www.kk.iij4u.or.jp/~kondo/wave/
いしかわきょーすけさんの ネガティブロボット「やめてよ君」のページ
http://www.asahi-net.or.jp/~qx5k-iskw/lego/yamete.html
サンプル
DA.CR.BIT.DAE = 0; DA.CR.BIT.DAOE0 = 1; for(ii = 0; ii < wav_data_num; ii++) { ITU2.TCNT = 0; DA.DR0 = wav_data[ii]; while(ITU2.TCNT < 390); } DA.CR.BIT.DAOE0 = 0;もう少しまともな音が出るようにしたくなってきたので、今日はNJM386を利用したアンプの キットと0.2Wの薄型スピーカーを買ってきました。
|
アンプキットとスピーカー
|
|
搭載状態
|
まずはPen4号用のローダーが便利なので、通信速度だけ38400bpsにアップしてメインCPUにインストール しました。
これまたPen4号で調べた結果の流用ですが、W6はリアルタイム性が高い仕事のCPUと低いCPUを 分けて複数積んでいるので特にメインCPUは多少処理速度がダウンしても問題ありません。 H8用gccの使い方を調べた結果、W6のメインCPUには実行速度が低くても、ライブラリが充実していて 使いやすそうだと思うので、こっちに使ってみようと思いました。
「つくばチャレンジ」が面白そうなので、W6にもGPSを積もうか・・・ということも 検討しています。(トラ技2月号もGPS特集なことですし)
ステレオビジョンを利用した空間認識のプログラムが書きたいので、とりあえずは視覚系から移植にかかっています。 VB2005からはSQLサーバー2005が簡単に使えるみたいで、VisualStudioの無料版を適当にインストール しているうちに、今使っているPCでも機能限定版が動いています。これを利用して認識結果をデータベース化してみようか・・・ などと考えています。機能限定といってもW6に使ってみようと思っている範囲では、実質的に制約を受けるところまで 使うことはない予定なので、十分なことでしょう。
ロボットの動きやGUIの操作としてはVB6で作ったものと全く同じですが、なんだかスッキリ書けたような気がします。 (まあ、気のせいかもしれませんが・・・)
TEXT OUTというモードにしてPCに接続し、ターミナルソフトを起動しておくと、現在の情報が、 下記のように日時、緯度、経度、速度 等の情報を含んだテキストで1秒毎?に出てきました。これならば簡単にW6に取り込めそうなので良かったです。
@080229120157N3515441E13654564G004+00030E0000N0000U0000
@080229120157N3515441E13654564G004+00030E0000N0000U0000
@080229120157N3515441E13654564G004+00030E0000N0000U0000
とりあえず、こんな感じでW6の外に載せて遊んでみようと考えています。
2.車輪の回転検出用エンコーダの野外テスト
3.ピニオンギアの交換
外で動かしてみて、あまりに移動速度が遅いと感じたので(部屋は狭いので、これでちょうど良かったですが・・・) ギアボックスを分解したついでにギア比を196.7:1から76.5:1に下げました。まだこれでも1km/h強と遅いですが、ラジコンカー ほど頑丈にできていないので、W6についてはこれで良しとしておきます。しばらく遊んで面白かったら、はじめから 野外で遊ぶことをメインに考えたロボットを新作しようと思います。
4.エンコーダの移設とセンサの変更
5.野外テスト(2回目)
センサの対策はまた来週以降するとして、初めて外でノートPCを使ってみたのですが、画面が暗くて ほとんど見えませんでした。あと、約3.2kgのノートPCを持って、ロボットの後をついて歩くのは 重かったです。外用のロボットを作ったら、外用の小さくて画面の明るいPCを買ってもいいかなと 思いました。
これで走らせてみたところ、まだうまく走行距離をカウントできませんでした。センサと回路 との相性では無さそうだと言う事で、モーターからのノイズを少なくするため、走行用モーター をマブチのRE−260(金属ブラシ/定格電圧1.5V)からRC−260 (カーボンブラシ/定格電圧4.5V)に変えてみました。RC−260は単体で売っている ものを見つけられなかったので、タミヤの遊星ギアボックスセット付属のものを使いました。
この状態で、ローパスフィルタの抵抗とコンデンサを何種類か替えて動かしながら、信号を オシロスコープで見比べてみました。確かにモーターのノイズは減ったのですが、じつは ローパスフィルタのつもりでつけていた抵抗とコンデンサのせいで少し信号が発振していました。 走行速度を上げたので、エンコーダーからの信号の周波数がアップしました。 そのため、元からあった問題が表面に出て来たようでした。
アナログ回路に不慣れで、適当なフィルタの準備に時間がかかりそうだったので、結局、慣れた ソフトウェアフィルタで済ませてしまいました。
こんな感じの過程を経てうまく動くようになりました。また、動力系統の電圧 に、よりマッチした、耐久性も高いモーターに交換することになったので、野外で走るのに より適した形になりました。
野外テストの様子
こんな感じで約130mある、白線(横線は3m間隔)を利用してテストしました。
走行系の準備ができたので次はGPSの搭載作業に移ろうと思います。
そして、移動ユニットに載っているNo.2サブCPUのI/Oボードに3Pのピンヘッダを付け、AKI−H8/3052F キットのSCI0につながるピンへ配線しました。
その後、制御プログラムにeTrexHからのデータを受けて、上位CPUにそのまま転送する機能を付加しました。
これで、W6を経由してPCに位置情報を取り込めるようになったので、初めはPC上に、GPSからの入力を頼りに、
緯度経度指定であらかじめ決めたルートを辿って移動するナビゲーションソフトを作ろうと思っています。
そしてアルゴリズム的に完成したら、メインCPUに移植し、カメラや超音波センサで検知した障害物を回避したり、「道」
を辿ったりする機能に統合しようと思います。
「どうもロボット側の回路から 出る電波のせいで衛星からの電波が受信できなくなっているようだ」というわけで簡単に確認できることを いくつか試してみました。
以上から、マイコンボードがGPSに影響するノイズの発生源で、空中を伝播してくる電波の影響が大きく、 シリアル通信用ケーブルの影響もある。というように結論しました。ちなみにW6では止まってGPS測定を する予定なのでモーターは全てOFFとし、モーターからのノイズの影響は調べていません。
本格的な計測やノイズ対策は大変なので、とりあえずGPSをマイコンから一番遠い頭の上に、アルミ板をひいた上で 設置し、ナビゲーションのテストを行うこととしました。気が向いたらマイコン周辺のシールドを行うと共に GPSレシーバーを50cmから1m程度の高さのマストの上に設置するといった対策をしようと思いました。 純正のシリアル通信用ケーブルにはフェライトビーズが付いているので、自作のケーブルにも付けたほうが 良いのでしょう。
W6で簡単に出来るのはこの辺までの様な気がしたので、GPSに関する工作は、仕切りなおしてまたそのうち にしようと思いました。
AKI-H8/3664FやAKI-H8/3067Fでは、それほど影響が大きくありませんでした。どうやらAKI-H8/3052Fボード とGPS受信機の相性が良くないようです。そのうち移動ユニットType1のマイコンボード (AKI-H8/3664F使用)と換装して続きをしようと思いました。
野外走行に関連して、移動ユニットを制御するNo.1サブCPUの通信プロトコルというか、コマンド の構造を変えました。そこで、それに対応させるため、No.2サブCPUとメインCPUの通信部分も書き換えました。
Che−ez
ちょっと見た感じでは、W6用にすでに作ってあるソフトと統合するにはだいぶ時間を使って 調べたり、試したりすることが多そうだな〜と思いました。
CMS−V23SETSV
(錘として手じかのヘルピングハンズに付けてみました。カメラの大きさはTrevaと大体同じなので、W6の頭にも
内蔵できる大きさです。)
先週から考えていたのですが、いま作業中のVisualBasic2008のプログラムからOpenCVを使おうとすると、 いろいろ調べることや、作業が多そうだと思いましたが、元のVisualC++Var6で作った、床に散らばった ボールを集めたりするプログラム(W6v3d)のほうには簡単に統合できそうなことに、気がついたというか、思い出しました。
そんなわけでW6v3dのソースをVC++2008でコンパイルしてみました。すると、シリアルポート操作用の erslibでエラーが出ました。VC++2008のダウンロードページを読む限りはPlatformSDKは 元々含まれているようですが、何か違うようです。以前のものを使えば追加調査が要らず手っ取り早いだろうと思い 、古いほうのPCからVC++2005の時に使っていたPlatformSDKをコピーし、パスを通しました。 すると、エラーが収まり、W6と通信できるようになりました。
W6のカメラのデータをOpenCVで画像を保持する構造体にセットする部分だけ作れば、ライブラリーが 利用できそうなので、まずここを作って遊んでみようかと思いました。元々W6用にCで作った画像認識用の 関数と、対応するOpenCVの関数の使い方が似ているので、わりとW6の既存プログラムと相性が 良さそうだと思いました。