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

[naoqi_apps] add naoqi_tablet.launch #96

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions naoqi_apps/launch/tablet.launch
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
<launch>
<!--
This pushes the local PYTHONPATH into the launch file, so that the NaoQI API is found.
You need to add the Nao's API dir to your PYTHONPATH so that the modules are found.
-->
<env name="PYTHONPATH" value="$(env PYTHONPATH)" />

<arg name="nao_ip" default="$(optenv NAO_IP 127.0.0.1)" />
<arg name="nao_port" default="$(optenv NAO_PORT 9559)" />

<node pkg="naoqi_apps" type="naoqi_tablet.py" name="naoqi_tablet" required="false" args="--pip=$(arg nao_ip) --pport=$(arg nao_port)" output="screen" />
</launch>
268 changes: 268 additions & 0 deletions naoqi_apps/nodes/naoqi_tablet.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,268 @@
#!/usr/bin/env python

import rospy
import qi
import sys
import time
from naoqi_driver.naoqi_node import NaoqiNode
from std_srvs.srv import (
EmptyResponse,
Empty,
TriggerResponse,
Trigger)
from naoqi_bridge_msgs.srv import (
SetStringResponse,
SetString,
GetStringResponse,
GetString,
ConfigureWifiResponse,
ConfigureWifi)

class NaoqiTablet(NaoqiNode):
def __init__(self):
NaoqiNode.__init__(self, 'naoqi_tablet')
self.connectNaoQi()
self.image_folder = "img/"
self.showImageSrv = rospy.Service("show_image", SetString, self.handleShowImageSrv)
self.showImageNoCacheSrv = rospy.Service("show_image_no_cache", SetString, self.handleShowImageNoCacheSrv)
self.hideImageSrv = rospy.Service("hide_image", Empty, self.handleHideImageSrv)
self.showAppSrv = rospy.Service("show_app", SetString, self.handleShowAppSrv)
self.showWebViewSrv = rospy.Service("show_webview", SetString, self.handleShowWebviewSrv)
self.executeJSSrv = rospy.Service("execute_js", SetString, self.handleExecuteJSSrv)
self.setImagePathSrv = rospy.Service("set_show_image_folder_path", SetString, self.handleSetFolderPathSrv)
self.getImagePathSrv = rospy.Service("get_show_image_folder_path", GetString, self.handleGetFolderPathSrv)
self.configureWifiSrv = rospy.Service("configure_wifi", ConfigureWifi, self.handleConfigureWifiSrv)
self.connectWifiSrv = rospy.Service("connect_wifi", SetString, self.handleConnectWifiSrv)
self.disconnectWifiSrv = rospy.Service("disconnect_wifi", Trigger, self.handleDisconnectWifiSrv)
self.enableWifiSrv = rospy.Service("enable_wifi", Empty, self.handleEnableWifiSrv)
self.disableWifiSrv = rospy.Service("disable_wifi", Empty, self.handleDisableWifiSrv)
self.forgetWifiSrv = rospy.Service("forget_wifi", SetString, self.handleForgetWifiSrv)
self.getWifiStatusSrv = rospy.Service("get_wifi_status", GetString, self.handleGetWifiStatusSrv)
rospy.loginfo("naoqi_tablet initialized")

def connectNaoQi(self):
rospy.loginfo("Connecting to NaoQi at %s:%d", self.pip, self.pport)
self.session = qi.Session()
self.session.connect("tcp://%s:%s" % (self.pip, self.pport))
self.tabletProxy = self.session.service("ALTabletService")
if self.tabletProxy is None:
rospy.logerr("Could not get a proxy to ALTabletService")
rospy.logerr("Please make sure that your robot has a tablet.")
exit(1)

def handleShowImageSrv(self, req):
try:
image_path = "http://198.18.0.1/apps/"+ self.image_folder + str(req.data)
res = SetStringResponse()
if self.tabletProxy.showImage(image_path) == True:
rospy.loginfo("Showing image: " + str(req.data))
res.success = True

else:
rospy.loginfo("Please confirm the file name and " + str(req.data) + " really exists under /home/nao/.local/share/PackageManager/apps/" + self.image_folder + "html.")
res.success = False
return res
except RuntimeError, e:
rospy.logerr("Exception caught:\n%s", e)
return None

def handleShowImageNoCacheSrv(self, req):
try:
image_path = "http://198.18.0.1/apps/"+ self.image_folder + str(req.data)
res = SetStringResponse()
if self.tabletProxy.showImageNoCache(image_path) == True:
rospy.loginfo("Showing image: " + str(req.data))
res.success = True

else:
rospy.loginfo("Please confirm the file name and " + str(req.data) + " really exists under /home/nao/.local/share/PackageManager/apps/" + self.image_folder + "html.")
res.success = False
return res
except RuntimeError, e:
rospy.logerr("Exception caught:\n%s", e)
return None

def handleHideImageSrv(self, req):
try:
self.tabletProxy.hideImage()
rospy.loginfo("Reset image on the tablet")
return EmptyResponse()
except RuntimeError, e:
rospy.logerr("Exception caught:\n%s", e)
return None

def handleShowAppSrv(self, req):
try:
res = SetStringResponse()
res.success = False
if self.tabletProxy.loadApplication(req.data):
if self.tabletProxy.showWebview():
rospy.loginfo("Showing app: " + str(req.data))
res.success = True
else:
rospy.loginfo("Showing webview failed")
else:
rospy.loginfo("Please confirm your app name: " + req.data + "really exists.")
rospy.loginfo("In addtion, be sure that an index.html should be in a html folder in an app folder. (ex: /home/nao/.local/share/PackageManager/apps/<app>/html/index.html)")
return res
except RuntimeError, e:
rospy.logerr("Exception caught:\n%s", e)
return None

def handleShowWebviewSrv(self, req):
try:
res = SetStringResponse()
res.success = False
if self.tabletProxy.showWebview(req.data):
rospy.loginfo("Trying to show web page: " + str(req.data))
rospy.loginfo("If there is nothing appeared, please confirm the url '" + str(req.data) + "' really exists.")
res.success = True
else:
rospy.loginfo("Showing webview failed")
return res
except RuntimeError, e:
rospy.logerr("Exception caught:\n%s", e)
return None

def handleExecuteJSSrv(self, req):
res = SetStringResponse()
res.success = False
try:
# reference: http://doc.aldebaran.com/2-5/naoqi/core/altabletservice-api.html#ALTabletService::executeJS__ssCR
# Display a local web page located in boot-config/html folder
# The ip of the robot from the tablet is 198.18.0.1
self.tabletProxy.showWebview("http://198.18.0.1/apps/boot-config/preloading_dialog.html")

time.sleep(3)

# Javascript script for displaying a prompt
# ALTabletBinding is a javascript binding inject in the web page displayed on the tablet
# script = """
# var name = prompt("Please enter your name", "Harry Pepper");
# ALTabletBinding.raiseEvent(name)
# """
script = req.data

# Don't forget to disconnect the signal at the end
signalID = 0

# function called when the signal onJSEvent is triggered
# by the javascript function ALTabletBinding.raiseEvent(name)
def callback(event):
print "input data:", event
promise.setValue(True)

promise = qi.Promise()

# attach the callback function to onJSEvent signal
signalID = self.tabletProxy.onJSEvent.connect(callback)

# inject and execute the javascript in the current web page displayed
self.tabletProxy.executeJS(script)

try:
promise.future().hasValue(30000)
res.success = True
except RuntimeError:
raise RuntimeError('Timeout: no signal triggered')

except Exception, e:
print "Error was:", e

# Hide the web view
self.tabletProxy.hideWebview()
# disconnect the signal
self.tabletProxy.onJSEvent.disconnect(signalID)
return res

def handleSetFolderPathSrv(self, req):
res = SetStringResponse()
try:
self.image_folder = req.data
if self.image_folder[0]=="/":
self.image_folder = self.image_folder.strip("/")
if self.image_folder[len(self.image_folder)-1] != "/":
self.image_folder += "/"
res.success = True
rospy.loginfo("ALTabletService: ShowImage will show pictures under /home/nao/.local/share/PackageManager/apps/" + self.image_folder + "html/." )
return res
except RuntimeError, e:
rospy.logerr("Exception caught:\n%s", e)
return None

def handleGetFolderPathSrv(self, req):
try:
res = GetStringResponse()
res.data = "/home/nao/.local/share/PackageManager/apps/" + str(self.image_folder) + "html/"
rospy.loginfo("ALTabletService: ShowImage will show pictures under /home/nao/.local/share/PackageManager/apps/" + self.image_folder + "html.")
return res
except RuntimeError, e:
rospy.logerr("Exception caught:\n%s", e)
return None

def handleConfigureWifiSrv(self, req):
try:
res = ConfigureWifiResponse()
res.success = self.tabletProxy.configureWifi(req.security, req.ssid, req.key)
return res
except RuntimeError, e:
rospy.logerr("Exception caught:\n%s", e)
return None

def handleConnectWifiSrv(self, req):
try:
res = SetStringResponse()
res.success = self.tabletProxy.connectWifi(req.data)
return res
except RuntimeError, e:
rospy.logerr("Exception caught:\n%s", e)
return None

def handleDisconnectWifiSrv(self, req):
try:
res = TriggerResponse()
res.success = self.tabletProxy.disconnectWifi()
return res
except RuntimeError, e:
rospy.logerr("Exception caught:\n%s", e)
return None

def handleEnableWifiSrv(self, req):
try:
res = EmptyResponse()
self.tabletProxy.enableWifi()
return res
except RuntimeError, e:
rospy.logerr("Exception caught:\n%s", e)
return None

def handleDisableWifiSrv(self, req):
try:
res = EmptyResponse()
self.tabletProxy.disableWifi()
return res
except RuntimeError, e:
rospy.logerr("Exception caught:\n%s", e)
return None

def handleForgetWifiSrv(self, req):
try:
res = SetStringResponse()
res.success = self.tabletProxy.forgetWifi(req.data)
return res
except RuntimeError, e:
rospy.logerr("Exception caught:\n%s", e)
return None

def handleGetWifiStatusSrv(self, req):
try:
res = GetStringResponse()
res.data = self.tabletProxy.getWifiStatus()
return res
except RuntimeError, e:
rospy.logerr("Exception caught:\n%s", e)
return None

if __name__ == '__main__':
tablet = NaoqiTablet()
rospy.spin()