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

伊藤 宣博 norihiro-ito @ eac-inc.co.jp
2017年 9月 1日 (金) 17:20:54 JST


中岡様

このような特殊な事例に対応していただけるとのこと、
感謝申し上げます。
ソースのアップデータを待ちまして、対応を行って
いきたいと思います。

ありがとうございました。

On 2017/09/01 17:09, 中岡 慎一郎 wrote:
> 伊藤様
> 
> なるほど、少し特殊なシミュレーションをされているのですね。
> 了解です。
> 
> ちなみにシミュレーションの開始、終了に関しては、SimulatorItemに
> 
> SignalProxy<void()> sigSimulationStarted();
> SignalProxy<void()> sigSimulationFinished();
> 
> というシグナルが用意されているのですが、停止態の変化についてはシグナルを定義していなかったことに気が付きました。
> 
> SignalProxy<void()> sigSimulationPaused();
> SignalProxy<void()> sigSimulationResumed();
> 
> みたいなシグナルを作って、これによって停止状態の変化を検知することは可能かと思います。
> 
> シグナルの接続先関数はメインスレッドで呼ばれることになりますが、そこから適当な同期処理をしてコントローラ側に通知するということになるかと思います。
> 
> これについて、追加を検討したいと思います。
> 
> On 09/01/17 16:33, 伊藤 宣博 wrote:
>> 中岡様
>>
>> こんにちは、伊藤です。
>>
>> ご返事ありがとうございます。
>>
>> 実は今回の目的はChoreonoid内で完結しているのではなく、
>> 外部環境の実変化をシミュレーションに適用したいと
>> 目的があり、一時停止中にその効果を停止・変更を
>> 行いたいと考えています。
>> 詳しくは申し上げられませんが、シミュレータ開始時に、
>> 外部コマンドを実行して、外部環境(OS)の状態を変更
>> しているためという理由です。
>>
>> スレッドセーフの件は、boolアクセスはアトミックだと
>> 思われますので、今のところ問題視はしておりませんが、
>> 問題が出るような場合はロックをかけたいと思います。
>>
>> 以上、よろしくお願いいたします。
>>
>> On 2017/09/01 15:44, 中岡 慎一郎 wrote:
>>> 伊藤様
>>>
>>> 産総研の中岡です。
>>>
>>> この件ですが、一時停止はシミュレーションの外の(メタな)世界の話ですので、一般論としては、コントローラが検知できるものではありませんし、するものでもありません。
>>>
>>>> しかし、一時停止してしまうと、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
>>>>
>>>
>> _______________________________________________
>> choreonoid-users-ja mailing list
>> choreonoid-users-ja @ choreonoid.org
>> https://choreonoid.org/mailman/listinfo/choreonoid-users-ja
>>
> 


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