SpotMicro(mini) その30 ーその他のI2Cデバイスノード ー [ROBOT]
今回作った、SpotMicroに搭載されている機能(コンポーネント?)は、
ROSメッセージを制御するためのコンピュータ、
動かすためのサーボ
FPVのためのカメラ
GYRO、磁気、加速度 センサ
電池電圧センサ、
近接センサ
あと、どうでもいい文字列を出力するためのLCD
が搭載されており、
各センサと、LCDがすべてI2cに説臆されている。
ROSのプログラムは、センサ等のノードを定期的に誰宛ともなく、”Publish”し、利用数が和では、それを”Subscribe”する。
これらのセンサは、前述のとおり同じI2Cバスにつながれている。I2Cは、RASPBERRY PIから見ると、一つのデバイスとして、みえており、それぞれのセンサは、I2Cバスに対する入出力として、インプリされてみる。
言い換えると、ファイルの1バイト目は、何とかセンサ、2バイト目は何とかセンサ”みたいにアクセスする。Cのプロラムから見ると、一つのファイルとして、アクセスすることになる。
このあたりは、よく理解している人には、釈迦に説法だけど。
GYRO,加速度、磁気センサのアドバタイズ周期と、電池の電圧センサのアドバタイズ周期は、
別にしたいと考えている(両方ともなるべく少なくしたいが)。
ROSのプログラムは、公告するメッセージ毎にノードを作るのが割と普通なんだけど、別々の
プロセスにすると、I2Cデバイスの競合が起こる可能性があるので、一つのプロセスですることにした。
1秒間に60回チャンスをつくり、センサにより、何回か毎に出力するようにした。
となっている。
ROSメッセージを制御するためのコンピュータ、
動かすためのサーボ
FPVのためのカメラ
GYRO、磁気、加速度 センサ
電池電圧センサ、
近接センサ
あと、どうでもいい文字列を出力するためのLCD
が搭載されており、
各センサと、LCDがすべてI2cに説臆されている。
ROSのプログラムは、センサ等のノードを定期的に誰宛ともなく、”Publish”し、利用数が和では、それを”Subscribe”する。
これらのセンサは、前述のとおり同じI2Cバスにつながれている。I2Cは、RASPBERRY PIから見ると、一つのデバイスとして、みえており、それぞれのセンサは、I2Cバスに対する入出力として、インプリされてみる。
言い換えると、ファイルの1バイト目は、何とかセンサ、2バイト目は何とかセンサ”みたいにアクセスする。Cのプロラムから見ると、一つのファイルとして、アクセスすることになる。
このあたりは、よく理解している人には、釈迦に説法だけど。
GYRO,加速度、磁気センサのアドバタイズ周期と、電池の電圧センサのアドバタイズ周期は、
別にしたいと考えている(両方ともなるべく少なくしたいが)。
ROSのプログラムは、公告するメッセージ毎にノードを作るのが割と普通なんだけど、別々の
プロセスにすると、I2Cデバイスの競合が起こる可能性があるので、一つのプロセスですることにした。
1秒間に60回チャンスをつくり、センサにより、何回か毎に出力するようにした。
番号 | トピック名 | 構造 | 向き、概要 |
1 | /spot/imu | Vector3 acel Vector3 gyro Vector3 magn Float32 temp | 出力:9軸センサ(加速度、各加速度、地磁気)と温度 |
2 | /spot/batttery | Float32 volt | 出力:電池電圧 |
3 | /spot/lcd | String line | 入力:表示する文字列。改行文字で改行 |
4 | /spot/lcd1 | String line | 入力::1行目文字出力 |
5 | /spot/lcd2 | String line | 入力:2行目文字出力 |
6 | /spot./tof | Float32 left Float32 right | 出力:近接センサ距離(LRはうまく動かない) |
となっている。
SpotMicro(mini) その29 ー現時点での到達点 ー [ROBOT]
機体で残っているのは、
Spot制御プログラム
このプログラムはROSベースであはあるものの、誰かが作ったプログラムはなるべく使わないという方針でスクラッチから書き下ろしているわけだが、i2cpwmboard関連は除いて。
Iphone コマンダー
なんといっても、画像が出力されているまではできているので、ほぼ完成なんだけど、
まだまだやらないといけないな。
1 | 左右のTOFセンサからの測定値読み込みがまだできてない。同じI2Cにつながっていて、センサのアドレスも変更できない。このセンサを使用例があまりに少ないので、ちょっと萎えている。でもちゃんと売られているので、使えるはずで、それをコントロールする方法を探し中。また、I2CなのにCSがあるので、それで右と左を制御できる。だいぶパンチを食らって放ってある。 |
2 | ジャイロセンサからの入力が取り込めてない。9軸のセンサはついていて、いつでもかけるからいいやっていうので、放ってある。 |
3 | 電池残量を図る機構は組み込んであり、Pythonでの取得は確認済みであるが、まだROSに取り込んでないので、その部分を作成する必要がある |
Spot制御プログラム
このプログラムはROSベースであはあるものの、誰かが作ったプログラムはなるべく使わないという方針でスクラッチから書き下ろしているわけだが、i2cpwmboard関連は除いて。
1 | どのノードで、どのトピックを扱うかを考えないといけない。 |
2 | 動作状態(歩行等)の遷移とイベントの確認 |
3 | gyroからの入力による姿勢の制御 |
4 | カメラ画像からの自己位置推定(別ノードかも) |
Iphone コマンダー
なんといっても、画像が出力されているまではできているので、ほぼ完成なんだけど、
1 | 機体から出力される(はずの)Gyro情報のHUD化 |
2 | 機体の電池残量表示 |
3 | その他機体の状態表示機能追加 |
まだまだやらないといけないな。
SpotMicro(mini) その28 ーリモコン そうだIphoneを使おう (その4)ー [ROBOT]
ということでリモコンプログラムがとりあえずできた。
現状のソースをなんと惜しげもなく(恥ずかしげもなく)公開する
解説を期待している人はあまりいないだろうが、そんなのは無視してやると、
インポートのブロックのあとにあるonAction関数は、ボタンを押された後の動作を行う。
ボタンが押されると、onActionは、Senderを受け取る。senderには、押されたボタンのオブジェクトが格納されており、そのボタンのtitle を読みだしたことで押されたボタンの正体が判明し、それから
コマンドを送る
cmds配列は、ボタン名からコマンドへの変換テーブルで、コマンドは半角3文字とした。
コマンドが押された後の動きは、受け取った側でコントロールする。
選択されたコマンドは、socで指定されるソケットにより、commanderに送信される。
コマンドは、3文字の固定長文字列としている。
次のブロックは、ボタンを定義するサブルーチンで、画像にあるような9個のボタンを画面上に配置するために、タイトル、X位置、Y位置、ボタン高さ(幅)を指定する。
ボタンを押されたときの処理を決定するonAction関数を設定している。
これ以降はメインプログラムで、最初はソケットの作成を行っている。
ソケット作成した後、ベース画面を作成し、画面タイトル、背景色などを設定している。
ui.viewでは、titleではなく、nameで名前を設定するようだ。
iv は、受信した画像を表示するためのImageViewを指定する。Iphoneの画面は、本当は縦長なのだが、横位置に指定したかったので、背景windowを横位置にして、そこから計算される縦位置から、400x300にサイズを決定した。
次のブロックは、ボタンを配置している。画面の左に3個、右に3個、下に3個だ。
次のブロックで、作成した画像window、ボタンを背景に追加している。
whileから始まるブロックで、画像を受信する。
画像は、32バイトで指定される、フレーム番号、フレーム時刻、サイズで指定されたヘッダをまず受け取り、ここで、指定されるサイズバイトを実際に受け取り、バッファに格納している。
画像自体は、JPEGであるがバイナリによる動作の不安定さを防ぐために、いったんBase64に変換したもので通信している。
受け取ったバッファを、Base64でデコードした後ByteIoを使って、Jpegイメージかして、それを先ほど作った画像Windowに張り付けているということになる。
ただ、このプログラムには欠点があり、それを直さないといけないとは思うんだが、ほおってある。
現状のソースをなんと惜しげもなく(恥ずかしげもなく)公開する
# # import socket import ImageFile import Image import ui import io import base64 import ui import time def onAction(sender): bt=sender.title cmds={ '歩':'stp','座':'sit','立':'std','伏':'lie', '前':'fwd','停':'sto','後':'bck','左':'lft', '央':'ctr','右':'rgt'} soc.send(bytes(cmds[bt],'utf-8')) def addButton(_title,x,y,_height): btn = ui.Button(title=_title) btn.bounds=(0,0,_height,_height) btn.font=('',30) btn.background_color='#f0f0f0' btn.flex ='' btn.center=(x,y) btn.action=onAction return btn soc=socket.socket(socket.AF_INET,socket.SOCK_STREAM) soc.connect(("192.168.11.129",11320)) v=ui.View() v.title='SpotMicro Control' v.name='SpotMicro Control' v.background_color='#aaaaaa' iv = ui.ImageView() v.present(style='fullscreen',orientations=['landscape']) iv.flex='LRB' iv.ackground_color='yellow' iv.bounds=(0,0,400,300) iv.center=(v.width/2,150) LeftAllign=60 btnHeight=40 RightAllign = v.width-btnHeight BottomAllign = v.height-btnHeight/2 btnStp= addButton('歩',LeftAllign,btnHeight*1,btnHeight) btnSit= addButton('座',LeftAllign,btnHeight*2.5,btnHeight) btnLay= addButton('伏',LeftAllign,btnHeight*4,btnHeight) btnFwd= addButton('前',RightAllign,btnHeight*1,btnHeight) btnBan= addButton('停',RightAllign,btnHeight*2.5,btnHeight) btnBck= addButton('後',RightAllign,btnHeight*4,btnHeight) btnCtr= addButton('央',v.width/2,BottomAllign, btnHeight) btnLft= addButton('左',v.width/2-70 , BottomAllign,btnHeight) btnRgt= addButton('右',v.width/2+70 , BottomAllign,btnHeight) v.add_subview(iv) v.add_subview(btnStp) v.add_subview(btnSit) v.add_subview(btnLay) v.add_subview(btnFwd) v.add_subview(btnBan) v.add_subview(btnBck) v.add_subview(btnCtr) v.add_subview(btnLft) v.add_subview(btnRgt) while True: line = soc.recv(32).decode() head=line.split(':') tag=head[0] frm=int(head[1]) tim=int(head[2]) siz=int(head[3]) len=siz if tag == 'jpeg': img='' buf=soc.recv(siz,socket.MSG_WAITALL) jpg=base64.b64decode(buf) parser = ImageFile.Parser() parser.feed(jpg) jpgimg = parser.close() with io.BytesIO() as bIO: jpgimg.save(bIO,'png') img=ui.Image.from_data(bIO.getvalue()) iv.image = img
解説を期待している人はあまりいないだろうが、そんなのは無視してやると、
インポートのブロックのあとにあるonAction関数は、ボタンを押された後の動作を行う。
ボタンが押されると、onActionは、Senderを受け取る。senderには、押されたボタンのオブジェクトが格納されており、そのボタンのtitle を読みだしたことで押されたボタンの正体が判明し、それから
コマンドを送る
cmds配列は、ボタン名からコマンドへの変換テーブルで、コマンドは半角3文字とした。
コマンドが押された後の動きは、受け取った側でコントロールする。
選択されたコマンドは、socで指定されるソケットにより、commanderに送信される。
コマンドは、3文字の固定長文字列としている。
次のブロックは、ボタンを定義するサブルーチンで、画像にあるような9個のボタンを画面上に配置するために、タイトル、X位置、Y位置、ボタン高さ(幅)を指定する。
ボタンを押されたときの処理を決定するonAction関数を設定している。
これ以降はメインプログラムで、最初はソケットの作成を行っている。
ソケット作成した後、ベース画面を作成し、画面タイトル、背景色などを設定している。
ui.viewでは、titleではなく、nameで名前を設定するようだ。
iv は、受信した画像を表示するためのImageViewを指定する。Iphoneの画面は、本当は縦長なのだが、横位置に指定したかったので、背景windowを横位置にして、そこから計算される縦位置から、400x300にサイズを決定した。
次のブロックは、ボタンを配置している。画面の左に3個、右に3個、下に3個だ。
次のブロックで、作成した画像window、ボタンを背景に追加している。
whileから始まるブロックで、画像を受信する。
画像は、32バイトで指定される、フレーム番号、フレーム時刻、サイズで指定されたヘッダをまず受け取り、ここで、指定されるサイズバイトを実際に受け取り、バッファに格納している。
画像自体は、JPEGであるがバイナリによる動作の不安定さを防ぐために、いったんBase64に変換したもので通信している。
受け取ったバッファを、Base64でデコードした後ByteIoを使って、Jpegイメージかして、それを先ほど作った画像Windowに張り付けているということになる。
ただ、このプログラムには欠点があり、それを直さないといけないとは思うんだが、ほおってある。
SpotMicro(mini) その27 ーリモコン そうだIphoneを使おう (その3)ー [ROBOT]
ちょっと時間がかかりった。
前回の作戦をもとに、Pythonista3で作っていましたが、いろいろUI上の癖みたいなのがあって、
向こうが期待している通りの設定をしないとうまく動いてくれない感じでしたが、
とりあえずUI部品の配置を終えて、だいたいの遅延を計測するまではできるようになった。
ボタンは配置してあるだけでライブではありません。
とりあえず、画像が転送できるところまでできたので。
前回の作戦をもとに、Pythonista3で作っていましたが、いろいろUI上の癖みたいなのがあって、
向こうが期待している通りの設定をしないとうまく動いてくれない感じでしたが、
とりあえずUI部品の配置を終えて、だいたいの遅延を計測するまではできるようになった。
ボタンは配置してあるだけでライブではありません。
とりあえず、画像が転送できるところまでできたので。
SpotMicro(mini) その26 ーリモコン そうだIphoneを使おう (その2)ー [ROBOT]
Pythonistaを用いたROSでの発信(トピックのパブリッシュ)はできたけど、サブスクライブができないのは、前言ったとおりだ。
すべてがROSの世界で実現できるとすると、こんな感じを予定してた。
が、実際にやってみるとできなかったわけである。この絵でいうところのIPhoneで、CompressedImage
を使うところがうまくいけないわけだ。
そこで、どうするかを考えた。
1番2番の方法は、世の中的にも紹介している人があまりいないので、できれば、すごく有名になれるチャンスかもしれないが、逆に言うと、IPHONEをROSの端末として使うことはあまり需要がないのかもしれない。あと、私は、IPhoneしか持ってないので、エディタの字が小さくなってきてちょっと厳しい。
ので、正攻法?とでもいえる3番を使うことにした。
とすると、上記の図は、以下のように変更する。
カメラ画像はいわゆる動画ではないが、JPEG画像が連続して飛んでくる来るわけで、とても忙しい処理をしないといけない。Pythonは、インタプリタ言語であるので、普通のコンパイラ言語よりは遅い。
処理的に間に合うかが問題となりそう。
とりあえず、連続する画像をしばらく見ることはできた。
すべてがROSの世界で実現できるとすると、こんな感じを予定してた。
が、実際にやってみるとできなかったわけである。この絵でいうところのIPhoneで、CompressedImage
を使うところがうまくいけないわけだ。
そこで、どうするかを考えた。
1 | PythonistaのROSの環境の動かない理由を探索して、修正して動くようにする。 |
2 | ROSをpyto上のインストールして、使えるようにする。 |
3 | SpotMicroから出力されるJpegイメージをいったん別のノードで受けて、それをROSではない普通のソケットストリームに変換して、IPhone上のPythonista で受信する。 |
1番2番の方法は、世の中的にも紹介している人があまりいないので、できれば、すごく有名になれるチャンスかもしれないが、逆に言うと、IPHONEをROSの端末として使うことはあまり需要がないのかもしれない。あと、私は、IPhoneしか持ってないので、エディタの字が小さくなってきてちょっと厳しい。
ので、正攻法?とでもいえる3番を使うことにした。
とすると、上記の図は、以下のように変更する。
カメラ画像はいわゆる動画ではないが、JPEG画像が連続して飛んでくる来るわけで、とても忙しい処理をしないといけない。Pythonは、インタプリタ言語であるので、普通のコンパイラ言語よりは遅い。
処理的に間に合うかが問題となりそう。
とりあえず、連続する画像をしばらく見ることはできた。
SpotMicro(mini) その25 ーリモコン そうだIphoneを使おうー [ROBOT]
オリジナルのSpotmicroのサイトでは、XboxだったりPS5だったりのコントローラが使われている。
これは一瞬いいようにも見えるが、接続がBluetoothなので、移動距離がある程度離れると、使えなくなる。最もWIFIでも同じだけど、もう少し広い。
で、機種変更で手元にあるIphone7に白羽の矢を立てた。
IOSではROSが動くと紹介しているページもあり、それとなく買っていたPythonista もあるので、
これに挑戦してみることとした。
ROSは、メッセージをセンサ等の情報を経て、何らかの処理を行い、その結果をモータなどのコントらーらにつなげるとっても素晴らしい仕掛けで、データが発生するところと、処理をするところ、分散するコンピュータで使用することができる。
なので、IPで接続された複数のコンピュータで、処理を分散できるわけだ。
で、話を戻して。SpotMicro君を運転するとすると、カメラの画像を見ながら、前進後進は、停止加速、などをコントロールしたい。
ここで、機種変更で手元にあるIPHONEを使おうt思ったわけだ。
で、先ほどのページを参考にして、なるほど。発信はできた。
が、受信がうまくできない。
ROSのトランスポートはTCPなので、接続がうまくいかないことは ないと思うんだけど、なんか受信がうまくいかない。
具体的に言うとraspicam_node/image/comressedメッセージを受信して、表示するというものを作りたいわけだけど、うまくいっている人がいたら、教えてほしいです。
よろしくお願いします。
これは一瞬いいようにも見えるが、接続がBluetoothなので、移動距離がある程度離れると、使えなくなる。最もWIFIでも同じだけど、もう少し広い。
で、機種変更で手元にあるIphone7に白羽の矢を立てた。
IOSではROSが動くと紹介しているページもあり、それとなく買っていたPythonista もあるので、
これに挑戦してみることとした。
ROSは、メッセージをセンサ等の情報を経て、何らかの処理を行い、その結果をモータなどのコントらーらにつなげるとっても素晴らしい仕掛けで、データが発生するところと、処理をするところ、分散するコンピュータで使用することができる。
なので、IPで接続された複数のコンピュータで、処理を分散できるわけだ。
で、話を戻して。SpotMicro君を運転するとすると、カメラの画像を見ながら、前進後進は、停止加速、などをコントロールしたい。
ここで、機種変更で手元にあるIPHONEを使おうt思ったわけだ。
で、先ほどのページを参考にして、なるほど。発信はできた。
が、受信がうまくできない。
ROSのトランスポートはTCPなので、接続がうまくいかないことは ないと思うんだけど、なんか受信がうまくいかない。
具体的に言うとraspicam_node/image/comressedメッセージを受信して、表示するというものを作りたいわけだけど、うまくいっている人がいたら、教えてほしいです。
よろしくお願いします。
SpotMicro(mini) その24 ー現状の到達点ー [ROBOT]
SpotMicro(mini) その23 ーROSTopicによるサーボ動作ー [ROBOT]
キャリブレーションが終わったので、ROSのメッセージで、サーボを動かしてみる。
以下の動画は、このスクリプトで動かしている。
よく見ると、まっすぐがやはりずれているので、それなりの修正が必要みたいだ。
ここまで来たから後は、いよいよ歩きのプログラムを作らないといけない。
以下の動画は、このスクリプトで動かしている。
#min rostopic pub -1 /servos_absolute i2cpwm_board/ServoArray "{servos:[{servo: 1, value: 320},{servo: 2, value: 534},{servo: 3, value: 180},{servo: 5, value: 320},{servo: 6, value: 130},{servo: 7, value: 450},{servo: 9, value: 306},{servo: 10, value: 530},{servo: 11, value: 190},{servo: 13, value: 310},{servo: 14, value: 130},{servo: 15, value: 450}]}" # center rostopic pub -1 /servos_absolute i2cpwm_board/ServoArray "{servos:[{servo: 1, value: 320},{servo: 2, value: 490},{servo: 3, value: 294},{servo: 9, value: 306},{servo: 10, value: 458},{servo: 11, value: 306},{servo: 13, value: 310},{servo: 14, value: 181},{servo: 15, value: 325},{servo: 5, value: 320},{servo: 6, value: 170},{servo: 7, value: 331}]}" # max rostopic pub -1 /servos_absolute i2cpwm_board/ServoArray "{servos:[{servo: 1, value: 320},{servo: 2, value: 275},{servo: 3, value: 492},{servo: 5, value: 320},{servo: 6, value: 368},{servo: 7, value: 133},{servo: 9, value: 306},{servo: 10, value: 260},{servo: 11, value: 504},{servo: 13, value: 310},{servo: 14, value: 379},{servo: 15, value: 127}]}" # center rostopic pub -1 /servos_absolute i2cpwm_board/ServoArray "{servos:[{servo: 1, value: 320},{servo: 2, value: 490},{servo: 3, value: 294},{servo: 9, value: 306},{servo: 10, value: 458},{servo: 11, value: 306},{servo: 13, value: 310},{servo: 14, value: 181},{servo: 15, value: 325},{servo: 5, value: 320},{servo: 6, value: 170},{servo: 7, value: 331}]}" #min rostopic pub -1 /servos_absolute i2cpwm_board/ServoArray "{servos:[{servo: 1, value: 320},{servo: 2, value: 534},{servo: 3, value: 180},{servo: 5, value: 320},{servo: 6, value: 130},{servo: 7, value: 450},{servo: 9, value: 306},{servo: 10, value: 530},{servo: 11, value: 190},{servo: 13, value: 310},{servo: 14, value: 130},{servo: 15, value: 450}]}" #off rostopic pub -1 /servos_absolute i2cpwm_board/ServoArray "{servos:[{servo: 1, value: 0},{servo: 2, value: 0},{servo: 3, value: 0},{servo: 6, value: 0},{servo: 6, value: 0},{servo: 7, value: 0},{servo: 9, value: 0},{servo: 10, value: 0},{servo: 11, value: 0},{servo: 13, value: 0},{servo: 14, value: 0},{servo: 15, value: 0}]}"
よく見ると、まっすぐがやはりずれているので、それなりの修正が必要みたいだ。
ここまで来たから後は、いよいよ歩きのプログラムを作らないといけない。
SpotMicro(mini) その22 ーサーボキャリブレーション再びー [ROBOT]
サーボキャリブレーションをもう一回やり直すことにした。
絵がしょぼいのは、我慢して頂戴。
この図のように角度を決めて、その値を出力するとすると、最終的に、この表の
min angle とmax angleの間で泳いてもらえばいいことにした。L1サーボは、どうしたら
いいかわからんかったけど、-45,45の範囲とした。
これで、あとは、その15で示した表のt1,t2から計算した値を突っ込むと歩き出すはず。
絵がしょぼいのは、我慢して頂戴。
この図のように角度を決めて、その値を出力するとすると、最終的に、この表の
min angle とmax angleの間で泳いてもらえばいいことにした。L1サーボは、どうしたら
いいかわからんかったけど、-45,45の範囲とした。
Name | BoardOut | min angle | center angle | max angle | min val | center val | max val | width angle | width val | |||
FR1 | 12 | 13 | -45 | 0 | 45 | 409 | 310 | 211 | -90 | 198 | -2.2 | |
FR2 | 13 | 14 | -20 | 0 | 90 | 137 | 181 | 379 | -110 | -242 | 2.2 | |
FR3 | 14 | 15 | 30 | 90 | 180 | 457 | 325 | 127 | -150 | 330 | -2.2 | |
RR1 | 4 | 5 | -45 | 0 | 45 | 221 | 320 | 419 | -90 | -198 | 2.2 | |
RR2 | 5 | 6 | -20 | 0 | 90 | 126 | 170 | 368 | -110 | -242 | 2.2 | |
RR3 | 6 | 7 | 30 | 90 | 180 | 463 | 331 | 133 | -150 | 330 | -2.2 | |
FL1 | 8 | 9 | -45 | 0 | 45 | 207 | 306 | 405 | -90 | -198 | 2.2 | |
FL2 | 9 | 10 | -20 | 0 | 90 | 502 | 458 | 260 | -110 | 242 | -2.2 | |
FL3 | 10 | 11 | 30 | 90 | 180 | 174 | 306 | 504 | -150 | -330 | 2.2 | |
RL1 | 0 | 1 | -45 | 0 | 45 | 419 | 320 | 221 | -90 | 198 | -2.2 | |
RL2 | 1 | 2 | -20 | 0 | 90 | 534 | 490 | 292 | -110 | 242 | -2.2 | |
RL3 | 2 | 3 | 30 | 90 | 180 | 162 | 294 | 492 | -150 | -330 | 2.2 |
これで、あとは、その15で示した表のt1,t2から計算した値を突っ込むと歩き出すはず。
タグ:4足歩行
SpotMicro(mini) その21 ー環境の再インストールーROSの追加パッケージ [ROBOT]
やっと、ROSのコンパイルが終わった。
すべてを満足するためのパッケージ一覧は、
これだけのパッケージが必要。本当はいろいろ削減できるかもしれないけど、何かコンパイルしようとして足りてない基本パッケージは、何も考えずに追加した。
この一覧で、
でインストールスクリプト作成して、
作成したインストールスクリプトで、
で、既にインストールされているソースツリーにマージして、
で依存関係の確認をして、
で依存するパッケージをよし何してもらった後、
で、コンパイルする。
で、前回行ったみたいに、catkin_make_isolated は、最初から最後までやろうとするので、最初流してみて、止まったら、エラー解析して、catkin_make_isolated --pkg XXで該当パッケージだけでコンパイルが正常に終わるように修正して、
そのあともう一回catkin_make_isolatedをかけて、すべてのソースのコンパイルが終わるか、別のパッケージでエラーが出るのを確認して。それなりに対処する。
RASPBERRY PI上で動いてほしいパッケージは、raspicam_node と、i2cpwm_boardだけなんだけど、
この二つだけだともっと依存関係和いらないかもしれない。
あ、あとI2Cの関連のコマンドを実行するときにI2Cのデバイスを開けるんだけど、このデバイスはルートのもちもんで、グループはI2cが使用可能になっている。
だから、
でI2Cグループに参加するのを忘れないでね。
すべてを満足するためのパッケージ一覧は、
ros_comm ros_control image_transport compressed_image_transport camera_info_mana ger joy rplidar_ros tf2_geometry_msgs diagnostic_updater tf tf2_eigen rqt_reconf igure
これだけのパッケージが必要。本当はいろいろ削減できるかもしれないけど、何かコンパイルしようとして足りてない基本パッケージは、何も考えずに追加した。
この一覧で、
rosinstall_generator ros_comm ros_control image_transport compressed_image_transport camera_info_manager joy rplidar_ros tf2_geometry_msgs diagnostic_updater tf tf2_eigen rqt_reconf igure --rosdistro melodic --deps --wet-only --tar > melodic-ros_comm-custom.rosinstall
でインストールスクリプト作成して、
作成したインストールスクリプトで、
wstool merge -t src melodic-ros_comm-custom.rosinstall
で、既にインストールされているソースツリーにマージして、
wstool update -t src
で依存関係の確認をして、
rosdep install --from-paths src --ignore-src --rosdistro melodic -y -r --os=debi an:buster
で依存するパッケージをよし何してもらった後、
sudo ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/melodic
で、コンパイルする。
で、前回行ったみたいに、catkin_make_isolated は、最初から最後までやろうとするので、最初流してみて、止まったら、エラー解析して、catkin_make_isolated --pkg XXで該当パッケージだけでコンパイルが正常に終わるように修正して、
そのあともう一回catkin_make_isolatedをかけて、すべてのソースのコンパイルが終わるか、別のパッケージでエラーが出るのを確認して。それなりに対処する。
RASPBERRY PI上で動いてほしいパッケージは、raspicam_node と、i2cpwm_boardだけなんだけど、
この二つだけだともっと依存関係和いらないかもしれない。
あ、あとI2Cの関連のコマンドを実行するときにI2Cのデバイスを開けるんだけど、このデバイスはルートのもちもんで、グループはI2cが使用可能になっている。
だから、
usermod -G i2c
でI2Cグループに参加するのを忘れないでね。
SpotMicro(mini) その20 ー環境の再インストールーROSの追加パッケージインストール [ROBOT]
ROSの追加パッケージをインストールする中で、なんと、驚愕の事実が判明!
2日もかかってコンパイルしたOpenCV4では、使えなくて、Opencv3をインストールする必要がある!
さらにraspicam_nodeのページをちゃんと見てみて、手順に従うと、自動で、Opencv3(コンパイル済みのバイナリー)をインストールしてくれる!!
キーは、wstool とrosdepで、このパッケージに必要な外部ライブラリ(ここではOpenc)を自動的にダウンロードしてインストールされる。
2日を返せとは言わんが、これで進むことができるのだああ。
インストールを進めているが、そうは簡単に問屋が卸してくれないのだ。。
2日もかかってコンパイルしたOpenCV4では、使えなくて、Opencv3をインストールする必要がある!
さらにraspicam_nodeのページをちゃんと見てみて、手順に従うと、自動で、Opencv3(コンパイル済みのバイナリー)をインストールしてくれる!!
キーは、wstool とrosdepで、このパッケージに必要な外部ライブラリ(ここではOpenc)を自動的にダウンロードしてインストールされる。
2日を返せとは言わんが、これで進むことができるのだああ。
インストールを進めているが、そうは簡単に問屋が卸してくれないのだ。。
SpotMicro(mini) その19 ー環境の再インストールーROSの追加パッケージインストーr [ROBOT]
前回のブログで示した通り、raspicam_nodeを追加インストールしているわけだが、
これがうまくいかない。
opencv-4.4.0 を選択したので枯れていると思ったんだけど、そうでもないかもしれない。
最初 実行時ぱけーじとしてインストールしようとして、catkin_wsにダウンロードして個別でコンパイルしても、必要なパッケージが他しないといわれるので、image_transportとか、をROS環境にインストールしたかったので、ros_catkin_wsにダウンロードして、catkin_make_isolatedでコンパイルをした。
しかし、このcatkin_make_isolatedは、最初から全部をコンパイルしようとする。基本的に一度住んでるやつは、ファイルのコンパイルのみはパスされるが、pythonパッケージは、毎回コンパイルされるので、1行直しだけで、2時間の無駄なコンパイルに付き合わないといけない。
これを避ける方法がないかと多い探してみると、やっぱりあった。
実際にコンパイルは、まあかかるのは当然だけど、動くように直してチェックするだけだとそのパッケージだけ見たいので、とても便利。
それでも一個通ったらまた全部をやらないといけないんだけど。
まだ終わってないけど、ちょっと嬉しかったので、アップ
これがうまくいかない。
opencv-4.4.0 を選択したので枯れていると思ったんだけど、そうでもないかもしれない。
最初 実行時ぱけーじとしてインストールしようとして、catkin_wsにダウンロードして個別でコンパイルしても、必要なパッケージが他しないといわれるので、image_transportとか、をROS環境にインストールしたかったので、ros_catkin_wsにダウンロードして、catkin_make_isolatedでコンパイルをした。
しかし、このcatkin_make_isolatedは、最初から全部をコンパイルしようとする。基本的に一度住んでるやつは、ファイルのコンパイルのみはパスされるが、pythonパッケージは、毎回コンパイルされるので、1行直しだけで、2時間の無駄なコンパイルに付き合わないといけない。
これを避ける方法がないかと多い探してみると、やっぱりあった。
/src/catkin/bin/cakin_make_isolated --pkg compress_image_transport
実際にコンパイルは、まあかかるのは当然だけど、動くように直してチェックするだけだとそのパッケージだけ見たいので、とても便利。
それでも一個通ったらまた全部をやらないといけないんだけど。
まだ終わってないけど、ちょっと嬉しかったので、アップ
SpotMicro(mini) その18 ー環境の再インストールーその2 OPENCVのインストール [ROBOT]
ROSでカメラを使用するための、raspicam_nodeをインストールするために、まずOpencvをインストールする。
これがまあ、時間かかった。RASPIZEROは32ビットもそうだけど、メモリが512しかないので、SWAPの増強と、GPUメモリの削減を行った。それでれもトータルメモリは、461.8Mとなる(TOP読み)
raspberry pi GPUメモリの調整は、/boot/config.textにあるgpu_memを変更する。
デフォルトでは、gpu_mem=128となっていると思うが、画面すらつなげないので、GPUメモリへの割り当てはいらない。今回は、gpu_mem=32とした。16まで下げると無視されるので、これが限界かもしれないが、限界値の探索はしていない。
スワップの増強は、/etc/dphys-swapfileの'CONF_SWAPSIZE=100'の数値を2048に変えて、systemctl start dphys-swapfile を実行する。
ここまで済んだら、
でコンパイルを実施する。
この設定で、2日でコンパイルが終わるかとおもったら、エラーが出てた。が。もう一度makeを実施したら終わった。
その後
make install を実施してインストールすれば、取り会えずopencvのコンパイルは終了。
まあ、時間はかかることは予想していたが、ここまでかかったかなというのが正直な印象。
これがまあ、時間かかった。RASPIZEROは32ビットもそうだけど、メモリが512しかないので、SWAPの増強と、GPUメモリの削減を行った。それでれもトータルメモリは、461.8Mとなる(TOP読み)
raspberry pi GPUメモリの調整は、/boot/config.textにあるgpu_memを変更する。
デフォルトでは、gpu_mem=128となっていると思うが、画面すらつなげないので、GPUメモリへの割り当てはいらない。今回は、gpu_mem=32とした。16まで下げると無視されるので、これが限界かもしれないが、限界値の探索はしていない。
スワップの増強は、/etc/dphys-swapfileの'CONF_SWAPSIZE=100'の数値を2048に変えて、systemctl start dphys-swapfile を実行する。
ここまで済んだら、
mkdir build cd build cmake -DOPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-4.4.0/modules -DOPENCV_GENERATE_PKGCONFIG=ON -DBUILD_TEST=ON -DOPENCV_DOWNLOAD_PATH=../.. .. make
でコンパイルを実施する。
この設定で、2日でコンパイルが終わるかとおもったら、エラーが出てた。が。もう一度makeを実施したら終わった。
その後
make install を実施してインストールすれば、取り会えずopencvのコンパイルは終了。
まあ、時間はかかることは予想していたが、ここまでかかったかなというのが正直な印象。
タグ:OpenCV
SpotMicro(mini) その17 ー環境の再インストールーその2 ROSのインストール [ROBOT]
ROSのインストールは、割と簡単。
基本的には、 ここに従えばいい。
後後、便利なように、
1. レポジトリキーの設定
これで、aptのレポジトリーを追加セーと言われているんだけど、"apt install ros-melodic-raspian-buster" みたいなapt のインストールはできない。多分raspibian側のツールのアップデートがあるんだと思うんだけど。
依存するパッケージのインストール
上記で、設定したリポジトリも利用して、依存するパッケージをインストールする
まあ、それぞれのパッケージが何のために必要かとか、書かない。
3. rosdep
rosのインストールに必要なパッケージをダウンロードしてくれるんだと思う。後、環境の準備をしているんだとおもうんだけど、よくわからん。
4.インストール
ここからが本番。
まず、コンパイルのためのディレクトリを作成する
基本的なROS_COMMをインストールすることにして、インストールジェネレータを
作成する。
最初の行で出力される内容をインストール指示書のようである。内容的には、インストールするべきROSのパッケージ(なんだろうなあ)がリストされている。
ros依存性を解決してもらう。
ここまで済んだら、コンパイルする。
これが割と時間がかかるけど、これが終わると基本的なところの作成は終了。
この行を.bashrcに登録して、Bashが起動するために設定をしてもらう。
ここまでで、基本的なインストールはできたわけだが、今回のSpotMicroには、カメラを搭載するので、Opencvが使えるパッケージをインストールするわけだが、ここでもインストールジェネレータを使う
ここではros_controlを追加することを示している。
後は、wstool を動かして、コンパイルをすると追加できる。
さて、本論のOPENCVをいるのであるが、それは、また次回。
基本的には、 ここに従えばいい。
後後、便利なように、
1. レポジトリキーの設定
$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' $ sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 $sudo apt update $sudo apt upgrade
これで、aptのレポジトリーを追加セーと言われているんだけど、"apt install ros-melodic-raspian-buster" みたいなapt のインストールはできない。多分raspibian側のツールのアップデートがあるんだと思うんだけど。
依存するパッケージのインストール
上記で、設定したリポジトリも利用して、依存するパッケージをインストールする
$ sudo apt install -y python-rosdep python-rosinstall-generator python-wstool python-rosinstall build-essential cmake
まあ、それぞれのパッケージが何のために必要かとか、書かない。
3. rosdep
$ sudo rosdep init $ rosdep update
rosのインストールに必要なパッケージをダウンロードしてくれるんだと思う。後、環境の準備をしているんだとおもうんだけど、よくわからん。
4.インストール
ここからが本番。
まず、コンパイルのためのディレクトリを作成する
$ mkdir -p ~/ros_catkin_ws $ cd ~/ros_catkin_ws
基本的なROS_COMMをインストールすることにして、インストールジェネレータを
作成する。
$ rosinstall_generator ros_comm --rosdistro melodic --deps --wet-only --tar > melodic-ros_comm-wet.rosinstall $ wstool init src melodic-ros_comm-wet.rosinstall
最初の行で出力される内容をインストール指示書のようである。内容的には、インストールするべきROSのパッケージ(なんだろうなあ)がリストされている。
ros依存性を解決してもらう。
$ rosdep install -y --from-paths src --ignore-src --rosdistro melodic -r --os=debian:buster
ここまで済んだら、コンパイルする。
$ sudo ./src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/melodic
これが割と時間がかかるけど、これが終わると基本的なところの作成は終了。
source /opt/ros/melodic/setup.bash
この行を.bashrcに登録して、Bashが起動するために設定をしてもらう。
ここまでで、基本的なインストールはできたわけだが、今回のSpotMicroには、カメラを搭載するので、Opencvが使えるパッケージをインストールするわけだが、ここでもインストールジェネレータを使う
rosinstall_generator ros_comm ros_control --rosdistro melodic --deps --wet-only --tar > melodic-custom_ros.rosinstall
ここではros_controlを追加することを示している。
後は、wstool を動かして、コンパイルをすると追加できる。
さて、本論のOPENCVをいるのであるが、それは、また次回。
SpotMicro(mini) その16 ー環境の再インストールーその1OSのインストール [ROBOT]
しばらくSpotに火を入れてなかった。
どうもSDカードの調子が悪い気がする。
起点は、Opencvの再インストールだ。OpencvをROSで使うのに、Cmakeのコンフィグを使うのだが、これをROSの仕掛けがうまく見つけてくれない。調べたらどうもない。まず、
apt list | grep -U openv | grep installed
で、インストールされているopencv関連のファイルを消したり、
OpenCV3とかOpencv4.1とかいろいろなバージョンも入れてみたが、
結局見つけてくれない。
しかもOpencvのインストールというかコンパイルRaspberyPiZeroでだいたい2日が来かかる。
それがおわってから、もう一回消してとかやっていたら、どうもSDカードのアクセスに時間がかかるようになった。実際にTOPで調べてみるとIOWAITが73%とかすげー数出てる。これはたまらんというので、SDカードを変更することにした。
今までは、SandiskのExtremeProをつかっていた。これは、早くていいけど、上記のようになってしまったら、もう仕様がない。
そこで、私が選んだのは、ちょっと遅いかもしれないけど、高耐久をうたっている
SDカードは、物理セクタに書き込む回数に制限がある。それを回避するためにジャーナルファイルシステムを使ったりいろいろ手を使っている。しかし、すでに使われているセクタをほかのセクタに回すことはないので、容量が狭くなっていくと、再利用するチャンスが増える。しかも大物のコンパイルなどは、一つのソースファイルにつき2つ以上のファイルを作ったり消したりしているので、書き換えの頻度がものすごいわけだ、これで、SDカードがどんどん披露し、使いにくくなる。
だから、変える時は大きなサイズのカードに限る。デジカメみたいな、割と書き換え回数が少ないものは、早いほうがいいに決まっているので、そっちを選ぶべきだ。
最も高耐久というのは、環境条件(温度とか湿度とか)みたいで、書き込み回数には、あまり関係ないらしいんだが。
SDカードを変えるということはOSから書かないといけない。
最近は、Etcherというイメージライタがはやりみたいなので、これを使った。
USB3にメディアアダプタをつけて、書き込んだところ19.8MB/sぐらい出てたので、割と早く書き込めた
ファイルは、2021-03--04-raspi-os-buster-armhf.zip にした。RASPIZEROは、32ビット機なのだ。
Xは使わないので、Liteでもよかったんだが、いろんなツールを後から使うときに入ってないのは、面倒なのでこれ。
書き込み終了後、キーボードと、ディスプレイをSpotMicroに接続し、起動。
最近のラズパイは、起動時に自動でディスク拡張をしてくれるので便利だ。
初期設定はスプラッシュ画面ありの、XDMを超えての自動ログインになっている。
普通にデスクトップで使うには、まあいいんだけど、XなんかCPUの浪費でしかないので、止めないといけない。
しかし、Xの自動ログインが標準なので、非力なRASPIZEROには、耐えられない、起動して設定ダイアログが出てくるまで、5分以上かかっている(時間測ってないけど)。
設定ダイアログで何が出てきたか忘れたけど、ロケールと、使用言語の設定があった後、ネットワーク設定があった後、ライブラリのアップデートをするかを聞いてくる。ここでのアップデートはやらないほうがいいと思った。進捗はプログレスバーで教えてくれるし、それでもいいんだけど、
普通にapt-get upgradeのほうが、へえ、こんなのインストールされてるんだ的なノリで面白い。
raspi-configで、カメラ、I2C,SSHの使用を設定する。起動時設定としてテキストコンソールの自動ログインなしを選択したいので、raspi-configで、"1 System Opetions" -> "S5 Boot/ Auto login" -> "B1 Coneole" を選択する。
ssytemctl set-default multi-user でも指定できるけど、スプラッシュ画面は禁止できないので、なんか不思議な動きをする。スプラッシュ画面の禁止は、"1 System Options" -> "S7 Splash Screen" -> "いいえ"
を選択する。
長くなったので、OSのインストールまでにしますが、次はROSのインストールかな。
どうもSDカードの調子が悪い気がする。
起点は、Opencvの再インストールだ。OpencvをROSで使うのに、Cmakeのコンフィグを使うのだが、これをROSの仕掛けがうまく見つけてくれない。調べたらどうもない。まず、
apt list | grep -U openv | grep installed
で、インストールされているopencv関連のファイルを消したり、
OpenCV3とかOpencv4.1とかいろいろなバージョンも入れてみたが、
結局見つけてくれない。
しかもOpencvのインストールというかコンパイルRaspberyPiZeroでだいたい2日が来かかる。
それがおわってから、もう一回消してとかやっていたら、どうもSDカードのアクセスに時間がかかるようになった。実際にTOPで調べてみるとIOWAITが73%とかすげー数出てる。これはたまらんというので、SDカードを変更することにした。
今までは、SandiskのExtremeProをつかっていた。これは、早くていいけど、上記のようになってしまったら、もう仕様がない。
そこで、私が選んだのは、ちょっと遅いかもしれないけど、高耐久をうたっている
SDカードは、物理セクタに書き込む回数に制限がある。それを回避するためにジャーナルファイルシステムを使ったりいろいろ手を使っている。しかし、すでに使われているセクタをほかのセクタに回すことはないので、容量が狭くなっていくと、再利用するチャンスが増える。しかも大物のコンパイルなどは、一つのソースファイルにつき2つ以上のファイルを作ったり消したりしているので、書き換えの頻度がものすごいわけだ、これで、SDカードがどんどん披露し、使いにくくなる。
だから、変える時は大きなサイズのカードに限る。デジカメみたいな、割と書き換え回数が少ないものは、早いほうがいいに決まっているので、そっちを選ぶべきだ。
最も高耐久というのは、環境条件(温度とか湿度とか)みたいで、書き込み回数には、あまり関係ないらしいんだが。
SDカードを変えるということはOSから書かないといけない。
最近は、Etcherというイメージライタがはやりみたいなので、これを使った。
USB3にメディアアダプタをつけて、書き込んだところ19.8MB/sぐらい出てたので、割と早く書き込めた
ファイルは、2021-03--04-raspi-os-buster-armhf.zip にした。RASPIZEROは、32ビット機なのだ。
Xは使わないので、Liteでもよかったんだが、いろんなツールを後から使うときに入ってないのは、面倒なのでこれ。
書き込み終了後、キーボードと、ディスプレイをSpotMicroに接続し、起動。
最近のラズパイは、起動時に自動でディスク拡張をしてくれるので便利だ。
初期設定はスプラッシュ画面ありの、XDMを超えての自動ログインになっている。
普通にデスクトップで使うには、まあいいんだけど、XなんかCPUの浪費でしかないので、止めないといけない。
しかし、Xの自動ログインが標準なので、非力なRASPIZEROには、耐えられない、起動して設定ダイアログが出てくるまで、5分以上かかっている(時間測ってないけど)。
設定ダイアログで何が出てきたか忘れたけど、ロケールと、使用言語の設定があった後、ネットワーク設定があった後、ライブラリのアップデートをするかを聞いてくる。ここでのアップデートはやらないほうがいいと思った。進捗はプログレスバーで教えてくれるし、それでもいいんだけど、
普通にapt-get upgradeのほうが、へえ、こんなのインストールされてるんだ的なノリで面白い。
raspi-configで、カメラ、I2C,SSHの使用を設定する。起動時設定としてテキストコンソールの自動ログインなしを選択したいので、raspi-configで、"1 System Opetions" -> "S5 Boot/ Auto login" -> "B1 Coneole" を選択する。
ssytemctl set-default multi-user でも指定できるけど、スプラッシュ画面は禁止できないので、なんか不思議な動きをする。スプラッシュ画面の禁止は、"1 System Options" -> "S7 Splash Screen" -> "いいえ"
を選択する。
長くなったので、OSのインストールまでにしますが、次はROSのインストールかな。
タグ:RASPIZERO
SpotMicro(mini) その15 ー4足歩行パターン..その2 [ROBOT]
前回の記事で静歩行の1サイクルの75%を設置するようにするには、9ステップの接地と上昇、移動、下降の3ステップで、12ステップが最低必要なことが分かった。
このデューティでやるとすると、上昇、移動、下降がそれぞれ1/12サイクルで実施しないといけない。
足の経路と、サーボによる起動を計算するためにスプレッドシートで計算してみた。
B列がパラメータの列で、L1がひざ上の長さ、L2はひざ下の長さ、として、足の付け根から地面まdでの高さがH、Stepがサイクルのステップ、SlideSizeが着地地点のXの移動量、Liftが足の持ち上げ距離
として、この時、ステップごとの足先の位置の座標をA、Bとして、足経路を決定したのが、図中央上の足経路になるとなる。
これを右図のように角度を仮に決めて計算すると、t1、t2として角度が計算できる。
このデューティでやるとすると、上昇、移動、下降がそれぞれ1/12サイクルで実施しないといけない。
足の経路と、サーボによる起動を計算するためにスプレッドシートで計算してみた。
B列がパラメータの列で、L1がひざ上の長さ、L2はひざ下の長さ、として、足の付け根から地面まdでの高さがH、Stepがサイクルのステップ、SlideSizeが着地地点のXの移動量、Liftが足の持ち上げ距離
として、この時、ステップごとの足先の位置の座標をA、Bとして、足経路を決定したのが、図中央上の足経路になるとなる。
これを右図のように角度を仮に決めて計算すると、t1、t2として角度が計算できる。
SpotMicro(mini) その14 ー4足歩行パターンー [ROBOT]
静歩行について1サイクルにおいて75%を着地することにすれば、4本ある足のどれかの3本が着地する歩行が可能なわけだ。
そこで、どのようなパターンになるかを考えてみた。
ここでは75%をいったん忘れて考えてみることにした。
下に示す表(図?)は、1サイクルにおける動作を、着地しながら移動するスライド(S)、地面から足を話すリフト(L)、空中で前に足を動かすムーブ(M)、足を下すドロップ(D)としてあらわしてみた。
このパターンは、上記の4つの動作を均等に作業するきわめて効率がいいパターンで、最後の行は、ちそのフェーズにおいて着地しているSの数を示している。
このパターンは、4つの動作を均等に割り振っており、1サイクル中のSのデュレーションは25%であるので、ほとんどの期間で、どれか1本しか着地していない。
ちなみに、実際のわんこはこの歩き方をしない。が、1本でも着地していれば、次の着地する脚の力加減で、姿勢を維持することができる。
このパターンは、接地している区間が他の区間の合計に対して2倍になっている。
すべての期間において2本接地しているが、これでも次の時間帯を考慮しないと倒れてしまう。
このパターンは、接地している時間が、他の区間の合計の3倍としており、このため、常に3本の足が接地している。
SLMDの順序は、静方向においては、必ず一緒になるので、ほかの順序の組み合わせは見なくてもいいが、3本を接地させるためには、25%の時間で、75%の作業をしなければいけない理由がわかってもらえたと思う。
ただいろいろやっている中で面白いのを見つけた。
この例はステップで気には、先ほどの75%のものと」同じであるが、位相をちょっと変えてある。
今回の動作の目標は、必ず3本以上の足が接地地している状態を目指しているが、3本ではなく2本のところもある。しかもよく見ると4本接地しているところもある。
4本の間に姿勢を立て直せれば、早い時間に2本脚の区間を通り過ぎれば、実は、これでも行けるかもしれない。(この2本の不安定区間を時間軸でどうにかしようっていうのは、実は動歩行なんだけど)
動歩行への挑戦は、ちょっと先延ばしにするのが、先ほどの2本だけずっと着地しているバターンも動歩行(普通に歩いてるときはこれ)だし、全力疾走中のわんこは、4本をほぼ同時に着地して4本足で地面をけって加速し、次の瞬間すべての足が地面から離れている。
本物のスポットは2本脚を交互にに着地させている。よく見ると4本とも着地している瞬間があるかもしれない。
わんこたちは、静歩行と動歩行をいい感じで、使い分けているし、もっとフェーズを観察すると、もっと長いフェーズの中で動作をしているようにも見える(着地がかぶっているようにも見える)
本日はこの辺で。
そこで、どのようなパターンになるかを考えてみた。
ここでは75%をいったん忘れて考えてみることにした。
下に示す表(図?)は、1サイクルにおける動作を、着地しながら移動するスライド(S)、地面から足を話すリフト(L)、空中で前に足を動かすムーブ(M)、足を下すドロップ(D)としてあらわしてみた。
このパターンは、上記の4つの動作を均等に作業するきわめて効率がいいパターンで、最後の行は、ちそのフェーズにおいて着地しているSの数を示している。
このパターンは、4つの動作を均等に割り振っており、1サイクル中のSのデュレーションは25%であるので、ほとんどの期間で、どれか1本しか着地していない。
ちなみに、実際のわんこはこの歩き方をしない。が、1本でも着地していれば、次の着地する脚の力加減で、姿勢を維持することができる。
このパターンは、接地している区間が他の区間の合計に対して2倍になっている。
すべての期間において2本接地しているが、これでも次の時間帯を考慮しないと倒れてしまう。
このパターンは、接地している時間が、他の区間の合計の3倍としており、このため、常に3本の足が接地している。
SLMDの順序は、静方向においては、必ず一緒になるので、ほかの順序の組み合わせは見なくてもいいが、3本を接地させるためには、25%の時間で、75%の作業をしなければいけない理由がわかってもらえたと思う。
ただいろいろやっている中で面白いのを見つけた。
この例はステップで気には、先ほどの75%のものと」同じであるが、位相をちょっと変えてある。
今回の動作の目標は、必ず3本以上の足が接地地している状態を目指しているが、3本ではなく2本のところもある。しかもよく見ると4本接地しているところもある。
4本の間に姿勢を立て直せれば、早い時間に2本脚の区間を通り過ぎれば、実は、これでも行けるかもしれない。(この2本の不安定区間を時間軸でどうにかしようっていうのは、実は動歩行なんだけど)
動歩行への挑戦は、ちょっと先延ばしにするのが、先ほどの2本だけずっと着地しているバターンも動歩行(普通に歩いてるときはこれ)だし、全力疾走中のわんこは、4本をほぼ同時に着地して4本足で地面をけって加速し、次の瞬間すべての足が地面から離れている。
本物のスポットは2本脚を交互にに着地させている。よく見ると4本とも着地している瞬間があるかもしれない。
わんこたちは、静歩行と動歩行をいい感じで、使い分けているし、もっとフェーズを観察すると、もっと長いフェーズの中で動作をしているようにも見える(着地がかぶっているようにも見える)
本日はこの辺で。
タグ:robot
SpotMicro(mini) その13 -- 静的歩行と動的歩行 [ROBOT]
しばらく、手が付かなかったけど再開。
4足歩行には、静歩行と動歩行というのがあるらしい。
静歩行は、4本足中3本が接地している歩行形態で、動歩行は同時接地が2本以下で、全力走行中は、常時接地は0の時間帯がある。静歩行は、接地している足が3本あるので、ボディの姿勢維持は、接地している足で行う。これに対し動歩行は、2本以下しか接地していないので、姿勢の維持のために、重心を制御するとかの難しい制御が必要なる。倒立振り子(簡単に言うと傘の先を掌に充てて建てるやつ)を2次元方法(上下方向は、1本以上の足が接地してるとすると考えなくていい)で制御する必要がある。多分、ジャイロを積んで、必要以上の姿勢変化が起こった時に、それを打ち消すように姿勢を制御すればいいわけだけど、サーボを使ってやろうとすると、指示を出してから、移動体が移動を完了するまでの時間帯がソフトウェアにしても長いので、そのあたりの学習をする必要があるんだと思うんだがなんだか難しいので、今回はパス。
で、静歩行なんだけど、3本以上の足が常に接地している必要がある。
足の運動を見ていると、横に倒した台形を丸めた形に見えるので、計算の手間を省くために、長方形の軌道を考える、この長方形の下底が接地面ということになる。4本の脚は、この長方形の軌道に沿って、運動しているわけで、常に3本が接地するおいうことは、下底を全体のサイクルの75%をかけて移動すればいいことになる。残りの25%で、残りの移動をすることになる。
普通に考えると1辺ごとに25%でサイクルを回せば、ほぼ均等にサイクルを回すことができそうだが、先ほども言ったとおり、下底だけで、75%を使用して回すことになる。絵にかいてみればわかるが、下底で75%はまあいいけど、それと同じ以上の距離を3倍のスピードで回さないといけない。
4分の3の工程を4分の1の時間で回すことになる。
4分の1の工程のステップ数をいくつにするかで、全行程のステップ数が来まる。25%を1ステップだとすると、前部で4ステップになるが、それだと1ステップで、下底の後端から前端まで移動しないといけない。なので、25%で複数ステップが必要になる。あまりステップ数を多くすると、歩行スピードに影響が出てくる。あるのだから遅くなってもいいけどあまり遅いのはいただけない。
そこで、25%のステップ数を6にすると、全行程のステップ数は、24ステップになる。1回転は、2秒以下にしたい。とすると、1秒でラウンドするには、約42m秒でワンステップを実行しないといけない。やはり2秒程度になる気がする。
このサイクルを90度づつずらせば、3本が接地しているサイクルが完成する。
はず。
4足歩行には、静歩行と動歩行というのがあるらしい。
静歩行は、4本足中3本が接地している歩行形態で、動歩行は同時接地が2本以下で、全力走行中は、常時接地は0の時間帯がある。静歩行は、接地している足が3本あるので、ボディの姿勢維持は、接地している足で行う。これに対し動歩行は、2本以下しか接地していないので、姿勢の維持のために、重心を制御するとかの難しい制御が必要なる。倒立振り子(簡単に言うと傘の先を掌に充てて建てるやつ)を2次元方法(上下方向は、1本以上の足が接地してるとすると考えなくていい)で制御する必要がある。多分、ジャイロを積んで、必要以上の姿勢変化が起こった時に、それを打ち消すように姿勢を制御すればいいわけだけど、サーボを使ってやろうとすると、指示を出してから、移動体が移動を完了するまでの時間帯がソフトウェアにしても長いので、そのあたりの学習をする必要があるんだと思うんだがなんだか難しいので、今回はパス。
で、静歩行なんだけど、3本以上の足が常に接地している必要がある。
足の運動を見ていると、横に倒した台形を丸めた形に見えるので、計算の手間を省くために、長方形の軌道を考える、この長方形の下底が接地面ということになる。4本の脚は、この長方形の軌道に沿って、運動しているわけで、常に3本が接地するおいうことは、下底を全体のサイクルの75%をかけて移動すればいいことになる。残りの25%で、残りの移動をすることになる。
普通に考えると1辺ごとに25%でサイクルを回せば、ほぼ均等にサイクルを回すことができそうだが、先ほども言ったとおり、下底だけで、75%を使用して回すことになる。絵にかいてみればわかるが、下底で75%はまあいいけど、それと同じ以上の距離を3倍のスピードで回さないといけない。
4分の3の工程を4分の1の時間で回すことになる。
4分の1の工程のステップ数をいくつにするかで、全行程のステップ数が来まる。25%を1ステップだとすると、前部で4ステップになるが、それだと1ステップで、下底の後端から前端まで移動しないといけない。なので、25%で複数ステップが必要になる。あまりステップ数を多くすると、歩行スピードに影響が出てくる。あるのだから遅くなってもいいけどあまり遅いのはいただけない。
そこで、25%のステップ数を6にすると、全行程のステップ数は、24ステップになる。1回転は、2秒以下にしたい。とすると、1秒でラウンドするには、約42m秒でワンステップを実行しないといけない。やはり2秒程度になる気がする。
このサイクルを90度づつずらせば、3本が接地しているサイクルが完成する。
はず。
SpotMicro(mini) その12 ーROSでの画像通信ー [ROBOT]
SpotMicroの機体に乗せるソフトウェアを公開していただける人たちのブログ(githubなんかも)を見ると、動くところに命を懸けている。
まあ、動かいないといけないからそれはそうなんだけど。
で、動かすことはちょっと忘れて、オンボードカメラから映像を飛ばすというのをやってみることにした。
基本的な構成としては、SpotMicroの上のRaspberry Pi Zero に接続されたRASPICAMERAから映像を取り出し、ROSのメッセージに流し、それを別のコンピュータで受信して表示するという言うもの。
の、さらに、習作。
ROSとOpenCVはすごく相性が良く、また、OpevCVで取り込んだイメージをROSのメッセージに変換する”cv_bridge"とか、イメージを送受信する"image_transport"とか、豊富なイメージの取り扱いが容易にできる。
はずだった。
ROSのバージョンはMELODICを使ったが、これは基本的には、RaspiOSではサポートされていない(実際には、有志によるインストールスクリプトなんかがあり、それをつかえば簡単にインストールできる)。
発生した問題点という壁は、以下のようなものだった。
image_pubとimage_subでこの画像の受け渡しを行うことが可能になる。
後は受け取った画像を。。。。。
まあ、動かいないといけないからそれはそうなんだけど。
で、動かすことはちょっと忘れて、オンボードカメラから映像を飛ばすというのをやってみることにした。
基本的な構成としては、SpotMicroの上のRaspberry Pi Zero に接続されたRASPICAMERAから映像を取り出し、ROSのメッセージに流し、それを別のコンピュータで受信して表示するという言うもの。
の、さらに、習作。
ROSとOpenCVはすごく相性が良く、また、OpevCVで取り込んだイメージをROSのメッセージに変換する”cv_bridge"とか、イメージを送受信する"image_transport"とか、豊富なイメージの取り扱いが容易にできる。
はずだった。
ROSのバージョンはMELODICを使ったが、これは基本的には、RaspiOSではサポートされていない(実際には、有志によるインストールスクリプトなんかがあり、それをつかえば簡単にインストールできる)。
発生した問題点という壁は、以下のようなものだった。
壁 | 詳細 |
コンパイルがうまくいかない | ROSのコンパイルはCatkinエコシステムっていうのでやるらしいが、基本的にはCMAKEをつかってコンパイルをする。この時CMakeList.txtを正しく設定しないといけないんだけど、利用した、cv_bridge,image_trans_port は、OpenCVを利用するわけだけど、それらをCMakeList,.txtに正しく設定しないといけない。findPackage,add_excutable,add_libraryを設定する。この時add_libraryは、リンク情報を書くわけではないらしい。 |
ライブラリが不足してリンクが完成しない | 今回ROS ROS本体や、cv_bridge等は、RASPI上で動くバイナリを持ってきて動かすtことにしたが、ROS ROSは基本的にCMAKEを基本として動いている。CMAKEは、パッケージに必要なインクルードファイルや、ライブラリの配置位置をファイルから得られるような機構を持っていて特定のディレクトリにそのファイルを置く。そこにあることを前提としてmakeが行われるが、CMAKEが期待する方法でで季節にインストールしたOpenCVでないとうまくいかない。といっても普通にコンパイルすればいいみたいだけど。/td> |
image_pubとimage_subでこの画像の受け渡しを行うことが可能になる。
後は受け取った画像を。。。。。
タグ:SpotMicro
SpotMicro(mini) その11 ーSpotMicroのソフトウェア その2ー [ROBOT]
SpotMicroMiniのソフトウェアはROSを使うことにしているが、ROSのバージョン1では、機体上の情報を生成をするノードと、その情報を受け取って、次の動作を考えるノードと、そのノードからの指示を受け取りサーボにデータを送るノードをそれそれ作る必要がある。
ただ、機体上に搭載されているコンピュータは、かなり非力なので、情報の収集とサーボの制御以外の意思決定を外に出すことにする。
情報収集系のノード
これらのノードをpublisherとして動作させる。
ROSのメッセージは、定期的に出力され、出力周期もそれぞれのセンサごとに設定されている。
上記の情報センサは、カメラ以外はI2Cバスを介して、データを収集する。それぞれのノードに
対して一つのプログラムを作成し、データを取得するようにするのが一般的ではあるが、それぞれのプログラムがI2Cバスに介して、アクセスを行うとバスの競合がおこり、データが破壊される。それぞれのプログラムが、競合を調整しながらデータを取り合うか、一つのプログラムが、I2Cバスへのアクセスを一手に行い、競合しないように動作させる必要がある。
SpotMicroMiniでは、I2Cに関するプログラムを一手に行うことにするが、一つ問題がある。すべてのセンサの情報出力周期が異なること。また、LCDパネルもI2Cにつながっていることだ。
一つのプログラムで、複数の周期をもつノードと、出力をコントロールするプログラムを書かないといけない。さて、どうなることやら。
ただ、機体上に搭載されているコンピュータは、かなり非力なので、情報の収集とサーボの制御以外の意思決定を外に出すことにする。
情報収集系のノード
情報元 | 出力ノード | 処理概要 |
Raspi Camera | FrontImage | フロントに設置されたカメラ。連続静止画を送信する。カメラによるJPG圧縮データをタイムスタンプとともに出力する |
電圧センサ | BatteryVolt | 機体に搭載された電池の電圧を出力する。2セルのバッテリーが並列に接続させている。<./td> |
近接TOFセンサ | TOF1,TOF2 | TOFによる近接センサ。40㎝以内を検出する。基本的には、同じTOFを使って、出力制御ピンを制御することにより右左の物体の近接を検出する。右のセンサは、左側に15度傾けてあり、左側の位置を検出し、右のセンサは左を検出する<./td> |
9軸IMU | IMU | 9軸のIMUセンサ、MPU9250を使用している。<./td> |
これらのノードをpublisherとして動作させる。
ROSのメッセージは、定期的に出力され、出力周期もそれぞれのセンサごとに設定されている。
上記の情報センサは、カメラ以外はI2Cバスを介して、データを収集する。それぞれのノードに
対して一つのプログラムを作成し、データを取得するようにするのが一般的ではあるが、それぞれのプログラムがI2Cバスに介して、アクセスを行うとバスの競合がおこり、データが破壊される。それぞれのプログラムが、競合を調整しながらデータを取り合うか、一つのプログラムが、I2Cバスへのアクセスを一手に行い、競合しないように動作させる必要がある。
SpotMicroMiniでは、I2Cに関するプログラムを一手に行うことにするが、一つ問題がある。すべてのセンサの情報出力周期が異なること。また、LCDパネルもI2Cにつながっていることだ。
一つのプログラムで、複数の周期をもつノードと、出力をコントロールするプログラムを書かないといけない。さて、どうなることやら。
2020-10-28 11:43
コメント(0)