You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pepper平板上显示QiChat对话输入与输出?(偏好Python实现)

在Pepper平板上实现人机对话显示(Python方案)

当然可以实现!核心思路是利用Pepper的ALTabletService加载自定义网页来展示对话,再通过Python和网页的交互来同步用户输入与机器人回复。下面是具体的实现步骤和代码示例,完全适配你的需求:

实现原理

Pepper的内置平板本质是一个Web浏览器,我们可以:

  1. 写一个带对话界面的HTML页面,用来展示消息历史和接收用户输入
  2. 通过Python的ALTabletService加载这个页面,并用JS调用和回调机制实现Python与网页的数据交互
  3. 结合对话逻辑(可以是自定义逻辑或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()

关键注意事项

  1. 上传HTML文件到Pepper:用scp命令把chat_interface.html传到Pepper的/home/nao/目录下(需要知道Pepper的nao用户密码)
  2. 平板连接检查:确保Pepper的平板已开启,可通过self.tablet.isTabletConnected()验证
  3. 扩展对话逻辑:如果要使用QiChat,只需把handle_user_input里的回复逻辑替换为ALDialog的相关调用,加载你的QiChat主题并获取回复
  4. 特殊字符处理:消息里的单引号需要转义,避免JS执行出错

内容的提问来源于stack exchange,提问作者rajput

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:43:32