[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
EdisonでもVNC接続してX Windowを起動すればGUIで操作できるとからしいですが、正直あまり食指が動きません。何でだろうな?
でもよく考えてみたらRaspberry Piに比べるとビデオ出力が無かったり、USBが1つしかなくてキーボードやマウスを取り付けられないとか別にデメリットでも何でもないわけだし、Edisonの方が流行りそうな感じですけどね。ちょっと高いか。
最初から無線LANに接続できるのは地味にメリットが大きいと思います。Raspberry Piだって無線LANドングルを使えば接続できるわけですが、何だか色々面倒です。まず、どの無線LANドングルにRaspbianが対応しているのかがよく分かりません。対応しているのを見つけたと思ったら「発熱が酷いから使わない方がいいよ」とか書かれているので、結局どれを使えばいいんだよという感じになります。
まあ、そもそも比較対象が少し違うか。
Edisonを使ってRTシステムを組む場合、どういう構成にすべきか?
まず、アクチュエータにしてもセンサにしてもGPIOで制御するか、SPI、I2C等で何らかのデバイスに通信するかと言う事になると思いますが、接続したアクチュエータ、センサを個別にRTコンポーネント化すべきか?と言われれば正直迷う所ですね。基本的にRTシステムエディタでの操作は母艦PCで行うと思うのですが、組込み機器の場合単一のRTCの方が分かりやすいように思います。もちろん粒度の問題もありますが。例えば12自由度の4脚ロボットを開発するとして、12個のモーター制御RTCを起動する人なんてほとんどいないと思いますので。
完全に個人的な考えですが、以下の手順でRTCの起動、終了が出来ると簡単に使えると思います。
- Edisonの電源を入れるとネームサーバー、RTCが起動
- RTシステムエディタでRTCをExitすると自動的にシャットダウンする
Edisonの電源を入れるだけで、後は全てRTシステムエディタ、rtshell、もしくは他のRTCで操作したいと思っています。とにかくリモートログインをしたくないのです。
まあrtcdとか使えば複数のRTCを起動した状態でも可能ですけど、全てのRTCを終了させないとシャットダウンしないのでなんだかややこしい事になりそうな感じはします。
いやでもカメラとかURGとか使おうと思ったら既存のRTCを使った方が開発が楽だろうし、複合コンポーネントにでもしておけばいいのかな?
Edison起動
ネームサーバー起動
rtcdで必要なRTCを起動
rtshellでデータポート接続
rtshellで複合コンポーネント化
複合コンポーネントをExit
シャットダウン
こんな感じの手順でやれば使いやすいように思います。
rtc.confで設定しておけばRTCがなくなった場合にマネージャ、プロセスを自動的に終了させることはできるので、rtcd終了直前にos.system("shutdown -h now")とか書いておけばシャットダウンしますかね?
C++版とPython版のrtcdを両方起動している場合はどうしましょう。
マネージャ終了時にネームサーバーにRTCが残っていないかの確認をさせておきますか。
今の所、複合コンポーネント化以外の実装できまています。
複合コンポーネントはPeriodicStateSharedCompositeというタイプに設定する必要があると思うのですが、やり方がよくわかりません。というよりRTシステムエディタでPeriodicStateSharedCompositeに設定してもエラーが出て複合コンポーネントを作成できません。PeriodicECSharedComposite、GroupingではExitしても複合コンポーネントが消えるだけなので意味はないでしょうし、PeriodicStateSharedCompositeに設定する必要がありそうです。
複合コンポーネントのタイプについて、僕の認識が合っているかどうかは知りませんがおそらくこんな感じだと思います。
Grouping:RTシステムエディタ上で見た目だけ複合化する
PeriodicECSharedComposite:実行コンテキストを共有する
PeriodicStateSharedComposite:実行コンテキスト、状態を共有する
いやでも実行コンテキストを共有されるのは少し困るな。
状態だけ共有して、実行コンテキストは共有しないみたいな事は出来ないのでしょうかね?
Groupingはこんな感じです。
そもそもRTCと実行コンテキストとの関係と言うのが非常に分かりづらいのですが、普通にRTCを起動するとRTCと実行コンテキストは1対1です。
ただ他のRTCに関連付けられた実行コンテキストにアタッチしたり、あるいは以前の記事で作ったプログラムみたいにRTCを起動した時点で複数の実行コンテキストに関連付けられていると言った事もできます。
この場合、RTCは実行コンテキストごとに状態をもっているので、EC1ではActive、EC2ではInactiveな状態もあると言う事です。
つまりPeriodicECSharedCompositeでは新たに実行コンテキストを作成して、その実行コンテキスト内で各RTCのロジックを実行すると言う事になります。
つまり、図にするとこんな感じです。
- 複合コンポーネントをRTシステムエディタで操作すると全てのRTCがアクティブ化、終了等を行う
- RTCを個別に操作した場合、他のRTCの状態は変化しない
- 実行コンテキストは共有しない
と言うのが理想なのですが、当てはまるタイプが無かったみたいです。
PeriodicStateSharedCompositeでいけると思ったのですが、実行コンテキストの共有はやらなくていいです。
上記の複合コンポーネントを実現しようとした時に、複合コンポーネントをアクティブにしたときに各RTCはどの実行コンテキストについてアクティブにすべきか?と言われればowned0で構わないと思いますけどね。Edison上で動作するRTCを他の実行コンテキストにアタッチするなんて、正直意図がわからないのですが。同期させたいのなら複合コンポーネント内部でさらにPeriodicECSharedCompositeの複合コンポーネントを使えば良いので、別に問題はないと思います。
いっその事操作用RTCを起動しておいて、そのRTCがExitされたらシャットダウンするとかの方が良いかもしれないです。いやでもまとめてアクティブ化できないと不便だし、操作用RTCのonActiveでネームサーバー内のRTCを全てアクティブにするとか、そう言う事をすれば実現は一応可能ですが、なんだかもっとやり方はないのかと思います。
余計な事を言いすぎましたが、今の所こんな感じに実装できています。
やはり少し面倒です。
と言うか、RTシステムエディタのネームサーバの追加も自動的にやってほしいです。
例えばこんな感じでRTCの自動起動を実装したEdisonを積んだロボットを入手したとして、すぐに使えるかと言えば微妙ですね。
無線LANの設定が必要かと思ったのですが、J16に接続すればUSB経由の通信でRTC同士の通信も普通にできるので別に必須ではないです。
と言うかraspberry piでのRTCの起動スクリプトは既に存在するみたいだけど、電源切る時はどうしているのでしょうね?
にほんブログ村のロボットのカテゴリから
全然人が来ない・・・