Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

自動生成されるServiceROSBridgeがシングルスレッド実行 #1127

Open
Naoki-Hiraoka opened this issue Nov 4, 2022 · 1 comment

Comments

@Naoki-Hiraoka
Copy link
Contributor

Naoki-Hiraoka commented Nov 4, 2022

rtmbuildで自動生成されるServiceROSBridgeはROSのserviceをシングルスレッドで処理するので、特定の条件を満たすまでsleepする系のサービスコールを呼んだときに、デッドロックに陥る場合がある、という問題があります。

例えば、AutoBalancerServiceROSBridgeに次のような順でサービスコールを送ると、AutoBalancerServiceROSBridgeがデッドロックに陥り、困りました。

$ rosservice call /AutoBalancerServiceROSBridge/goVelocity "vx: 0.0 
vy: 0.0 
vth: 0.0"
$  rosservice call /AutoBalancerServiceROSBridge/waitFootSteps "{}"
$ # 以降別ターミナルからAutoBalancerServiceROSBridge にサービスコールを送れなくなる. 別ターミナルから/AutoBalancerServiceROSBridge/goStopなどを呼んでも止まらない。

AutoBalancer本体のRTCは、OpenRTMの仕様でサービスコールを別スレッドで処理するのでデッドロックになりません。

一つのROSのクライアントノードからサービスコールをしている場合には、問題が起こるような順番で呼ばなければいいのでこの問題は起こりにくいのですが、複数のROSのクライアントノードから非同期にサービスコールをしている場合に、頻発します。

ROSのserviceをマルチスレッドで処理できるようにしたいです。

@Naoki-Hiraoka
Copy link
Contributor Author

#839 と関連

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant