Skip to content

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

@Naoki-Hiraoka

Description

@Naoki-Hiraoka

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をマルチスレッドで処理できるようにしたいです。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions