我想在我的应用程序中停止并通过ALTactileGesture
启动ServiceManager
服务。我正在使用Choregraphe
和python盒子。我尝试了不同的选项来启动ServiceManager
,但没有一个可行。有没有办法做到这一点?
编辑:
我已经尝试过self.sm = session.service('ServiceManager')
但没有奏效。这个想法是在应用程序启动后立即停止ALTactileGesture
:
(1)ServiceManager.stopService('ALTactileGesture')
(见this)
并在应用程序结束前启动/重启ALTactileGesture
:
(2)ServiceManager.startService('ALTactileGesture')
我的问题是如何到达ServiceManager
所以我可以使用(1)和(2)?
你必须明白,“服务”这个词在NAOqi中实际上意味着两个不同的东西。见an explanation here:
NAOqi服务(也称为“模块”),它公开API并注册到ServiceDirectory。你可以用qicli打电话给他们,订阅他们的信号等。
systemd服务,它是打包在应用程序包中的独立可执行文件,在其带有标记的清单中声明。这些由ALServiceManager管理,他们可以启动和停止它们(它们将拥有自己的进程)。为清楚起见,这些文档中称为“可执行文件”。
两者之间的混淆是因为一个共同的模式是编写一个可执行文件,其唯一目的是运行NAOqi服务,有时用同一名称识别两者(例如,两者都被称为“ALFuchsiaBallTracker”)。
你的问题是NAOqi服务ALTactileGesture
是由在ALTactileGesture-serv
ID下注册的可执行文件运行的。所以你需要这样做
ALServiceManager.stop("ALTactileGesture-serv")
(我刚试过它,它工作正常)
(编辑)顺便说一句,我不确定实际上停止和启动ALTactileGesture是做你想做的事情的最佳方式(对我来说似乎有些笨拙),但是如果你想这样做的话,这是如何:)
只需在机器人shell(旧式代理连接)中尝试此操作:
$ python
import naoqi
s = naoqi.ALProxy("ALServiceManager", "localhost", 9559 )
s.stopService('ALTactileGesture')
>>> False
s.startService('ALTactileGesture')
>>> False # (a bit weird, but ...)
所以我认为它不是完全有效,但至少你可以按要求连接到ServiceManager ......