[choreonoid-users-ja 00253] Re: ControllerItem内で一時停止/再開を認識するには

中岡 慎一郎 s.nakaoka @ aist.go.jp
2017年 9月 1日 (金) 15:44:03 JST


伊藤様

産総研の中岡です。

この件ですが、一時停止はシミュレーションの外の(メタな)世界の話ですので、一般論としては、コントローラが検知できるものではありませんし、するものでもありません。

> しかし、一時停止してしまうと、control()の呼び出しも停止する
> ことがわかり、これでは制御できないことがわかりました。

これについても、シミュレーション世界での時間進行そのものが止まるということになりますので、そうなります。

また、解決方法として提示されているコードは、別スレッドを起こしているということですが、使われている関数は基本的にメインスレッド(GUIが稼働しているスレッド)から呼ばれることが前提となっており、スレッドセーフではありません。

まあこの例では、isPausing()に関してはbool型の変数の値を返しているだけなので、スレッド競合でクラッシュするということはないと思いますが、finOwnerItemを実行するタイミングによっては問題が出ます。

そもそも伊藤さんがやりたいことはどのようなことでしょうか?
もしロボットの制御を一時停止したいという話であれば、コントローラ側で一時停止という状態を作って、その間はロボットが動かないようにする、というのが通常のやりかたです。その場合シミュレーションも進行しますしcontrol()も呼ばれ続けますが、ロボットは動かない、ということになります。

On 08/30/17 18:06, 伊藤 宣博 wrote:
> こんにちは、伊藤です。
> 
> この件は、安易な解決方法ですが、別スレッドを起こしてシミュレータの
> 状態を監視することで対応しました。
> 
> //別スレッド処理
> void MyControllerItem::monitorSimulatorState()
> {
> 	SimulatorItem* simlator = findOwnerItem<SimulatorItem>();
> 
> 	while (monitoring) {
> 		simulatorIsPausing = simlator->isPausing();
> 	}
> }
> 
> シミュレータ側にステート管理用の関数登録口があると良いかもと
> 思ったのですが、考えますとあまり需要はなさそうです、、。
> 
> 以上、よろしくお願いいたします。
> 
> On 2017/08/25 18:03, 伊藤 宣博 wrote:
>> はじめまして。伊藤と申します。
>>
>> 1.6開発版を使用しています。
>> 現在、ControllerItemを継承してコードを書いているのですが、
>> 一時停止/再開のタイミングで行いたい処理があり、以下のように
>> ControllerItemのcontrol()の中でSimulatorItemのAPIを使うことで
>> 実現できないかと考えました。
>>
>> bool MyControllerItem::control() {
>>    cnoid::SimulatorItem* simulator = findOwnerItem<SimulatorItem>();
>>    simulator->isRunning()
>>    simulator->isPausing()等の利用
>> }
>>
>> しかし、一時停止してしまうと、control()の呼び出しも停止する
>> ことがわかり、これでは制御できないことがわかりました。
>> 一時停止/再開のトリガーで処理を実行する方法はありますでしょうか。
>>
>> ご助言をいただけると幸いです。
>> よろしくお願いいたします。
> _______________________________________________
> choreonoid-users-ja mailing list
> choreonoid-users-ja @ choreonoid.org
> https://choreonoid.org/mailman/listinfo/choreonoid-users-ja
> 

-- 
中岡 慎一郎 <s.nakaoka @ aist.go.jp>
産業技術総合研究所 知能システム研究部門
ヒューマノイド研究グループ





choreonoid-users-ja メーリングリストの案内