Closed atinfinity closed 1 month ago
@terakoji-pfr 本件についてご見解頂けないでしょうか?
@atinfinity 上部のclient.ros_laser_scan.stream()ブロックされていて、肝心のactivatorのところに到達してなさそうです。
最小限のコードは以下のようになります。こちらお試しください。
import kachaka_api
from kachaka_api.util.vision import LaserScanActivator
import asyncio
client = kachaka_api.aio.KachakaApiClient()
activator = LaserScanActivator()
with activator.activate():
while True:
await asyncio.sleep(1)
@atinfinity 添付頂いたコードは、async generatorを生成しているだけで、activatorのところを一瞬で抜けてしまう処理になっています。(上記のコメントではブロックされると書かれていますが、厳密には抜けていると思います) context managerの内部に居続けることが、LiDARが動き続ける条件になります。 例えば、元のコードで以下のように最後にprintを入れると、"activator finished"と表示されてしまうと思います。
import kachaka_api
from kachaka_api.util.vision import LaserScanActivator
client = kachaka_api.aio.KachakaApiClient()
async def get_and_show_laser_scan_loop():
client.ros_laser_scan.stream()
activator = LaserScanActivator()
with activator.activate():
await get_and_show_laser_scan_loop()
print ("activator finished")
ちゃんとasync generatorを使い中の処理を書いてあげると(とりあえず以下は何もしていないですが)、activatorが動き続けてLiDARが止まることはないはずです。
import kachaka_api
from kachaka_api.util.vision import LaserScanActivator
client = kachaka_api.aio.KachakaApiClient()
async def get_and_show_laser_scan_loop():
async for scan in client.ros_laser_scan.stream():
# do something
pass
activator = LaserScanActivator()
with activator.activate():
await get_and_show_laser_scan_loop()
print ("activator finished")
@terakoji-pfr ありがとうございます。動作確認致します。
@terakoji-pfr 頂いたコードで意図通りの挙動(=カチャカがしばらく静止していてもscanキャプチャが継続される)になること確認致しました。
https://github.com/pf-robotics/kachaka-api/issues/100#issuecomment-2217232092で質問した件です。https://github.com/pf-robotics/kachaka-api/issues/100#issuecomment-2217399096で
というご回答を受けたので、python/demos/get_laser_scan.ipynbを参考にして、以下のコードをNotebook上で実行していますが、カチャカが10秒静止しているとscanの配信が止まってしまいました。
Notebookのコメントに
とあるので、
client.set_manual_control_enabled(True)
は呼び出していません。Python APIの呼び出し方が意図通りになっていませんか?