如何在Pepper平板上显示QiChat对话输入与输出?(偏好Python实现)
在Pepper平板上实现人机对话显示(Python方案)
当然可以实现!核心思路是利用Pepper的ALTabletService加载自定义网页来展示对话,再通过Python和网页的交互来同步用户输入与机器人回复。下面是具体的实现步骤和代码示例,完全适配你的需求:
实现原理
Pepper的内置平板本质是一个Web浏览器,我们可以:
- 写一个带对话界面的HTML页面,用来展示消息历史和接收用户输入
- 通过Python的
ALTabletService加载这个页面,并用JS调用和回调机制实现Python与网页的数据交互 - 结合对话逻辑(可以是自定义逻辑或QiChat)处理输入,把回复推送到平板上
第一步:准备对话界面HTML
创建一个chat_interface.html文件,包含对话历史区、输入框和发送按钮:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Pepper 对话</title> <style> body { font-family: Arial, sans-serif; margin: 0; padding: 10px; } .chat-box { max-height: 70vh; overflow-y: auto; margin-bottom: 20px; } .message { padding: 8px 12px; margin: 5px 0; border-radius: 15px; max-width: 70%; } .user-msg { background-color: #4CAF50; color: white; margin-left: auto; } .pepper-msg { background-color: #f1f1f1; color: black; margin-right: auto; } .input-area { display: flex; gap: 10px; } #user-input { flex: 1; padding: 10px; border-radius: 20px; border: 1px solid #ddd; } #send-btn { padding: 10px 20px; border-radius: 20px; border: none; background-color: #2196F3; color: white; cursor: pointer; } </style> </head> <body> <div class="chat-box" id="chatHistory"></div> <div class="input-area"> <input type="text" id="user-input" placeholder="输入消息,按回车或点击发送"> <button id="send-btn">发送</button> </div> <script> // 向对话区添加消息 function addMessage(content, isUser) { const chatHistory = document.getElementById('chatHistory'); const msgDiv = document.createElement('div'); msgDiv.className = isUser ? 'message user-msg' : 'message pepper-msg'; msgDiv.textContent = content; chatHistory.appendChild(msgDiv); // 自动滚动到最新消息 chatHistory.scrollTop = chatHistory.scrollHeight; } // 发送用户输入到Python function sendInput() { const input = document.getElementById('user-input'); const text = input.value.trim(); if (text) { // 通过WebKit回调把消息传给Python window.webkit.messageHandlers.chatCallback.postMessage(text); addMessage(text, true); input.value = ''; } } // 绑定发送事件 document.getElementById('send-btn').addEventListener('click', sendInput); document.getElementById('user-input').addEventListener('keypress', e => { if (e.key === 'Enter') sendInput(); }); </script> </body> </html>
第二步:Python核心代码实现
这个脚本会连接Pepper的NAOqi服务,加载网页,处理用户输入并推送回复:
from naoqi import ALProxy import time class PepperChatDisplay: def __init__(self, pepper_ip, port=9559): # 初始化NAOqi服务代理 self.tablet = ALProxy("ALTabletService", pepper_ip, port) self.dialog = ALProxy("ALDialog", pepper_ip, port) # 注册网页回调,接收用户输入 self.tablet.registerWebviewCallback("chatCallback", self.handle_user_input) # 示例回复逻辑(可替换为QiChat或自定义对话系统) self.response_map = { "你好": "嗨!很高兴和你聊天😊", "你叫什么名字": "我叫Pepper,是你的机器人小伙伴~", "再见": "拜拜啦,下次再聊😉" } def load_chat_page(self): # 把HTML文件传到Pepper的本地目录(先通过scp上传:scp chat_interface.html nao@PEPPER_IP:/home/nao/) local_url = "file:///home/nao/chat_interface.html" self.tablet.loadUrl(local_url) time.sleep(2) # 等待页面加载 # 发送欢迎消息 self.send_pepper_message("哈喽!快来和我对话吧") def handle_user_input(self, user_msg): print(f"用户输入: {user_msg}") # 生成回复(这里用简单匹配,可替换为QiChat的对话逻辑) reply = self.response_map.get(user_msg, "抱歉,我还不太懂你说的内容😅") self.send_pepper_message(reply) def send_pepper_message(self, text): # 调用网页的JS函数添加机器人消息 escaped_text = text.replace("'", "\\'") # 转义单引号避免JS语法错误 js_command = f"addMessage('{escaped_text}', false);" self.tablet.executeJS(js_command) def start(self): self.load_chat_page() # 保持运行直到手动中断 try: while True: time.sleep(1) except KeyboardInterrupt: # 清理资源 self.tablet.unregisterWebviewCallback("chatCallback") self.tablet.hideWebview() print("对话已结束") if __name__ == "__main__": PEPPER_IP = "你的Pepper机器人IP地址" # 替换成实际IP chat_display = PepperChatDisplay(PEPPER_IP) chat_display.start()
关键注意事项
- 上传HTML文件到Pepper:用
scp命令把chat_interface.html传到Pepper的/home/nao/目录下(需要知道Pepper的nao用户密码) - 平板连接检查:确保Pepper的平板已开启,可通过
self.tablet.isTabletConnected()验证 - 扩展对话逻辑:如果要使用QiChat,只需把
handle_user_input里的回复逻辑替换为ALDialog的相关调用,加载你的QiChat主题并获取回复 - 特殊字符处理:消息里的单引号需要转义,避免JS执行出错
内容的提问来源于stack exchange,提问作者rajput
相关产品推荐
相关产品推荐

