2018年10月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

カテゴリー

ブログパーツ

無料ブログはココログ

« 2010年2月 | トップページ | 2010年4月 »

2010年3月

2010年3月26日 (金)

プラネックスのネットカメラも試してみる

ロボット作ろう:シェーキー製作記

もし、ネットタンサーのカメラからうまく読めなかったら…という時のために、プラネックスの安い無線LANカメラをヤフオクで手に入れておきました。これを前回のソフトで画像取得してみようと思います。

モノはこれです。ヤフオクで新品6K円くらいだったかな。実売価格でも1万円以下の安いカメラです。音声機能はありません。実にシンプルです。

Dscn0532

これに目をつけたのは「LoginFree」機能があるからです。この機能とは、例えばカメラのIPが192.168.1.56の場合、ブラウザからhttp://192.168.1.56/loginfree.jpgにアクセスするだけでカメラ画像が静止画として表示されるというものです。ダイナミックDNSなどでカメラをインターネットから直接アクセスできるようにしておいて、携帯電話で簡単に画像を見たいときに使う機能だそうですが、サンデープログラマーにとっても便利な機能ですね。
(なお、loginfree.jpgのファイル名は設定画面で好きな名前に変更できます。これがセキュリティになっているようです。)

この機能はネットタンサーのカメラの画像取得方式と良く似ています。早速C#のソフトを改造してアクセスしてみました。
改造したのはForm1.csでtimer1_Tickハンドラ内の

camBuffer = new Bitmap(cl.OpenRead("http://" + IPaddress.Text + "/goform/video2/"));

↑これを↓こんな風にしただけです。

camBuffer = new Bitmap(cl.OpenRead("http://" + IPaddress.Text + "/loginfree.jpg"));


これだけの変更で問題なく動画が表示されました。ネットタンサーのカメラより動画のクオリティが高いように思います。

このカメラはグローバルビジョンとして使おうかと考えています。いずれ、ですが。

2010年3月24日 (水)

ネットタンサーのカメラ画像をC#で読む

ロボット作ろう:シェーキー製作記

いつの間にかバンダイロボット研究所のHPがクローズされていました。合掌。

必要なデータやアップデータはDLしておきましたので問題はないですが、シェーキーにはネットタンサーを改造使用するつもりなので、なんかハシゴを外されてしまったような気分です。サポートはバンダイのサービスセンターで継続するそうですが、まさか改造の相談には乗ってくれないでしょうねえ。

以前、ネットタンサーのシリアルポートを使って通信するプログラムは試作しましたので、次は画像の取得です。これが出来ないようならカメラには他のモノを物色しなければなりません。

そういう訳で、のびのびになっていたネットタンサーのカメラ画像を取得するプログラムをC#で作ってみました。なんといっても猫の写真を撮るのが目的の知能ロボットですからね。

改造に使用するネットタンサーは192.168.1.55のIPを固定でセットしてあります。(ネットタンサーをお持ちの方、ここから先はIPをご自分のネットタンサーのIPと読み替えながら読んでくださいね)
ブラウザでhttp://192.168.1.55/goform/video2/にアクセスするとその時のカメラ画像が表示されます。バンダイHPの資料によると、この画像を定期的に読み込むことで動画として表示させるようです。
方針としてはこれで行きましょう。

VC#のWebClientクラスを使うとビックリするほど簡単に出来てしまいました。タイマーで70ms毎に読み込みを実行するだけです。コードの主要部分はたった数行です。ファイルをjpgなどで保存するのも簡単です。(下の写真をクリックすると原寸で表示されます)

Ntvideo

ネットタンサーのIPを入れ、STARTボタンをクリックすると動画が始まります。320X240でも640X480でも切り替えなしで動作します。時々30秒ほど画面が止まることがありますが、しばらくすると復帰します。画面のCAPTUREボタンをクリックするとsample.jpgという名前で現在の画面をcドライブの直下に保存します。

通常画面サイズの4倍、640X480での動画はこんな感じです。パソコンの画面をデジカメで録画したものです。ブリキの宇宙探検車の動きを見てください。
ロボットワークスでの320X240の画面になじんでいたので、その大きさにビックリです。そこそこのフレームレートですが、時々フレームが飛ぶのがわかりますね。

試してみたい方はこちらのVC#プロジェクトファイルをDLしてください。ExpressEditionで実行できます。
「NTvideo.zip」をダウンロード

それから、ネットタンサーやネットタンサーウェブのカメラ画像のサイズを変えるには、うちの場合http://192.168.1.55/index2.aspにブラウザでアクセスして設定画面を表示し、「システム設定」→「ビデオ/オーディオ」タブで画質や画像サイズの設定画面に移動できます。(IPは自分のネットタンサーのIPに読み替えてください。)

2010年3月22日 (月)

早春物語‥

ロボット作ろう:シェーキー製作記

早春と言うにはちょっとばかり遅いですが、このタイトルは使いたいですよね。なんたって花岡ちゃんですから。

最近、ソフトばっかりなので飽きてきちゃいまして、工作をしました。
シェーキーのサイドと背面のパネルです。

おそらく実物は更衣室のロッカーやスチールデスクのような薄い鉄板のプレス品だと思いますが、模型の方はプラ板で作りました。いい感じでしょう?

Photo_2

正面のパネルはまだです。これはラックマウントのアンプみたいな感じなので、ヘアライン入りのアルミパネルでこしらえるつもりです。実物の写真を見るといろいろなバージョンがあるみたいですが、今回はイメージで行きます。花岡ちゃんスタイルのパネルにしたいと思います。

それからアタマのフレームは作り直しました。以前のフレームより幅を広くしてあります。実物写真をよく見ると、以前作ったヤツよりは幅が広いようです。このへんはごちゃごちゃしていて写真から寸法が読みにくかったのです。またこんなサイトに見たことの無いシェーキーの写真もありまして、それら新情報による改訂版というところです。(このサイトは珍しいサイバネティックス機械や昔のロボットの情報満載で、実に読み応えがあります)

2010年3月19日 (金)

オドメトリの精度を調べる

ロボット作ろう:シェーキー製作記

移動関係のハードがひとまず完成したところで、暫定のコントロールソフトでオドメトリの精度を調べておきましょう。

スタート位置に置いたロボットにボタン操作でコマンドを送って室内をドライブし、元の位置に戻した時、ロボットが最初の位置からどれくらいずれるのかを観察しました。

まず23回コマンド操作した場合です。比較的短いドライブです。青い部分がマップで、白い大きな○がスタート位置、黄色い小さい方の○が現在のロボットの位置です。マップ領域の大きさは4m×2.8mです。

Photo

この時の位置のずれはこんな感じです。左がスタート時、右が終了時です。

   Photo_2 → Photo_3

フローリングの板の幅が75mmなので5mmくらい奥に行っている感じです。方向はほとんどずれていません。いい感じです。

次は98回コマンド操作をした場合のマップです。

Photo_4

この時のずれはこうなりました。

   Photo_5 → Photo_6

これはかなりひどいですね。ロボットの方向も10度ほどずれていました。

この誤差は、軌道修正のためにちょっとだけ(1~2度)旋回させた場合に、車輪の同期がとれずに旋回中心が狂ってしまうのが原因でないかとにらんでいます。修正は頻繁に何回も行うので誤差の累積はバカになりません。いずれにせよ、センサを使ったデッドレコニングの必要はありそうです。

2010年3月18日 (木)

TA8428Kのブレーキを改善する

ロボット作ろう:シェーキー製作記

移動ロボットベースのナビゲーションを実験中ですが、ブレーキが甘いのがやはり気になります。回転方向と逆向きに駆動を掛けて能動的なブレーキングをしているのですが、やはり、回生制動部分が最後には問題になっています。

回転数が低い、つまり回生電圧が低い部分で全くブレーキが利かないので、逆駆動のブレーキングが足りないときに、回生制動を掛けたにもかかわらず、すーっと進んでしまう感じです。その結果方向が少し変わったりします。

オドメトリはそのときにも機能しているので、ちょっと考えると停止位置が少しずれるだけで、オドメトリ自体には問題がなさそうにも思いますが、実際は移動後まとめてオドメトリの結果から位置と進行方向を計算、しかも旋回は超信地旋回という前提なので、停止時に何となくカーブされたりするとオドメトリが狂ってきます。

と言う訳で、回生制動の性能を改善します。これ↓です。

Jpg

見た通り、モーターをリレーでショートしてしまおうと言う訳です。リレーはモータードライバをブレーキ状態(モーターコントロールが1,1)のとき、自動的にモーターをショートします。

使ったのは12V用のパワーリレー、接点容量5Aです。焼き付きなどの問題はありませんでした。ただし、ブレーキ状態から駆動状態に持っていく場合、間に100msくらいのストップ状態を挟む必要があります。リレーの接点が戻るのに数十msかかるためです。戻る前に駆動をかけるとモーターショートの状態なので過大電流が流れます。

ドライバごと別基板に実装し、ドライブサーバとはケーブルで接続しました。こんな感じです。右側の写真はブレーキを追加したモータードライブ基板です。

Dscn0515  Dscn0514

ブレーキの効きは格段に良くなりました。

2010年3月15日 (月)

Coronにタイマー割り込みを追加する(その3)

ちょこっとCoron:ねずー製作記

今回改造したファイルは下記の3ファイルです。修正箇所には「花岡ちゃん」のコメントを付けてあるので、ダウンロードしたファイルを検索してください。簡単な改造なので仕組みはすぐわかると思います。

stm32f10x_it.c ユーザー割り込みのハンドラHandler_MyTick()の呼び出しを追加
coron_conf.h Handler_MyTick()のextern宣言を追加
main.c Handler_MyTick()の本体を追加、デモ用main関数の作成

花岡ちゃん版のフレームワークを使って、DCモーターとサーボのコントロールを独立に行うテストをしてみました。

DCモーターのコントロールは、Coronのサンプルコードをコピペしてmain関数の無限ループで行います。加減速を繰り返すプログラムです。これ↓がコードです。


Photo


サンプルコードからの変更で重要なのは、wait_timerをwait_timer_msにしたことです。これは前にも書いたように、割り込み周期を1msに設定したままに保ちたいからです。

RCサーボの制御はタイマー割り込みで行います。これ↓がコードです。

Photo_2

500ms周期でサーボを動かし続けます。いうまでもないことですが、タイマー割り込みハンドラの中で時間を食う処理は御法度です。1msごとに割り込まれる訳ですから、数百usくらいが上限です。これを意識しながらプログラムすれば、意外と複雑な処理も入るものです。

このプログラムを実行した時の動画がこれです。車輪の回転とサーボの動作がそれぞれ固有の周期で動いていることがわかると思います。(わかり難いですか?音を聞いてもらうといいかもです。)

2010年3月14日 (日)

Coronにタイマー割り込みを追加する(その2)

ちょこっとCoron:ねずー製作記

と言う訳でユーザータイマー割り込みを追加しました。これが主要部分のソースコードです。

Photo

Handler_MyTick()がユーザー割り込みのハンドラです。ここにはグローバル変数myTickCountを使って500msごとにLEDを点滅するプログラムを見本として入れてあります。

main関数ではwait_timer_msec(1)で1msの時間待ちを実行することで、sysTick割り込みを1ms周期に設定しています。これをしないと割り込み周期は100usになり、ちょっとばかり早いようなのでこうしました。

その後、何もしない無限ループに入ります。つまり、ここにLEDの点滅と同時に実行したいプログラム、例えばあるパターンを走行するとかを書けば良い訳です。

注意すべきことは時間待ちにwait_timer_msec以外を使うとSysTickの割り込み周期が1ms以外に設定されてしまうことです。wait_timer_msecは問題なく使えるので、これを時間待ちに使います。

この機能を組込んだ「花岡ちゃん」バージョンのEx_ALLを参考までに用意しました。LEDを点滅させながらのプログラム実行を確認してもらえると思います。

「Ex_ALL_HanaokaChan.zip」をダウンロード

2010年3月13日 (土)

Coronにタイマー割り込みを追加する(その1)

ちょこっとCoron:ねずー製作記

Coronにユーザーが利用できるタイマー割り込みがあると便利です。
ねずーの場合だと、ジャイロコンパスの更新やビヘィビアの実行時間の管理などは、定期的にタイマー割り込みで起動するのが定石です。これをCoronで実現しましょう。

Coronには、ユーザーがタイマー割り込みを使えるようなサンプルコードがありません。と、いうことは自分で作るしかありませんね。

Coronではモーターやサーボなどの制御にタイマー割り込みを使っているようです。srcフォルダにmain.cと一緒に入っているstm32f10x_it.cに各種インタラプトのハンドラが収まっています。これを見るとTimer1が空いているようです。これを使いましょうか。モーター制御などの関数を調べてタイマー割り込みの設定をしてみましょう‥

うーん、これは無理です。STM32のマニュアルをしっかり読み込まないと理解不能ですねえ。「ちょこっと」と言う訳には行かないようです。

そこで!他の割り込みに「便乗」することにします。つまり、定期的に割り込んでいるハンドラの中に自前の割り込みサービスを文字通り「割り込ませ」てしまおうと言う訳です。

白羽の矢をたてられた不運な関数はHandler_SysTick()です。ソースコードを読むと時間待ち機能wait_timerで利用されています。wait_timerを呼ぶとカウンタに引数をセット、さらに100usごとに割り込みがかかるようにSysTickをセットし、割り込みごとにHandler_SysTick()でカウンタをカウントダウン、これが0になったらリターンという作業をしています。

また、マニュアルにはないですが、ms単位で時間待ちをするwait_timer_msecもあることがわかりました。これはwait_timerと全く同じで、割り込み周期が1msになっているものです。他にwait_timer_secとwait_timer_usecもありました。これらがマニュアルに無いのは、wait_timerでカバーできるからだと思います。

これは私にとってはラッキーでした。割り込み周期の切り替え方法がわかったからです。

次回は便乗プログラムの製作をしたいと思います。

2010年3月11日 (木)

ねずーの近況報告

ちょこっとCoron:ねずー製作記

ねずーはその後、鳥の声や猫の声を発生する機能を追加され、何回か「出動」しています。

Dscn0452

基本的なビヘィビアは、サウンドを再生→猫じゃらしのアクションを1分ほど繰り返し、その後、1分ほどexploreで室内を高速走行します。猫じゃらしアクション中にPSDに反応があったら、avoidビヘィビアで逃げ回る行動をします。

猫の相手を出来ないときに、猫の興味を引きつけるくらいの効果はあるようです。あまり近づいては行きませんが、物陰に隠れてのぞいています。
どうも、ちょっとばかりねずーが怖いようです。逃げ出すほどではないですが、攻撃するにはちょいと怖いという感じでしょうか。たまに思い切って飛びかかりますが、ちょいと手を出してもどってくるという典型的ビビリーの行動をします。

これをふまえて、ギアの減速比を元に戻そうかと考えています。走行スピードではなくで、ネズミっぽいちょろちょろ動き回るアクションを試してみるためです。現在のギア比は低すぎるため、直進後すぐ旋回などを安定に行えません。

2010年3月 6日 (土)

オドメトリで一苦労

ロボット作ろう:シェーキー製作記

初めてオドメトリでロボットのナビゲーションを検討してみて、改めて感じたのは数値精度の問題です。

このロボットでは接地径約70mmの駆動輪でホイールエンコーダの1回転あたりの分解能が100ですから、1カウントあたり約2.2mmということになります。こんな感じの計算で、幾何学的な移動はまあまあ大丈夫なんですが…ナビゲーションとなると話は別です。

そうです。誤差の累積です。長距離を移動させると、距離や角度の小さな誤差が累積し、推定位置の大きな誤差になってくるのです。特に、角度の誤差は大きく聞いてきます。

ということで、カウント数を距離や角度に変換する段階で、誤差を最小にする必要があります。このため実際に走行させて決定しました。

距離は1mほどの距離を直進させ、そのときのカウント数と実際の距離から1ステップあたりの移動距離を小数点以下3桁まで求めました。同様に旋回角度は360度ほど旋回させて計測しました。

また、PCソフトの画面からわかるように、計算は浮動小数点演算で行っています。

コレだけの工夫で、ロボットの実際の位置とマップ上の位置を、かなりの精度で一致させることができました。

次はいくつかの座標を設定して、これを順番にたどるようなナビゲーションのテストをしたいと思っています。

2010年3月 4日 (木)

移動ロボットベースをテストする

ロボット作ろう:シェーキー製作記

ロボットサーバの格好がついてきたので、移動ロボットベースとしての性能をテストしてみました。同じ移動ロボットであるネットタンサーウェブと比べるとこんな感じになります。

Dscn0504

ネットタンサーの重量は1Kgくらいですが、移動ロボットベースはベースだけで2Kg、これに2.8Kgのバッテリーが載っているので、現在でも4.8Kgもあります。フローリングの床の上ではとうていスリップしそうありません。かなり正確に移動できそうです。

これをテストするのに、例によってPCソフトを作成しました。シリアルバス経由で移動ロボットベースにコマンドを送信するのと、オドメータの情報からヘッディング(進行方向)と位置をグラフィカルに表示する機能を持っています。

ちまちま作っていたので、思ったより時間がかかってしまいました。模型と違ってソフトはある程度一気に作らないと効率悪いです。とまれ、画面はこんな感じです。


Base2

青い背景の部分がマップで、黄色い○が移動ロボットベースの現在位置、白い大きな○がスタート位置、ライン(本当はピンク)が軌跡です。隣の大きな円グラフは、左右のオドメータから計算した現在のロボットの進行方向(ヘッディング)を黄色の線で表示しています。

現在は右下のコマンドボタンでロボットを前後左右に走行させ、その結果をマップとヘッディングに表示させています。

いろいろと工夫した結果、駆動輪が滑らないフローリングの床では、なかなかいい成績をあげています。あちこち適当に運転した後スタート位置まで戻すと、マップ上でも黄色い○がスタート位置を表す白い○に「そこそこ」重なっています。

次回は簡単な移動ロボットでオドメトリの精度を稼ぐノウハウの話をしたいと思います。

2010年3月 1日 (月)

PWM制御と直進補正

ロボット作ろう:シェーキー製作記

PWMは結局フリーPWMを使うことにしました。発熱を嫌ったのと、結局、両者の速度制御の性能にあまり違いが無かったからです。ギアが固く、外力の影響を受けないからではないでしょうか。

この写真はホイールエンコーダの波形です。時間軸は10ms/div、電圧軸は500mV/divです。車輪1回転で50波形、書き込みのように立ち上がり、立ち下がりでカウントすることで、1回転100パルスの分解能を持っています。(クリックすると拡大します)

Dscn0478

このカウント値で左右の駆動輪ごとにオドメータ(距離計)を積算します。前進方向でプラス、後退方向でマイナスになる積算距離計です。

また、移動命令ごとに移動距離を勘定する左右のトリップメータも持たせています。これは移動命令の前にリセットして、移動距離を測ります。オドメータがあるのにこれを持たせているのは、直進補正のとき便利だからです。

前進、後退、その場回転のように左右の駆動輪を同じだけ回したいときに、「直進補正」を掛けます。
今回採用したアルゴリズムは、

「左右のトリップメータを比べて、先に行っている方のモーターを切る。同じ時は何もしない」という処理をPWMのパルス生成と同時に行う

という、例によって素朴なものです。
実際のソースコードは下記のようになります。(ブログに張り込むとインデントが失われて読みにくいですが、エディタに張るなどして読んでみてください) この処理を100usに1回、タイマー割り込みで周期的に行います。

/*
モータープロセス
port_Cのbit0,1が左モーター、bit2,3が右モーター
モーターパワー変数 Rpwm,Lpwm 0->Stop 64->Full
回転方向変数 Rdir,Ldir 0x1->FD,0x2->BK,0x3->BREAK
*/

//PWMの処理
++pwmcounter; //PWMの基準になるカウンタをインクリメント
if(pwmcounter > 63) pwmcounter = 0; //上限値63を超えたらリセット
i = 0; //作業用変数に左右モーターストップをセット
if(Lpwm > pwmcounter) {
i = Ldir; //左モーターパワー値が基準カウンタを超えているときだけモーター駆動
}
if(Rpwm > pwmcounter) {
i = i | (Rdir << 2); //右モータパワー値が基準カウンタを超えているときだけモーター駆動
}

//トリップカウンタを比べて直進補正
//モーターパワーが等しいとき(前進・後退・超信地旋回)に左右駆動輪の回転数を合わせる
if((Rdir != MTBRK) && (Ldir != MTBRK)){
if(Rpwm == Lpwm){
if(Rtrip > Ltrip){
i = i & 0xf3; //右駆動輪が回りすぎているので右モーターを切る
}
if(Rtrip < Ltrip){
i = i & 0xfc; //左駆動輪が回りすぎているので左モーターを切る
}
}
}
port_C = (port_C & 0xf0) | i; //完成したPWM情報を書き出し

左モータードライバがport Cのbit0,bit1、右モータードライバがbit2,bit3に接続されています。直進補正がかかるのは両方のパワーの指定が一緒の場合で、かつブレーキ(定数MTBRK)が設定されていないときだけです。

これで、きわめて安定に直進補正がかかりパワー制御もスムーズです。でも、前に書いたようあまり速度は変わりません。
また、PWMを40%以下にするとモーターが起動しなくなります。このモーターはこんな性能のようで、安定化電源で電圧を掛けても、12V定格に対して4.5Vくらいは掛けないと起動しません。

« 2010年2月 | トップページ | 2010年4月 »