ロボット、千葉ロッテマリーンズについていいかげんなことを書きます。
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
突然ですがクイズです。
下の画像の白い物体は何でしょうか?
解答はこの記事の最後にします。
それはさておき、何をやるのか決まっていない状態なのでとりあえず絵に描いてみるとします。
まずは貯金できない人用に財布から金を無理やり強奪して貯金するロボットを考えました。
ドラえもんでこんな道具があったような気がします。
まずこっそり、もしくは無理やり財布を奪い取ります。
そしてハンドで財布の小銭入れを開くのは困難なので何らかの方法で財布を破壊します。上のGIFアニメでは仮定はよく分かりませんが真っ二つになっています。
そして中身から10円を取り出してロボット本体に設置しておいた容器に入れます。
すごい完璧じゃないか!!!!
・・・・何を言っているのかよく分からなくなってきたのでこの辺でやめておきます。
他にも色々と考えたのですが絵に描くのが非常に面倒くさいのでやめておきます。
上の糞くだらないGIFアニメでも5枚も絵を描いてあるので決して楽な作業ではありません。
あまり関係ないけど、Edisonを使ってロボットを制御する上で気付いた事を書いておきます。
まずArduinoと通信させようと思ってEdisonのUSBポートにUSBシリアル変換ケーブルを差してみたのですが認識してくれませんでした。FTDIドライバがインストールされていないと言う事でしょうかね?
とか考えていたのですが、冷静に考えればRXピン、TXピンに接続すれば良かっただけだったかもしれないですね・・・・試してないけど。
インクリメンタルエンコーダもタコジェネレータも持っていないので今の所クローラーの速度制御はできていません。
となるとこのサイトみたいに逆起電力から推定するという方法もあります。
そうなるとEdisonから直接制御するのは無理そうなので別のマイコンで制御する必要がありそうです。それはそれで部品が増えるので嫌だなあ。
何かいい方法はないかと探してみるとこれなんか面白そうだと思いました。
大した精度が要求されるわけでもないですし、これでも良いかもしれないです。
特に答え合わせする必要もないと思いますけど、一応クイズの解答をしたいと思います。
正解は猫でした。
どうでもいいけど、ロボットで猫の柔らかさは絶対に表現できないと思う。
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・
下の画像の白い物体は何でしょうか?
解答はこの記事の最後にします。
それはさておき、何をやるのか決まっていない状態なのでとりあえず絵に描いてみるとします。
まずは貯金できない人用に財布から金を無理やり強奪して貯金するロボットを考えました。
ドラえもんでこんな道具があったような気がします。
まずこっそり、もしくは無理やり財布を奪い取ります。
そしてハンドで財布の小銭入れを開くのは困難なので何らかの方法で財布を破壊します。上のGIFアニメでは仮定はよく分かりませんが真っ二つになっています。
そして中身から10円を取り出してロボット本体に設置しておいた容器に入れます。
すごい完璧じゃないか!!!!
・・・・何を言っているのかよく分からなくなってきたのでこの辺でやめておきます。
他にも色々と考えたのですが絵に描くのが非常に面倒くさいのでやめておきます。
上の糞くだらないGIFアニメでも5枚も絵を描いてあるので決して楽な作業ではありません。
あまり関係ないけど、Edisonを使ってロボットを制御する上で気付いた事を書いておきます。
まずArduinoと通信させようと思ってEdisonのUSBポートにUSBシリアル変換ケーブルを差してみたのですが認識してくれませんでした。FTDIドライバがインストールされていないと言う事でしょうかね?
とか考えていたのですが、冷静に考えればRXピン、TXピンに接続すれば良かっただけだったかもしれないですね・・・・試してないけど。
インクリメンタルエンコーダもタコジェネレータも持っていないので今の所クローラーの速度制御はできていません。
となるとこのサイトみたいに逆起電力から推定するという方法もあります。
そうなるとEdisonから直接制御するのは無理そうなので別のマイコンで制御する必要がありそうです。それはそれで部品が増えるので嫌だなあ。
何かいい方法はないかと探してみるとこれなんか面白そうだと思いました。
大した精度が要求されるわけでもないですし、これでも良いかもしれないです。
特に答え合わせする必要もないと思いますけど、一応クイズの解答をしたいと思います。
正解は猫でした。
どうでもいいけど、ロボットで猫の柔らかさは絶対に表現できないと思う。
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・
PR
結果的にはこんな感じです。
なんだか実機の姿勢がGUIに反映されるのがやけに遅いなあ。
どうにもクローラー制御RTCの処理が異様に遅いらしく、どこかに不具合がある可能性は高そうです。
それもですが、まだ人の環境で使ってもらうのが難しい状態なのが問題です。
GUIを動作させるのが使用しているソフトウェアが多い事もあってあまり簡単ではないのが最大の問題です。
詰まるポイントとしてダウンロード先でインストールされているDirectXのバージョンが新しすぎて動作できないと言う事があります。
まあplugins.cfgのPlugin=RenderSystem_Direct3D9をコメントアウトすれば良いのですけど、OpenGLを使う事を強要しているみたいであまり好きではないです。
と言うよりRenderSystem_Direct3D11も使えると思うのですけど、どうすればRenderSystem_Direct3D11.dllを生成してくれるのですかね?
それともDirect3D 11.0がインストールされたPCでOgre3Dをビルドすると生成されるのか・・・よくわからないので試してはみます。CMakeファイルを見た感じではif (OGRE_RenderSystem_Direct3D11_FOUND)~辺りがそうだと思うのですが何を判定しているのかがよく分かりません。
まだマニュアルも書いていないので、人に使ってもらう段階ではありません。
これでようやく土台ができたとは思うので、ここから何か奇抜な事をしなければなりません。ここまではただの準備です。
今の所、他の人のRTCをなにも使ってないなあ。
その辺も含めて考えたいとは思います。
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・
色々試してみた結果以下の製品を使う事になりました。
地磁気、加速度センサ
LSM303DLHC
1500円は手ごろな値段だと思ったのでこれにしました。
姿勢の計測に使います。
さすがに加速度センサの計測値を二重積分して現在位置を求めるのは無茶なのでやめました。
角速度センサ
L3GD20
なんでも430円の角速度、角加速度センサがあるらしいですが、持っていないので上のセンサを使います。加速度センサの計測値と合わせて姿勢を計算しようとしたのですが、まだ実装できていません。姿勢は地磁気、加速度だけで計算しています。なので今の所は角速度の計測値をデータポートから出力する事にしか使っていません。
測距センサ
GP2Y0A21YK ×4
とりあえず近い所に障害物を検知すると避けるようにします。
クローラーの前後に2つずつ取り付けます。
本当は3つ取り付けたいのですがアナログ入力ピンが全部埋まっているので2つで妥協します。
後は制御でなんとかカバーします。
モータードライバIC
TA8428K
比較的流せる電流値が大きいのでこれにしました。
と言うか130モーターなんか使わなければこんなにモータードライバで苦労する事もなかったような気もしますが、組み立てるのが面倒になりそうなので仕方ないです。
7V以上が動作電圧になっていますが、試してみたところ6Vでも動作するみたいです。
130モーターなので3Vぐらいにしたいのですが、さすがに3Vでは動作しないみたいです。
ただ、6Vを入力すると電圧のドロップで3~4Vぐらいになるのでちょうどいい感じになっているみたいです。
PWM出力ドライバー
PCA9685
今さらですけどEdisonでサーボを制御する方法って何かないのですかね?
多分Arduinoでサーボを制御する場合はPWMを使うのではなくて直接HIGHとLOWを一定時間で切り替えていると思うのですけどEdisonで同じ事はできるのでしょうか?sleepの精度が無理な感じがするのですがよくわからないので上記の製品を使います。
本当はarduinoのシールドではなくてこの製品を使いたかったのですが、いつ見ても在庫切れなので今回は妥協します。値段はあまり変わらないのですが多少大きいのが厳しいですね。同じチップを使っているので別にどちらでも動作はできるとは思います。
後はクローラー作成に必要なものなので値段や入手しやすさとかで選んでいます。
自分で加工は全くしないようにしています。RTMコンテストに出すかどうかは分かりませんが、加工するとなると動作できる可能性が下がりそうなので避けていきます。
ライトダッシュモーター ×2
モーターの性能を調べてみて、消費電流3A以下でちょうどよさそうなのを選びました。
まあ4Vぐらいの電圧が加わるので、実際はもっと大きな電流が流れると思うのですが・・・まあ多分大丈夫だろう。多分。
あまり関係ないけどTA7291Pでプラズマダッシュモーターを制御しようとするとピクって動いた後に全く動かなくなって、TA7291Pがやたらと発熱していました。プラズマダッシュモーター恐ろしい子。
トラック&ホイールセット ×4
適当なのを選びました。
下のユニバーサルプレートLと組み合わせた制作例で4つキャタピラを使っているようだったので4つ使います。作ってみて分かったのですが付属している車軸の長さの関係で2つずつ使わざる得ないようですね。
ユニバーサルプレートL 210×160mm ×2
アームを搭載できるように少し大き目なのを選びました。
シングルギヤボックス 4速タイプ ×2
上記のトラック&ホイールセットと簡単に組み合わせられそうなのがこれなのでこれにします。
ユニバーサルプレートセット ×2
実の所プレートが目的ではなくて、付属の部品を測距センサの取り付けに使います。
余ったプレートを左右に取り付けていますが飾りです。
あとはロボットアームを買ってください。
4自由度ロボットアーム
6自由度のアームは少し高いので4自由度のアームを買った方が良いと思います。
それからEdisonはArduinoキットを使っています。
Intel Edison Kit for Arduino
Breakout Boardキットを使う場合はPWM、I2Cの信号をレベル変換してください。
後は必要に応じてブレッドボード、ジャンパーコード、コネクタ付きコード、コンデンサ、スペーサー、電池ボックス、ACアダプタ、USB-MicroUSBケーブル等を買ってください。
これらを使って以下のようなロボットを作成しました。
配線がごちゃごちゃしていますが気にしない事にします。
EdisonとPWMサーボドライバーがやたらと面積を取るため二段になっていますが、EdisonをBreakout Boardキットに変更して、PWMサーボドライバは在庫切れで買えなかった方に変更、さらに回路基板を自作すればブレッドボードを使うより小さくできるので2段にする必要はないかもしれないです。
RTCは以下の4つを作成しました。
まずはGUIのRTCです。
GUIでアーム、クローラーを操作するとデータポート、サービスポートで他のRTCに通信してアーム、クローラーを操作します。
InPortの仕様は以下のようになっています。
crawlerPos TimedPose2D型 クローラーの位置、姿勢
OutPortの仕様は以下のようになっています。
crawlerTargetPos TimedPose2D型 クローラーの目標位置、姿勢
crawlerTargetSpeed0 TimedDouble 右車輪の速度(ただし、以下で説明するシステムではモーターの電圧としている)
crawlerTargetSpeed1 TimedDouble 左車輪の速度
次にアーム制御RTCです。
サービスポートで目標位置を入力すると現在位置からの軌道を計算し、そこから目標関節角速度を計算します。ただ今回はサーボが位置制御しかできず、関節角度を取得する手段もないため目標関節角速度を積分した値を目標関節角度にしています。
OutPortの仕様は以下のようになっています。
jpos TimedDoubleSeq 目標関節角度
mpos TimedDoubleSeq モーターの目標角度
コンフィギュレーションパラメータの仕様は以下のようになっています。
init_angle1 double 関節1の初期角度 0
init_angle2 double 関節2の初期角度 1.5
init_angle3 double 関節3の初期角度 -0.5
init_angle4 double 関節4の初期角度 0
init_gripperPos double グリッパーの初期位置 0
次にサーボ制御RTCです。
RCサーボへの目標角度をInPortから受信して、PCA9685搭載のデバイスにI2CでPWMのデューティー比を指令します。
InPortの仕様は以下のようになっています。
in TimedDoubleSeq サーボモータの目標角度
コンフィギュレーションパラメータの仕様は以下のようになっています。
I2C_address int PCA9685のI2Cスレーブアドレス 0x40
I2C_channel int I2Cポート番号 1
最後にクローラー制御RTCです。
InPortの仕様は以下のようになっています。
in0 TimedDouble 左モーターの電圧
in1 TimedDouble 右モーターの電圧
OutPortの仕様は以下のようになっています。
gyro TimedAngularVelocity3D ジャイロセンサーの計測値(rad/s)
range0 TimedDouble 距離センサ(右前)の計測値(m)
range1 TimedDouble 距離センサ(左前)の計測値(m)
range2 TimedDouble 距離センサ(右後)の計測値(m)
range3 TimedDouble 距離センサ(左後)の計測値(m)
acc TimedAcceleration3D 加速度センサの計測値(m/s^2)
magn TimedDoubleSeq 地磁気センサの計測値(gauss)
temp TimedDouble 温度センサの計測値(℃)
pos TimedPose2D センサ情報から計算した現在位置、姿勢(位置の計測は実装できていないので左右モーターの電圧が正の場合は前進、負の場合は後退するようにしてある)
センサで検出した値は括弧内の単位に変換してあります。
コンフィギュレーションパラメータの仕様は以下のようになっています。
motor0pwm0 int 右モーター制御用TA8428KのIN1に接続するピン番号 3
motor0pwm1 int 右モーター制御用TA8428KのIN2に接続するピン番号 5
motor1pwm0 int 左モーター制御用TA8428KのIN1に接続するピン番号 6
motor1pwm1 int 左モーター制御用TA8428KのIN2に接続するピン番号 9
gyroSensor int 1の時はジャイロセンサを使用する 1
gyroSensor_addr int L3GD20のI2Cスレーブアドレス 0x6A
rangeSensor0 int 1の時は距離センサ(右前)を使用する 1
rangeSensor1 int 1の時は距離センサ(左前)を使用する 1
rangeSensor2 int 1の時は距離センサ(右後)を使用する 1
rangeSensor3 int 1の時は距離センサ(左後)を使用する 1
rangeSensor0_Pin int 距離センサ(右前)の信号線と接続するアナログ入力ピンの番号 2
rangeSensor1_Pin int 距離センサ(左前)の信号線と接続するアナログ入力ピンの番号 3
rangeSensor2_Pin int 距離センサ(右後)の信号線と接続するアナログ入力ピンの番号 0
rangeSensor3_Pin int 距離センサ(左後)の信号線と接続するアナログ入力ピンの番号 1
LSM303DLHC int 1の時はLSM303DLHCを使用する 1
Acc_addr int LSM303DLHCの加速度センサのI2Cスレーブアドレス 0x19
Magn_addr int LSM303DLHCの地磁気センサのI2Cスレーブアドレス 0x1E
I2C_channel int I2Cのポート番号 1
rotOffset double posから出力する姿勢角のオフセット値 -1.1
以下は障害物回避の制御に必要なパラメータです。
bias double 障害物が近づいた場合にどの程度旋回を行うか?値が大きくなるほど旋回しやすくなります。 1.0
frontDistance double 回避運動を開始する障害物までの最長距離 0.5
backDistance double 回避運動を開始する障害物までの最短距離。この値より近い距離に障害物があっても回避運動を行いません 0.1
filter double センサが前後で2つずつしかないため後述する問題が発生します。それを回避するために余分に回避運動を取る必要があります。この値が大きいほど余分な回避運動が小さくなります。 0.05
まずセンサは2つ平行に取り付けてあるため以下のように測距センサで障害物が検知出来ていなくても回避運動が不十分で障害物に衝突する可能性があります。
測距センサをもっと外側に取り付けるか角度をつければ良いのですが、それでは正面の障害物が検知できません。そのため余分に回避運動をするようにしています。
これらのRTCを使って以下のシステムを構築できます。
GUI以外のRTCはEdisonで起動してください。
後は必要に応じてRTno対応サーボ制御RTC、シミュレータRTCを使ってください。
それで一応実験はしたのですがまだ動画を撮っていません。
さすがに深夜に動かすのは近所迷惑なので後で撮ります。
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・
地磁気、加速度センサ
LSM303DLHC
1500円は手ごろな値段だと思ったのでこれにしました。
姿勢の計測に使います。
さすがに加速度センサの計測値を二重積分して現在位置を求めるのは無茶なのでやめました。
角速度センサ
L3GD20
なんでも430円の角速度、角加速度センサがあるらしいですが、持っていないので上のセンサを使います。加速度センサの計測値と合わせて姿勢を計算しようとしたのですが、まだ実装できていません。姿勢は地磁気、加速度だけで計算しています。なので今の所は角速度の計測値をデータポートから出力する事にしか使っていません。
測距センサ
GP2Y0A21YK ×4
とりあえず近い所に障害物を検知すると避けるようにします。
クローラーの前後に2つずつ取り付けます。
本当は3つ取り付けたいのですがアナログ入力ピンが全部埋まっているので2つで妥協します。
後は制御でなんとかカバーします。
モータードライバIC
TA8428K
比較的流せる電流値が大きいのでこれにしました。
と言うか130モーターなんか使わなければこんなにモータードライバで苦労する事もなかったような気もしますが、組み立てるのが面倒になりそうなので仕方ないです。
7V以上が動作電圧になっていますが、試してみたところ6Vでも動作するみたいです。
130モーターなので3Vぐらいにしたいのですが、さすがに3Vでは動作しないみたいです。
ただ、6Vを入力すると電圧のドロップで3~4Vぐらいになるのでちょうどいい感じになっているみたいです。
PWM出力ドライバー
PCA9685
今さらですけどEdisonでサーボを制御する方法って何かないのですかね?
多分Arduinoでサーボを制御する場合はPWMを使うのではなくて直接HIGHとLOWを一定時間で切り替えていると思うのですけどEdisonで同じ事はできるのでしょうか?sleepの精度が無理な感じがするのですがよくわからないので上記の製品を使います。
本当はarduinoのシールドではなくてこの製品を使いたかったのですが、いつ見ても在庫切れなので今回は妥協します。値段はあまり変わらないのですが多少大きいのが厳しいですね。同じチップを使っているので別にどちらでも動作はできるとは思います。
後はクローラー作成に必要なものなので値段や入手しやすさとかで選んでいます。
自分で加工は全くしないようにしています。RTMコンテストに出すかどうかは分かりませんが、加工するとなると動作できる可能性が下がりそうなので避けていきます。
ライトダッシュモーター ×2
モーターの性能を調べてみて、消費電流3A以下でちょうどよさそうなのを選びました。
まあ4Vぐらいの電圧が加わるので、実際はもっと大きな電流が流れると思うのですが・・・まあ多分大丈夫だろう。多分。
あまり関係ないけどTA7291Pでプラズマダッシュモーターを制御しようとするとピクって動いた後に全く動かなくなって、TA7291Pがやたらと発熱していました。プラズマダッシュモーター恐ろしい子。
トラック&ホイールセット ×4
適当なのを選びました。
下のユニバーサルプレートLと組み合わせた制作例で4つキャタピラを使っているようだったので4つ使います。作ってみて分かったのですが付属している車軸の長さの関係で2つずつ使わざる得ないようですね。
ユニバーサルプレートL 210×160mm ×2
アームを搭載できるように少し大き目なのを選びました。
シングルギヤボックス 4速タイプ ×2
上記のトラック&ホイールセットと簡単に組み合わせられそうなのがこれなのでこれにします。
ユニバーサルプレートセット ×2
実の所プレートが目的ではなくて、付属の部品を測距センサの取り付けに使います。
余ったプレートを左右に取り付けていますが飾りです。
あとはロボットアームを買ってください。
4自由度ロボットアーム
6自由度のアームは少し高いので4自由度のアームを買った方が良いと思います。
それからEdisonはArduinoキットを使っています。
Intel Edison Kit for Arduino
Breakout Boardキットを使う場合はPWM、I2Cの信号をレベル変換してください。
後は必要に応じてブレッドボード、ジャンパーコード、コネクタ付きコード、コンデンサ、スペーサー、電池ボックス、ACアダプタ、USB-MicroUSBケーブル等を買ってください。
これらを使って以下のようなロボットを作成しました。
配線がごちゃごちゃしていますが気にしない事にします。
EdisonとPWMサーボドライバーがやたらと面積を取るため二段になっていますが、EdisonをBreakout Boardキットに変更して、PWMサーボドライバは在庫切れで買えなかった方に変更、さらに回路基板を自作すればブレッドボードを使うより小さくできるので2段にする必要はないかもしれないです。
RTCは以下の4つを作成しました。
まずはGUIのRTCです。
GUIでアーム、クローラーを操作するとデータポート、サービスポートで他のRTCに通信してアーム、クローラーを操作します。
InPortの仕様は以下のようになっています。
crawlerPos TimedPose2D型 クローラーの位置、姿勢
OutPortの仕様は以下のようになっています。
crawlerTargetPos TimedPose2D型 クローラーの目標位置、姿勢
crawlerTargetSpeed0 TimedDouble 右車輪の速度(ただし、以下で説明するシステムではモーターの電圧としている)
crawlerTargetSpeed1 TimedDouble 左車輪の速度
次にアーム制御RTCです。
サービスポートで目標位置を入力すると現在位置からの軌道を計算し、そこから目標関節角速度を計算します。ただ今回はサーボが位置制御しかできず、関節角度を取得する手段もないため目標関節角速度を積分した値を目標関節角度にしています。
OutPortの仕様は以下のようになっています。
jpos TimedDoubleSeq 目標関節角度
mpos TimedDoubleSeq モーターの目標角度
コンフィギュレーションパラメータの仕様は以下のようになっています。
init_angle1 double 関節1の初期角度 0
init_angle2 double 関節2の初期角度 1.5
init_angle3 double 関節3の初期角度 -0.5
init_angle4 double 関節4の初期角度 0
init_gripperPos double グリッパーの初期位置 0
次にサーボ制御RTCです。
RCサーボへの目標角度をInPortから受信して、PCA9685搭載のデバイスにI2CでPWMのデューティー比を指令します。
InPortの仕様は以下のようになっています。
in TimedDoubleSeq サーボモータの目標角度
コンフィギュレーションパラメータの仕様は以下のようになっています。
I2C_address int PCA9685のI2Cスレーブアドレス 0x40
I2C_channel int I2Cポート番号 1
最後にクローラー制御RTCです。
InPortの仕様は以下のようになっています。
in0 TimedDouble 左モーターの電圧
in1 TimedDouble 右モーターの電圧
OutPortの仕様は以下のようになっています。
gyro TimedAngularVelocity3D ジャイロセンサーの計測値(rad/s)
range0 TimedDouble 距離センサ(右前)の計測値(m)
range1 TimedDouble 距離センサ(左前)の計測値(m)
range2 TimedDouble 距離センサ(右後)の計測値(m)
range3 TimedDouble 距離センサ(左後)の計測値(m)
acc TimedAcceleration3D 加速度センサの計測値(m/s^2)
magn TimedDoubleSeq 地磁気センサの計測値(gauss)
temp TimedDouble 温度センサの計測値(℃)
pos TimedPose2D センサ情報から計算した現在位置、姿勢(位置の計測は実装できていないので左右モーターの電圧が正の場合は前進、負の場合は後退するようにしてある)
センサで検出した値は括弧内の単位に変換してあります。
コンフィギュレーションパラメータの仕様は以下のようになっています。
motor0pwm0 int 右モーター制御用TA8428KのIN1に接続するピン番号 3
motor0pwm1 int 右モーター制御用TA8428KのIN2に接続するピン番号 5
motor1pwm0 int 左モーター制御用TA8428KのIN1に接続するピン番号 6
motor1pwm1 int 左モーター制御用TA8428KのIN2に接続するピン番号 9
gyroSensor int 1の時はジャイロセンサを使用する 1
gyroSensor_addr int L3GD20のI2Cスレーブアドレス 0x6A
rangeSensor0 int 1の時は距離センサ(右前)を使用する 1
rangeSensor1 int 1の時は距離センサ(左前)を使用する 1
rangeSensor2 int 1の時は距離センサ(右後)を使用する 1
rangeSensor3 int 1の時は距離センサ(左後)を使用する 1
rangeSensor0_Pin int 距離センサ(右前)の信号線と接続するアナログ入力ピンの番号 2
rangeSensor1_Pin int 距離センサ(左前)の信号線と接続するアナログ入力ピンの番号 3
rangeSensor2_Pin int 距離センサ(右後)の信号線と接続するアナログ入力ピンの番号 0
rangeSensor3_Pin int 距離センサ(左後)の信号線と接続するアナログ入力ピンの番号 1
LSM303DLHC int 1の時はLSM303DLHCを使用する 1
Acc_addr int LSM303DLHCの加速度センサのI2Cスレーブアドレス 0x19
Magn_addr int LSM303DLHCの地磁気センサのI2Cスレーブアドレス 0x1E
I2C_channel int I2Cのポート番号 1
rotOffset double posから出力する姿勢角のオフセット値 -1.1
以下は障害物回避の制御に必要なパラメータです。
bias double 障害物が近づいた場合にどの程度旋回を行うか?値が大きくなるほど旋回しやすくなります。 1.0
frontDistance double 回避運動を開始する障害物までの最長距離 0.5
backDistance double 回避運動を開始する障害物までの最短距離。この値より近い距離に障害物があっても回避運動を行いません 0.1
filter double センサが前後で2つずつしかないため後述する問題が発生します。それを回避するために余分に回避運動を取る必要があります。この値が大きいほど余分な回避運動が小さくなります。 0.05
まずセンサは2つ平行に取り付けてあるため以下のように測距センサで障害物が検知出来ていなくても回避運動が不十分で障害物に衝突する可能性があります。
測距センサをもっと外側に取り付けるか角度をつければ良いのですが、それでは正面の障害物が検知できません。そのため余分に回避運動をするようにしています。
これらのRTCを使って以下のシステムを構築できます。
GUI以外のRTCはEdisonで起動してください。
後は必要に応じてRTno対応サーボ制御RTC、シミュレータRTCを使ってください。
それで一応実験はしたのですがまだ動画を撮っていません。
さすがに深夜に動かすのは近所迷惑なので後で撮ります。
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・
例のロボットアームの6自由度版があるみたいですが、なんだか妙に高いですね。
そりゃ2つサーボが追加はされていますけど、機構は簡単になってそうなので部品の数は減ってそうな感じに見えるのですが。
まあ別に買う予定なんてないので気にしない事にします。
4自由度の方はそれなりに売れているみたいです。
公式サイトを読んでて気づいたのですが、一応arduinoで制御するためのサンプルプログラムはあったみたいです。仕様書がないので使い方はよくわかりませんが、サインスマート製の製品ではよくあることらしいですね。一体他の人はどんなプログラムで制御しているのか気になります。
それはさておき、I2CのデバイスをどのようにRTCとして実装するかを考えています。
Raspberry Piですけど参考になりそうな資料があったのでちょっと読んでみました。
Pi_I2CSensorというサンプルプログラムを読んでみたのですが・・・なんだか色々と疑問があります。
まずセンサで取得した値は角速度ならrad/sに変換して出力すべきではないか?と思います。TimedLong型で出力したデータを使いたい人なんてほとんどいないと思います。
後、その辺りも含めてセンサごとに別ファイルに処理を分離しておけば他の人が使う場合も使いやすいかもしれないです。
まあ実際の使用例がないので実際使ってみたら今のままの方が使いやすいとかなのかもしれませんけど、正直想像ができません。
一番下のスケジューリングの問題ですが、アーム制御のPCA9685搭載PWM/サーボ ドライバーのRTCとクローラー制御関連のセンサRTCは分離したいのでセマフォで排他制御をします。
ただ、I2Cに限らず全てセンサで個別にRTCを実装するのは使いづらくなるだけなのでやめておきます。
この場合何が問題になるかと言うとオーバーヘッドやシステムの見通しの悪さももちろんそうですが、RTCが同期していないと必要な時にデータを取得できてないかもしれない事が最大の問題です。おそらくセンサの情報をもとに何らかの制御をする事も多いとは思いますが、例えばisNew関数でデータが到着していると判断したとき、あるいはそのデータがある値以上の場合のみなんらかの制御をするのであれば同期する必要はありません。しかし複数のセンサのデータを必要とする場合、フィードバック制御等で連続的に制御する場合はRTCが同期している必要がありそうです。そのために複合コンポーネントにしたり実行コンテキストを共有するのは正直面倒くさいです。RTCの粒度を小さくすることで拡張性を高くしたつもりが、その使いづらさで逆に機能の変更、拡張がやりづらくなると思います。以前GUI上でクリックした座標を他のRTCに送信してそのRTCで何らかの処理をするRTCを見た事がありますが、その両方のRTCでGUIで何を表示しているのか、大きさはどのぐらいか等を共有しておく必要があるのでソースコードを書きかえるよりも拡張するのが難しくなっていると言う印象を持ちました。結果的に使いづらくなったしまっては意味がありません。
実行コンテキストを共有していなくてもサービスポートを使うか、あるいはコネクタコールバックを使えばセンサのデータを取得したタイミングで何らかの処理を実行する事は可能ですが、サービスポートを使うと再利用性が低くなりますし、コネクタコールバックを使う場合は複数のセンサのデータを必要とする場合の処理が難しくなるのでやめておきます。
少し考えてみたのですが、
最初からRTCとして機能を分割する事は考えずにファイルやライブラリとして分割する事をまず考えた方が良いかもしれません。そこからRTCで実装した方が便利な部分を見つけていけばよいシステムが出来上がるのではないでしょうか?
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・
そりゃ2つサーボが追加はされていますけど、機構は簡単になってそうなので部品の数は減ってそうな感じに見えるのですが。
まあ別に買う予定なんてないので気にしない事にします。
4自由度の方はそれなりに売れているみたいです。
公式サイトを読んでて気づいたのですが、一応arduinoで制御するためのサンプルプログラムはあったみたいです。仕様書がないので使い方はよくわかりませんが、サインスマート製の製品ではよくあることらしいですね。一体他の人はどんなプログラムで制御しているのか気になります。
それはさておき、I2CのデバイスをどのようにRTCとして実装するかを考えています。
Raspberry Piですけど参考になりそうな資料があったのでちょっと読んでみました。
Pi_I2CSensorというサンプルプログラムを読んでみたのですが・・・なんだか色々と疑問があります。
まずセンサで取得した値は角速度ならrad/sに変換して出力すべきではないか?と思います。TimedLong型で出力したデータを使いたい人なんてほとんどいないと思います。
後、その辺りも含めてセンサごとに別ファイルに処理を分離しておけば他の人が使う場合も使いやすいかもしれないです。
まあ実際の使用例がないので実際使ってみたら今のままの方が使いやすいとかなのかもしれませんけど、正直想像ができません。
一番下のスケジューリングの問題ですが、アーム制御のPCA9685搭載PWM/サーボ ドライバーのRTCとクローラー制御関連のセンサRTCは分離したいのでセマフォで排他制御をします。
ただ、I2Cに限らず全てセンサで個別にRTCを実装するのは使いづらくなるだけなのでやめておきます。
この場合何が問題になるかと言うとオーバーヘッドやシステムの見通しの悪さももちろんそうですが、RTCが同期していないと必要な時にデータを取得できてないかもしれない事が最大の問題です。おそらくセンサの情報をもとに何らかの制御をする事も多いとは思いますが、例えばisNew関数でデータが到着していると判断したとき、あるいはそのデータがある値以上の場合のみなんらかの制御をするのであれば同期する必要はありません。しかし複数のセンサのデータを必要とする場合、フィードバック制御等で連続的に制御する場合はRTCが同期している必要がありそうです。そのために複合コンポーネントにしたり実行コンテキストを共有するのは正直面倒くさいです。RTCの粒度を小さくすることで拡張性を高くしたつもりが、その使いづらさで逆に機能の変更、拡張がやりづらくなると思います。以前GUI上でクリックした座標を他のRTCに送信してそのRTCで何らかの処理をするRTCを見た事がありますが、その両方のRTCでGUIで何を表示しているのか、大きさはどのぐらいか等を共有しておく必要があるのでソースコードを書きかえるよりも拡張するのが難しくなっていると言う印象を持ちました。結果的に使いづらくなったしまっては意味がありません。
実行コンテキストを共有していなくてもサービスポートを使うか、あるいはコネクタコールバックを使えばセンサのデータを取得したタイミングで何らかの処理を実行する事は可能ですが、サービスポートを使うと再利用性が低くなりますし、コネクタコールバックを使う場合は複数のセンサのデータを必要とする場合の処理が難しくなるのでやめておきます。
少し考えてみたのですが、
- RTC1でセンサのデータを取得
- RTC1からRTC2にデータを送信
- RTC2でデータが到着していれば何らかの処理をする
- RTC2からRTC1にデータの送信を要求する
- RTC1でセンサのデータを取得
- RTC1からRTC2にデータを送信
- RTC2で何らかの処理をする
最初からRTCとして機能を分割する事は考えずにファイルやライブラリとして分割する事をまず考えた方が良いかもしれません。そこからRTCで実装した方が便利な部分を見つけていけばよいシステムが出来上がるのではないでしょうか?
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・
今のロボットに合わせてGUIを変更しました。
後、スライダーで手先の目標位置、関節角度を変更したときに今まではボタンを押さないと実機、シミュレータの動作に反映されませんでしたが、スライダーでの変更時に反映できるようにもしておきました。
どうにもI2Cの使い方よくわかりません。
MM-TXS05という加速度、地磁気センサを使おうと思ったのですが何故か動作できませんでした。
arduinoでは普通に動作できていたのですけど、例の内部プルアップが問題なのでしょうかね?
MM-TXS05のレベル変換ICの内部でプルアップしているにもかかわらずEdison内部でもプルアップしているのが問題かもしれません。
でもarduinoでI2C通信する場合も20kΩぐらいの抵抗で内部プルアップしていると思うので抵抗値の問題なのでしょうかね?
Edisonのプルアップを無効にする方法を探しているのですがよくわかりませんでした。
/sys/kernel/debug/gpio_debug/gpio**/current_pullmodeで変更できるとかどこかで見たのですが、nopullに変更しても特に変化なし。
もっと詳しい資料はないかとこのサイトを読んでみてIO18とIO19のプルアップ有効化はGPIO212とGPIO213をinにすれば無効にできると思ったのですが最初からinになっていました。と言うよりもこのプルアップはArduino基盤上のプルアップで、Edison内部のプルアップは別にあると言う事なのかもしれないです。つまりGPIO212をhighにしたら更にもう一つプルアップ抵抗を追加した状態になると言う事でしょうかね?
まあ別のセンサもあるのでそちらを使おうと思っているのですが3.3Vで動作なのでレベル変換が必要です。・・・・そう思っていたのですが、3.3VでもHighかLowを判別できるみたいなので動作できるみたいです。多少問題はありそうですがそれならばそれで構わない・・・・のか?
何か進んだらまた書きます。
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・
後、スライダーで手先の目標位置、関節角度を変更したときに今まではボタンを押さないと実機、シミュレータの動作に反映されませんでしたが、スライダーでの変更時に反映できるようにもしておきました。
どうにもI2Cの使い方よくわかりません。
MM-TXS05という加速度、地磁気センサを使おうと思ったのですが何故か動作できませんでした。
arduinoでは普通に動作できていたのですけど、例の内部プルアップが問題なのでしょうかね?
MM-TXS05のレベル変換ICの内部でプルアップしているにもかかわらずEdison内部でもプルアップしているのが問題かもしれません。
でもarduinoでI2C通信する場合も20kΩぐらいの抵抗で内部プルアップしていると思うので抵抗値の問題なのでしょうかね?
Edisonのプルアップを無効にする方法を探しているのですがよくわかりませんでした。
/sys/kernel/debug/gpio_debug/gpio**/current_pullmodeで変更できるとかどこかで見たのですが、nopullに変更しても特に変化なし。
もっと詳しい資料はないかとこのサイトを読んでみてIO18とIO19のプルアップ有効化はGPIO212とGPIO213をinにすれば無効にできると思ったのですが最初からinになっていました。と言うよりもこのプルアップはArduino基盤上のプルアップで、Edison内部のプルアップは別にあると言う事なのかもしれないです。つまりGPIO212をhighにしたら更にもう一つプルアップ抵抗を追加した状態になると言う事でしょうかね?
まあ別のセンサもあるのでそちらを使おうと思っているのですが3.3Vで動作なのでレベル変換が必要です。・・・・そう思っていたのですが、3.3VでもHighかLowを判別できるみたいなので動作できるみたいです。多少問題はありそうですがそれならばそれで構わない・・・・のか?
何か進んだらまた書きます。
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・