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

[RobotHardware] call close_iob() on SIGINT #1328

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

Naoki-Hiraoka
Copy link
Contributor

hrpEC以外のecを使用しているときに、SIGINTでrtcdが終了するときにclose_iob()を呼んでから終了するようにするための変更です。

close_iob()の中で指令トルクを0にするといった終了処理を行っているのですが、rtcdが終了するときにclose_iob()を呼んでから終了してほしいです。

OpenRTM_aistは、SIGKILLやSIGTERMで終了する場合には強制終了してしまいますが、SIGINTで終了する場合には、各RTCのonFinalize()を呼んだり、各ExecutionContextのisRunning() (or m_running)をfalseにセットしたりといった終了処理を行ってから終了します。

https://github.com/OpenRTM/OpenRTM-aist/blob/ce8fe01a103dfbbcc367d30377ec1f00892d3283/src/lib/rtm/Manager.cpp#L100

今、hrpECは終了処理中にclose_iobを呼ぶのですが、RobotHardware.rtcは終了処理中にclose_iobを呼びません。(robotクラスのデストラクタでclose_iobが呼ばれるのですが、signalで終了する場合にはデストラクタは呼ばれないため)

そのため、hrpEC以外のecを使用しているときに、SIGINTでrtcdが終了するときにclose_iob()を呼んでから終了することができませんでした。

RobotHardware.rtcのonFinalize()中でclose_iobを呼ぶようにしました。

@fkanehiro
Copy link
Owner

終了処理が行われる場合でもRobotHardwareコンポーネントはdestructされないということでしょうか?

@Naoki-Hiraoka
Copy link
Contributor Author

終了処理が行われる場合でもRobotHardwareコンポーネントはdestructされないということでしょうか?

はい。print文を入れて確認しましたが、RobotHardwareコンポーネントのonFinalizeは呼ばれますが、デストラクタは呼ばれていませんでした。

https://github.com/OpenRTM/OpenRTM-aist/blob/ce8fe01a103dfbbcc367d30377ec1f00892d3283/src/lib/rtm/Manager.cpp#L164-L175

本来はこのあたりでdestructされていそうなので、もしかしたら僕の環境固有の問題かもしれません。OpenRTMは1.1.2を使用しています。

@Naoki-Hiraoka
Copy link
Contributor Author

@Naoki-Hiraoka
Copy link
Contributor Author

memo

関連するissue #23 (このときに、RobotHardwareコンポーネントがdestructされればclose_iobされるようになった)

@Naoki-Hiraoka
Copy link
Contributor Author

Naoki-Hiraoka commented Mar 30, 2023

2つのOpenRTM1.1.2のバグ?によって、デストラクタが呼ばれず終了していたことがわかりました。

また、それとは別に、理由はよく分かりませんがExecutionContextのsvc()のループ中で while (!m_worker.running_) { m_worker.cond_.wait(); }を行うのも良くないようでした。

これらを直すと、RTCのデストラクタが呼ばれるようになり、このPull Requestがなくても、hrpEC以外のecを使用しているときにSIGINTでrtcdが終了するときにclose_iob()を呼んでから終了するようになりました。

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

Successfully merging this pull request may close these issues.

2 participants