kochigami/naoqi_bridge

[naoqi_apps/naoqi_tablet.py] handleExecuteJSSrvの書き方についてのメモ

Opened this issue · 0 comments

参考:http://doc.aldebaran.com/2-5/naoqi/core/altabletservice-api.html#ALTabletService::executeJS__ssCR
該当コミット:c28b727

roslaunch naoqi_apps tablet.launch
rosservice call /execute_js "data: 'var name = prompt(\"Please enter your name\", \"Harry Pepper\"); ALTabletBinding.raiseEvent(name)'"
と打つと,
タブレット上にローディング画面が少し出て,タブレットから名前を入力できるようになっている(デフォルトはHarry Pepper)
hopと打つと,

(サービスコールした端末)
success: True

(launchを上げている端末)
input data: hop

と表示される

気をつけないといけないこと

ALTabletBinding.raiseEvent(name)のように,必ず何か実行した後Eventを起こすこと.そうしないとサービスコールが正常に終了しない.

はまったところ

1. " " の与え方

rosservice call /execute_js "data: 'var name = prompt("Please enter your name", "Harry Pepper"); ALTabletBinding.raiseEvent(name)'" 

Traceback (most recent call last):
  File "/opt/ros/kinetic/bin/rosservice", line 35, in <module>
    rosservice.rosservicemain()
  File "/opt/ros/kinetic/lib/python2.7/dist-packages/rosservice/__init__.py", line 746, in rosservicemain
    _rosservice_cmd_call(argv)
  File "/opt/ros/kinetic/lib/python2.7/dist-packages/rosservice/__init__.py", line 607, in _rosservice_cmd_call
    service_args.append(yaml.load(arg))
  File "/home/kanae/.local/lib/python2.7/site-packages/yaml/__init__.py", line 71, in load
    return loader.get_single_data()
  File "/home/kanae/.local/lib/python2.7/site-packages/yaml/constructor.py", line 37, in get_single_data
    node = self.get_single_node()
  File "/home/kanae/.local/lib/python2.7/site-packages/yaml/composer.py", line 36, in get_single_node
    document = self.compose_document()
  File "/home/kanae/.local/lib/python2.7/site-packages/yaml/composer.py", line 55, in compose_document
    node = self.compose_node(None, None)
  File "/home/kanae/.local/lib/python2.7/site-packages/yaml/composer.py", line 84, in compose_node
    node = self.compose_mapping_node(anchor)
  File "/home/kanae/.local/lib/python2.7/site-packages/yaml/composer.py", line 133, in compose_mapping_node
    item_value = self.compose_node(node, item_key)
  File "/home/kanae/.local/lib/python2.7/site-packages/yaml/composer.py", line 64, in compose_node
    if self.check_event(AliasEvent):
  File "/home/kanae/.local/lib/python2.7/site-packages/yaml/parser.py", line 98, in check_event
    self.current_event = self.state()
  File "/home/kanae/.local/lib/python2.7/site-packages/yaml/parser.py", line 449, in parse_block_mapping_value
    if not self.check_token(KeyToken, ValueToken, BlockEndToken):
  File "/home/kanae/.local/lib/python2.7/site-packages/yaml/scanner.py", line 116, in check_token
    self.fetch_more_tokens()
  File "/home/kanae/.local/lib/python2.7/site-packages/yaml/scanner.py", line 244, in fetch_more_tokens
    return self.fetch_single()
  File "/home/kanae/.local/lib/python2.7/site-packages/yaml/scanner.py", line 653, in fetch_single
    self.fetch_flow_scalar(style='\'')
  File "/home/kanae/.local/lib/python2.7/site-packages/yaml/scanner.py", line 667, in fetch_flow_scalar
    self.tokens.append(self.scan_flow_scalar(style))
  File "/home/kanae/.local/lib/python2.7/site-packages/yaml/scanner.py", line 1158, in scan_flow_scalar
    chunks.extend(self.scan_flow_scalar_spaces(double, start_mark))
  File "/home/kanae/.local/lib/python2.7/site-packages/yaml/scanner.py", line 1245, in scan_flow_scalar_spaces
    "found unexpected end of stream", self.get_mark())
yaml.scanner.ScannerError: while scanning a quoted scalar
  in "<string>", line 1, column 7:
    data: 'var name = prompt(Please
          ^
found unexpected end of stream
  in "<string>", line 1, column 32:
    data: 'var name = prompt(Please
                                   ^

=> "を認識してもらうために,\"と書く.

2. qiを使うこと

rosservice call /execute_js "data: 'var name = prompt("Please-enter-your-name", "Harry-Pepper"); ALTabletBinding.raiseEvent(name)'" 
ERROR: service [/execute_js] responded with an error: error processing request: 'MethodMissing' object has no attribute 'disconnect'

=>
http://doc.aldebaran.com/2-5/naoqi/core/altabletservice-api.html#ALTabletService::onJSEvent__qi::Signal:ss:
によると,
onJSEvent.disconnect は qiを使っている.なので,qiでsessionをつくるように変えた.(他のnodeも変えていった方がいいかも.)

#self.tabletProxy = self.get_proxy("ALTabletService")                                                                                                             
self.session = qi.Session()