忍者ブログ
幅広く、浅く、ゆるく、気まぐれにが目標のブログ的なもの。
[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

396 2010 11 11 ジャイロセンサについて


タイトルはこうつけましたが、
最初の方は愚痴ですね
あとは役に立ちづらい情報
まあ、たたないだろうが
前回のうつな回より気分にはうつ
簡単に言えば、投げやりにおれなんて何の役にもたたないんだよ
ってな感じ
前回のうつ話の始まりは確か無力感から始まりましたが
今日は無力なのは充分承知だ
だが、役にたたない無駄だ
という感じかな
いや~
本当に最初は何にもならない愚痴ですよ
こんなところで一人で言ってもしょうがないとは思いますが
本当に何なんでしょう私
タイミングが相変わらずかなり悪く
やってもできない
そんな勝手な解釈も悪いのはわかっていますが、
それでも…
モチベーションが持たなくてもやらないことはないんですが
なんだかんだ理由をつけても
やったりやらなかったりと大変中途半端
明らかな無気力より
よりたちが悪い
集中力がないんですかね
本人にだけ問題がある
けして、誰かのせいではない
本人が悪い
でも諦めとやる気が折り混ざって中途半端
やるにはやるが
どうもだめ
皆さんが教えても大したことはできない
いや、何も理解できてない
だが、諦めないから
より訳が分からない
理解する気がないのに
やろうとする
意味をわかろうとしないのに
使おうとする
マジカルナンバー0?
それでもやる
諦める
どうにもならない 

私が完全にできるものなんてない 
誰にも誇れない
上辺の知識を知らない人にかすめるに限る
はぁ~
珍しくよし、これをやるぞと決めても
何らかの理由でちゃんとできることはない
と思うからこそ一つの簡単なつまずきで全てをこぼす
選択肢を間違え続ける
あてにならない
もっとちゃんとできるようにはなりたいのだけど… 

という感じで
後半です
いつの間にか大変重要な立ち位置になってしまった
ジャイロセンサです。
最初はやってみるか
と軽い感じで始めたはずが
自己位置推定においてなくてはならないものに
リアルワールドではオドメトリなんてずれるのだよ
あざ笑うかのよう
だいぶ重いものになってしまった
申し訳ない限りではあります。
障害物の検知と回避にはあまり関係はないのですが
自己位置を理解する上では必要不可欠なもの
自分の今の向きってかなり重要
方位センサを用いる手もありますが、
定番はこれ 

使用するのが
サイズは大きいが、素晴らしい精度の光ファイバージャイロではなく
小さいが技術の向上により精度が上がっている
振動型ジャイロ
軽し、小さいからね。
  最初に使っていたのが、ストロベリーリナックスに売ってた
"IMU 5 Degrees of Freedom"
三軸加速度と二軸ジャイロを搭載
ADXL335+IDG500
電源電圧:3.3V
これでいろいろ学んだんですよ。
赤い基板。
とりあえず、回路が駄目な私は周りに教えてもらいながら
SH7125でAD変換してその数値をシンプルタームでPCに表示
最初は加速度と角速度すらミスして何を表示しているかもわかっていない。
三軸の加速度と二軸のジャイロですから。
これはやっと把握
で、使うのは二軸のジャイロ
しかし、どうやらそのままでは使えない
ということがわかった。
グラフにすると全くの静止状態でもブレまくる
これではね・・・・。
これも教えてもらいながら、補正。
補正内容としては
=((現在の値*4)+(過去の値*6))/10
フィルタをかけて補正。
まあ、4とか6はヒューリスティックに決めた値だから、そのときに応じて変更
入力される電源電圧自体がぶれていた時はコンデンサをGNDとVCCの間に挟む。
接続自体がUSBならまあ、PCによるらしい。
今回の場合はUSBではなくRS232Cだけどね・・・。
一応これで多少の安定は保たれたかに見えたが

その前にAD変換はセンサの値をアナログからデジタルに変えるのだが、
変えた後の値はいきなり角速度が出るわけもなく
そのままでは使えないので計算
今回の場合はSH7125のについているAD変換器を使用。
だから分解能は10bit
電源電圧は3.3V
サンプリング周波数は10m
これを考慮して手計算
=(AD[V]-平均値[V])/(2^(10[bit])*19[m]/5[V])
  でよかったはず。
これで角速度がでる。
さらに使いたかったのは角度
簡易な積分
=[deg/sec]*割り込み時間
ででる。
これで安心と思ったら、 
ジャイロって温度でドリフトするんですね。 
ドリフト言うのは、角度が全くの静止状態でも
0で保てずに段々と動き続ける
さらに積分をしているため
積分誤差がたまり続ける。
これも大分迷惑。
これをなくすことにいろいろと悩んだんですよ。

最初に使ったのはあとからこの方法は大分マイナーだと知ったのですが
当時(数週間前)はこれならいけるのではと
かなり安易にとりあえずで、
プログラムに実装してみたんですよ。
内容としては
ADを加算して割って小数点を切り捨てたものと
ADを加算して割ったものを比較
ある決めた値より大きいか、小さいかを比較する
小数点を切り捨てたものの方が大きかった場合、
最小二乗法で近似した値をオフセットに
小さかった場合は
そのままの値をオフセットにする
このオフセットをADの値から引く
これをADの値として計算する。
ややこしい。
赤い基板の方ではまあまあ安定したんだけどね。
もっと簡単にした方がいい 
というか理論もわかってないのにつかなということで
もっと簡単な方法を試した

平滑化です。
より簡単にいうと平均化かな
値を何個かの平均の値を使用 
=AD-|(AD-平滑化値)|
でいいかな
こちらは試してない。
この平滑化の値は計算時に毎回変えるのではなく
最初にとってそのまま使い続ける。
これで数値をとれば、温度のドリフトはある程度防げるはず。
まだ、問題の積分誤差はあるのだけど。
こちらはただただ上がり続けるものなので 
こちら側も計算上で引き続ければいいはず。

まあ、ジャイロ側はこんな感じで 
他にいろいろあったのが、 
ジャイロセンサの値を受ける側がいろいろ変わった件について
私は回路については本当に駄目駄目なので
結果的には全てがだめだめでしたが・・・・
ともかく、マイコンも変化が
最初はSH7125の内部AD変換10bitだったが
分解能が足りないのではということで
PIC+外部AD変換16bit
これが私の最小二乗のプログラムを重すぎて使えなかった。
ということで
  SH+外部AD変換16bit
  まあ動いたには動いたのですが
前に言ったようにこのアルゴリズムでは使えない。
平滑化をつくっていたのですが
最終的にはRTミドルウェア上で動かすため
マイコンからのAD変換の値を受けるコンポーネントが必要に
私はこれでも作成しようと
かなり思考錯誤したのですが
環境作成時点でできてない・・・
間に合わない。
ということでできる先輩が作成
よって
PIC+外部AD変換に戻った。
どうやらPICで計算するのは重いらしく
計算はコンポーネントでしているよう。
平滑化も4つで行っているよう。
結果的に私は役立たず。
駄目だこりゃ。
さらに何もしてないのではまずかと
調整を任されたのですが
回路的に壊しましたよ。
はぁー
電子回路基礎をもっとべんきょうします。

ちなみにジャイロセンサの方も変わりました
赤い基板から 
1軸の高精度ジャイロに
まあ、壊したんだけどね。
コンポーネントについてもしっかりと学ばないと
やることはまだまだたくさんある
今のところは中途半端に役立たず。
では次回。
PR
394 2010 11 01 RTミドルウェアについて3

 更新回数が格段と減っていますが、
ブログをやめるという選択肢はありません。
うつな内容はしませんが、
専門的な内容をしたいと思います。
自分の脳内の整理のためにも
ということで今回もRTミドルウェアの話を
図もなく、見ずらいですが 
感覚だけでもつかみたい。
内容は参考資料に大分近いです
内容は違いませんが、話の仕方は大分崩れています。

そういえば思いましたが、
このような勉強はのせてもいいですが
研究となるとあまりよろしくはないみたいですね。
情報開示的な意味で
私のことだから、今後くちばしそうで怖いですね。


今回はコンポーネントの内部説明をします。
各コンポーネントがどのように中で処理しているかについてまとめてみます。
この参考にした本ではLEGO MINDSTORMSのシミュレータを使用してますが
ここでは別にその話はしません。
本の内容がそのままでもしかたないので、
このシミュレータはJavaとC++のRTコンポーネントを同時に動かしている感じ
シミュレータでJava3Dを使用するため。
といってもつくるのはコントローラのみ
コンポーネントの設計では具体的には
4つの機能をどのように使用するか検討する
データポート
アクティビティ
サービスポート
コンフィギュレーション
の4つ
一つ一つ考えてみます。

データポート
データの入出力をするポート
InportからOutportにデータが流れる
種類としては
TimedState      RTコンポーネントの状態を表現するデータ型
TimedShort      符号あり2バイト整数型
TimedLong       符号あり4バイト整数型
TimedUShort     符号なし2バイト整数型 
TimedULong      符号なし4バイト整数型
TimedFloat      単精度浮動小数点(2バイト)
TimedDouble    倍精度浮動小数点(4バイト)
TimedChar       符号あり1バイト整数型
TimedBoolean   ブール。論理型。TRUEかFALSEの2値のみ
TimedOctet    符号なし1バイト整数型
TimedShortSeq   符号あり2バイト整数型配列
TimedUShortSeq  符号なし2バイト整数型配列
TimedLongSeq    符号あり4バイト整数型配列
TimedULongSeq   符号なし4バイト整数型配列
TimedFloatSeq   単精度浮動小数点(2バイト)
TimedDoubleSeq  倍精度浮動小数点(4バイト)
TimedCharSeq    符号あり1バイト整数型配列 
TimedBooleanSeq ブール配列
TimedOctetSeq   符号なし1バイト整数型配列 
場合に応じて使い分ければいいはず。 
たとえば、モーターコントロールのコンポーネントがあるとしたら、
Inportが外部からのセンサの値で 
Outportが駆動モータの速度
がでてきたりする。

アクティビティ
ロジック
RTコンポーネントのアクティビティはステートマシンとして動作する
コンポーネントの動作はステートマシンの状態や状態遷移時として動作する
ステートマシンとはある状態における動作を設計図のようにまとめて
その場その場で状態に応じた動作を決定するというロジック
RTコンポーネントのステートマシンは決まっているのでそれを見ればよい。 
図は著作権的にのっけていいのかわからなかったので
産総研の解説ページでみてください。
解説としては
開始を黒丸、終了状態を二重の黒丸、
それ以外の状態を角度のゆるい四角で囲んでます。
図によると、開始状態(黒丸)→Create状態→Alive状態→終了状態(二重黒丸)
Alive状態の内部で変化する
上部分にあるのはStopped(停止中)とRunning(実行中)
停止状態がstartを受け取ると
RTコンポーネントのonStartupを実行して実行状態に
実行状態がstopを受け取ると
RTコンポーネントのonShutdownを実行して停止状態に
遷移する
停止状態の場合は全てのアクションが動作しない。
下部分にあるのはActive(アクティブ)と
Inactive(非アクティブ)とError(エラー)
初期状態だと非アクティブになっており、
アクティブ化するとRTコンポーネントに
onActivateがコールされてアクティブになる
アクティブになるとonExecuteが繰り返し実行され続ける。
ロボットの基本的な動作はこのonExecute内で記述される。
またコンポーネントはエラーがでるか、非アクティブにならない限り
アクティブ状態にたまり続ける
非アクティブ化されるときはonDeactivateがコールされて非アクティブになる。
エラーが出た場合はonAbortingがコールされエラー状態に遷移する。
エラーの場合はリセットがかかるまでエラー状態にたまり続け、
onErrorがコールされ続ける。
外部からリセットするとonResetがコールされ、
それが成功すると非アクティブ状態に遷移する。
再びアクティブ状態にすることも可能ですが、
失敗するとまたエラー表示になります。
アクションのまとめ
onInitialize    初期化処理.コンポーネントの起動時に一度だけ呼ばれる.
onActivated    非アクティブ状態からアクティブ化されるとき1度だけ呼ばれる.
onExecute    アクティブ状態時に周期的に呼ばれる.
onDeactivated    アクティブ状態から非アクティブ化されるとき1度だけ呼ばれる.
onAborting    ERROR状態に入る前に1度だけ呼ばれる.
onReset        エラー状態からリセットされ非アクティブ状態に移行するときに1度だけ呼ばれる.
onError        エラー状態にいる間周期的に呼ばれる.
onFinalize    コンポーネントライフサイクルの終了時に1度だけ呼ばれる.
onStateUpdate    onExecuteの後毎回呼ばれる.
onRateChanged    ExecutionContextのrateが変更されたとき呼ばれる.
onStartup    ExecutionContextが実行を開始するとき1度だけ呼ばれる.
onShutdown    ExecutionContextが実行を停止するとき1度だけ呼ばれる.

サービスポート
何らかの機能(サービス)を提供したり使用したりするための仕組み
データポートに入力ポートと出力ポートに分かれているように
サービスにも出力する側と受け取る側がある
サービスを提供するポート(サービスプロバイダ)と
サービスを使用するポート(サービスコンシューマ)がある。
これらのポートから接続してサービスコンシューマから要求を出すことにより
サービスプロバイダの提供するサービスを使用できる。
任意で複数のサービスインターフェースを使用できる。

コンフィギュレーション
RTコンポーネントのパラメータ管理の仕組み
RTCLinkなどからパラメータを変更したり 
パラメータの初期値の読み込みができたり
コンフィギュレーションをセットで複数もち、
状況に応じたパラメータを使い分けることもできます
パラメータは名前と値の組み合わせで管理
このパラメータは任意の数だけもつことが可能
このパラメータ群のことをコンフィギュレーションセット
といいこれにも名前がつきます。
このコンフィギュレーションセットも任意の数だけもつことが可能
また、使う人は複数のコンフィギュレーションセットの中から
使用したいものを一つだけ選び有効にすることができる。
これをアクティブコンフィギュレーションといい
セット名を変更することにより自由に変更することができる
データポートは動的に動くもの
コンフィギュレーションは静的に動くものに向いている。 

今回はこんな感じで
RTコンポーネントはこの4つを変更することにより、
動作している様子。
この文章に意義があるのかは置いといて
私的にはこのようにまとめてみた方が脳の整理になる
リハーサル?
長期記憶にいれるための脳内整理?

一応関係している用語もまとめてみた。
流石に140文字には納めずらいからね。

IDL(Interface Definition Language)
インターフェース定義言語
ソフトウェアコンポーネント間のインターフェースを記述のときに使用される言語
プログラミング言語に依存しない形式で記述するため
異なる言語でかかれたソフトウェア間の通信を可能にする

CORBA
OMGが定めた分散オブジェクト技術の仕様
異機種分散環境上のオブジェクト(プログラム部品)間で 
メッセージを交換するためソフトウェア(ORB)の仕様を定めている

参考資料
はじめてのコンポーネント指向ロボットアプリケーション開発 RTミドルウェア

つっこみどころがあるようなら是非コメントをよろしくお願いします。
毎回、専門話のまとめにはしたくはないなー。
ではまた次回。

391 2010 10 01 RTミドルウェアについて1

 最近更新は少ないですね
ツイッターではいろいろ言ってますが、
ブログも更新しないと
更新したい。
今回は最近勉強しているRTミドルウェアの話でもします。
別に研究っているわけでもないので話します
といっても、別に分かりやすいマニュアルを作りたいわけではないので
これまでの復習的になメモ程度のものにします。
私の頭の回転は遅い方と思っているので・・・・
ミスがあったら教えてください。
あくまでも私の認識ですから

ではまずはRTミドルウェアとは
このブログ自体ロボットの話ばかりやっているようなブログでないので
簡単なところから
RTミドルウェアとは
ロボットのためのソフトウェアの規格
うーん。
これではかたいかな?
通常、ロボットはハードウェア・ソフトウェアに分かれているが
今現在は私の認識ではロボット研究は
それぞれがそれぞれのハードのためのソフトになっている
各個人個人で別々に作成している
それでは規格がなくて進歩が大幅には進まない。
ということで産業技術総合研究所によって作成された規格
具体的には
PC内でRTコンポーネントというものを配置して繋げるだけで
通信などは勝手にやってくれてロボットが動く

RTコンポーネントとはRTミドルウェア上で動くシステム
実際にはこれを開発する
部品というかブロックみたいな感じ
配置して決まった線同士をコンポーネントごとにつなぐ
これに外部からの情報を入力して制御する

わかりずらいですかね?
まあ、わかりやすい解説はもっとあるので
丸投げします。
ようはソフトを簡単にブロックみたいにつなぐだけでソフトが完成する
あとはちゃんと動くハードがあれば問題ない。
となるもの。
便利なはずなんですが・・・・
なぜかそんなにやってない
なぜか?
今のところの感覚だと
いろいろとなんだかわかりずらい。

まあ、動かしてみないことにはねー
概要はこんな感じで
さっそくRTミドルウェアの環境設定からインストをします。
正直なところ、いろいろと面倒です。
マニュアルは産総研のRTミドルウェアの公式ページで
ダウンロードもそこに必要なものは全部あると思います。
一応私も動いたので
使用したものリストを
ACE-5.6_vc9.msi
OSの互換
eclipse32_rtclink041_rtctemplate042_win32.zip
エクリプスなんですが、いろいろエクリプスには違うバーションがあるのですが、
今回は産総研の全部入りをダウンロード
本来なら、RtcLinkと呼ばれるプラグインが必要です。
omniORB-4.1.2_vc9.msi
コルバのインストです。
OpenRTM-sidt-0.4.2-jp_vc9.msi
これが本体
バージョンは0.4.2です。
この上の1.0がありましたが、こちらの方が性能は上らしいですが
いろいろ試す分にはサンプルは0.4の方が多いらしいので 
(知り合いの感想)
python-2.4.4.msi
言語のパイソン
今回は2.4.4で動きました
pyYAML-3.05.win32-py2.4.exe
YAMLライブラリ

私の場合起こった注意するべき点は
今回はwindowsVistaで環境を作ったのですが
vistaでは管理者権限というものがあり、
ネームサーバへのアクセスが管理者権限が必要になる
そのため、OpenRTM内の一部の権限を変えておかなくてはならないです。
そこに引っ掛かるといろいろと面倒です。
あと、もとから入れてたエクリプスを使おうとしたら、
前文にも書いたようにRtcLinkが必要です。

ってな感じで動きました。
サンプルがあるのでそこを動かしました
今の段階ではサンプルを動かす程度で
1と書いたように今後もまた進んだら、
続きを書こうと思います。
参考図書は
はじめてのコンポーネント指向ロボットアプリケーション開発
~RTミドルウェア入門~
です。
今後はどうにかこうにか簡単なコンポーネント作成をしたいかな
では次回。
389 2010 09 07 ハードとソフトについて

 いや、研究室合宿から帰ってきました。
いろいろありました。
まあ、いろいろ
基本的には研究室メンバーと仲を深めるということがメインテーマ
なので、そんなに学ぶ!
ということはしていませんが、
全くしてなかったわけでもありません。
合宿内でのミーティングはありました。
学年関係なくチームをつくり一つのことについて議論しました。
ルール的には妥協と多数決はなしだったのですが
その中で私の所属していたチームの中で話に上がり、
結果的に私だけが一人残されて妥協できなかったことがあったので
今回はそんな話。

簡潔にいうならば、
ロボットにハードは必要か?
ということです。
ロボットというものは今の段階では定義は固定されていません。
一般の人からのイメージはありますが、
そんなものは定義ではありません。
一般のイメージだと
ひどい場合は漫画やアニメを意識しすぎて、
二足の完全なる人型のものイメージするかもしれません。
しかし、それはほんの一部にすぎません。
あくまでも一例
幻想この上ない。
安直です。
日本人はそれによって、ロボットに対するイメージが悪くないという
良い点もありますが、
それだけではありません。
その場合はどちらかというとアンドロイドです
ロボット=アンドロイドではないですからね。
しかも、ロボットという言葉よりアンドロイドの方がはやくからあります。
よってロボット=人型ではありません。

ならば、どうならばロボットなのか?
それが難しいのです。
はっきりといえば、人の見解によって違います。
自律するかしないか
CPUからアクチュエータを動作させる
入力から何かしら出力が出せればいい
など人により違いますがいろいろあります。
そこで出てくるのが、ハードの必要性です。
ただただ、何かしらを自分で考えて出力するだけであるならば
ロボットにハードは必要ない。
が、実際の空間でロボットを動かす必要があるならば
ロボットにハードは必要。
それが問題です。
これがないあるによって今後が大幅に違う
今後というのも、今後ロボットが本当に一般化していた世界になると仮定したとき

ハードがないとまさに電脳世界。
実感覚の存在するネットゲームのような世界
本人であり本人ではないアバターの世界
究極的には本体である人間の体が必要なくなるかもしれない?
・・・・ロボット?
妄想を無駄に広げすぎですね。
とりあえず、ハードがなくデータ上に存在するロボット 
自動と感覚

他に考えるとハードのある世界
ロボットが体の身代わりとなる世界
また、外れてる気がしますが
人間本人とは別に自身が考えて動く体がある?
補助として現実的に使える?現実? 
お手伝いさん?
飛躍はしません。
人間の身体力の限界を超えた稼働のできる存在かな
これをどのように使用するかは別の話ということで
今後共々、ロボットに現実世界に存在する形が必要かという話

話を進めると、
私は必要だと思うんです。
しかし、結果的には必要がないとされた
私の説得力不足。
必要だと納得させるだけの理由が必要ということ。
テーマ的には会話でした
ただ、会話という行動に限るのならば
ハードは必要ないんです
画面に話しかけて、答えが返ってくればいいんですよね
画面?マイクかな
とりあえず、アクションに対して何かしらのリアクションが帰ってくればいい
まあ、画面というハードがあるのは無視して。
現段階では完全にソフトだけどはいかない
だって現実世界に出力するためのハードがないと
人間には理解できない。
それは置いておいても、
ロボットというならば、機体があってこそだとは思うんですが
自分が作りたいからだけではなく、
機体を必要とするはずだから
本体があるならば、現実世界に人間には不可能なことができる
それが会話という場合において必要かどうかを考えると・・・。
会話においては必要ないかな・・・
でも、それはあくまでも会話に限る場合
会話ではない場合は必要だと思います・・・

話がまとまらない・・・。
また、今度書きなおしますかね
では次回。

カレンダー

01 2025/02 03
S M T W T F S
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
フリーエリア

最新CM

[06/05 ProrUnioroMut]
[05/07 Axonryunene]
[08/03 にゅん。]
[07/24 にゅん。]
[07/19 にゅん。]
最新TB

プロフィール

HN:
ねこう・へば~
性別:
男性
バーコード

ブログ内検索

カウンター

アクセス解析

お天気情報