pf-robotics / kachaka-api

スマートファニチャープラットフォーム「カチャカ」API
https://kachaka.zendesk.com/hc/ja/articles/7660222791183-%E3%82%AB%E3%83%81%E3%83%A3%E3%82%ABAPI
Apache License 2.0
85 stars 24 forks source link

カチャカが静止していてもscan配信を継続したい #103

Closed atinfinity closed 1 month ago

atinfinity commented 2 months ago

https://github.com/pf-robotics/kachaka-api/issues/100#issuecomment-2217232092で質問した件です。https://github.com/pf-robotics/kachaka-api/issues/100#issuecomment-2217399096

scanトピックを抑制しない方法ですが、 https://github.com/pf-robotics/kachaka-api/blob/main/python/demos/get_laser_scan.ipynb に記載されているactivatorを使うとトピックが止まらないようになります。

ros2側にinterfaceを現状では出していないので、kachaka-apiと併用してお使いください。

というご回答を受けたので、python/demos/get_laser_scan.ipynbを参考にして、以下のコードをNotebook上で実行していますが、カチャカが10秒静止しているとscanの配信が止まってしまいました。

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()

Notebookのコメントに

上記の方法は、手動操縦モードをONにすることでLiDARを動かしており、カチャカが動かずしばらく経つとスキャンが止まります。

とあるので、client.set_manual_control_enabled(True)は呼び出していません。Python APIの呼び出し方が意図通りになっていませんか?

atinfinity commented 1 month ago

@terakoji-pfr 本件についてご見解頂けないでしょうか?

terakoji-pfr commented 1 month ago

@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)
kmurase-pfr commented 1 month ago

@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")
atinfinity commented 1 month ago

@terakoji-pfr ありがとうございます。動作確認致します。

atinfinity commented 1 month ago

@terakoji-pfr 頂いたコードで意図通りの挙動(=カチャカがしばらく静止していてもscanキャプチャが継続される)になること確認致しました。