由通义千问驱动的人形机器人具身智能Multi-Agent系统

本文涉及的产品
视觉智能开放平台,图像资源包5000点
NLP自然语言处理_高级版,每接口累计50万次
视觉智能开放平台,分割抠图1万点
简介: 申昊科技人形机器人小昊,集成通义千问多模态大模型的具身智能系统,旨在讲解销售、迎宾表演等场景。机器人通过语音、动作等方式与用户互动,利用云端大语言模型处理自然语言,结合视觉、听觉等多模态感知技术,实现流畅的人机对话、目标追踪、展厅讲解等功能。

概述

本发明旨在提供一种将多模态大模型集成到机器人中的方法和系统,从而赋予机器人更高水平的具身智能,并在展厅场景落地应用。具体包括以下几个方面:

1. 人机交互:通过语音唤醒、触屏开启对话或执行动作,使用语音活性检测判断录音结束,使用语音识别模型将用户语音转为文字输入大模型。最终将大模型输出转为语音播放,并触发对应动作,使机器人与用户实现流畅交互。

2. 大语言模型集成:将云端的百炼大语言模型(通义千问)集成至具身智能系统中,与控制算法控制的机械臂、导航算法控制的轮式底盘一起形成多智能体系统。能够理解自然语言输入,并生成适应上下文的语言输出,与用户进行多轮对话并判断出复杂的任务决策。

3. 多模态感知:通过结合机器人传感器数据(RGB-D摄像头、麦克风、定位),使大语言模型和视觉语言模型能够基于图片、语音、文字等模态信息感知和理解环境信息。

4. 记忆与决策模块:基于包括对话、动作、定位记录的短期记忆,和Dashvector向量数据库构成的长期记忆,使机器人能够根据用户指令和记忆做出行动决策。多智能体系统通过工具调用能力,调用身体部件实现运动、移动、语言输出等。

详述

1. 具身智能系统

image.png

(1) 语音唤醒

该节点负责响应麦克风内嵌的关键词监测系统的输出消息,通过ROS通信框架发送至决策引擎节点。决策引擎收到消息后杀死上一段对话进程,开启新的对话进程;或发送消息给机械臂控制节点触发动作。实现的功能包括启动对话录音、打断对话并立即开启新对话录音、启动动作、启动动作。

import subprocess
import rospy
from std_msgs.msg import String, Int32, Int8

# publish mesage to the LLM
def llm_pub(raw_prompt):
    global cloud_pub
    message = String()
    message.data = raw_prompt
    cloud_pub.publish(message)
    rate.sleep()


# stop the dialog process
def terminate():
    # kill all aplay sound
    subprocess.run(['pkill', '-9', 'aplay'])
    # kill TTS
    llm_pub('STOP')
    rate.sleep()


########################################################################
# ROS subscriber node
########################################################################
def wake_callback(ros_msg) -> None:
    """
    Callback function triggered upon a wake-up signal. Initiates or restarts the dialog process.

    Args:
    - msg (Any): The message containing wake-up signal information.
    """
    # start a new dialog
    global arm_pub, rate

    # wave hands and start conversation
    if ros_msg.data == 3:
        # stop the dialog
        terminate()
        # wave
        send_msg = Int8()
        send_msg.data = 4
        arm_pub.publish(send_msg)
        rate.sleep()
        rospy.loginfo(f"/arm_control 4 %s" % rospy.get_time())
        # play the greeting sound
        subprocess.run(["aplay", f"cozy_voice/hello.wav"])

    # perform taichi
    if ros_msg.data == 4:
        # stop all sound
        terminate()
        # do taichi
        send_msg = Int8()
        send_msg.data = 3
        arm_pub.publish(send_msg)
        rate.sleep()
        # play music
        subprocess.Popen(['aplay', 'cozy_voice/taiji.wav'])
        llm_pub('arm_control:3')


def main():
    # Initialize a ROS node with the name 'wake_subscriber'
    rospy.init_node('wake_subscriber')
    # Subscribe to the 'wake' topic, expecting messages of type Int32, and specify the callback function
    rospy.Subscriber('wake', Int32, wake_callback)
    # set up publishers for LLM and arms
    global cloud_pub, arm_pub, rate
    cloud_pub = rospy.Publisher('/cloud_llm', String, queue_size=10)
    arm_pub = rospy.Publisher('/arm_control', Int8, queue_size=10)
    rate = rospy.Rate(10)
    # The spin() function keeps Python from exiting until this ROS node is stopped
    rospy.spin()


if __name__ == '__main__':
    main()

(2) 触屏输入

该节点展示由图片初始消息引导用户唤醒对话,或引导用户点击屏幕按钮输入常见问题,并将文字输入决策引擎由大模型回答。触屏界面同时负责展示用户与大模型的文字输出,便于用户在嘈杂环境中辨认大模型输出内容。

(3) 语音识别

该节点在唤醒开启对话录音后,通过语音活性检测(VAD)判断存在人类声音时启动录音。如果人声消失,则停止录音,并由语音识别模型Paraformer将音频转换为文字。

import numpy as np
import pyaudio
from vad import VoiceActivityDetection
import subprocess
import collections
from array import array
from random import randint
import sys
import signal
import time
import torch
import urllib
from bs4 import BeautifulSoup
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
import rospy
from std_msgs.msg import String, Int8
from record import listen
import os

########################################################################
# initialization
########################################################################
vad = VoiceActivityDetection()
# Global variables to manage recording state
recording_thread = None

########################################################################
# recording audio
########################################################################


# Main function to record
def record():
    audio = listen()
    if audio:
        subprocess.run(["aplay", "cozy_voice/think.wav"])
        start = time.time()
        raw_prompt = paraformer(audio, hotword=hotword)[0]['text']
        end = time.time()
        print('Time: ' + str(end - start))
        print(raw_prompt)
        if raw_prompt != '':
            llm_pub('llm:' + raw_prompt)


# stop the dialog process
def terminate():
    # kill all aplay sound
    subprocess.run(['killall', 'aplay'])
    # kill TTS
    llm_pub('STOP')
    rate.sleep()

# publish prompt
def pub_prompt(msg, raw_prompt):
    global cloud_pub
    cloud_pub.publish(msg)
    rate.sleep()


# publish ros message to llm
def llm_pub(msg):
    global cloud_pub, head_pub
    # publish message to llm
    message = String()
    message.data = msg
    cloud_pub.publish(message)
    # publish message to head to nod
    nod = Int8()
    nod.data = 1
    head_pub.publish(nod)
    rate.sleep()


def main():
    # Initialize a ROS node with the name 'wake_subscriber'
    rospy.init_node('mic')
    # Initialize publishers for LLM
    global cloud_pub
    rate = rospy.Rate(10)
    print('START')
    # keep listening
    while True:
        try:
            record()
        except Exception as e:
            print(f"Error encountered: {e}")
            pass


if __name__ == '__main__':
    main()

(4) 决策引擎

该节点由大语言模型(Qwen)和视觉语言模型(Qwen-VL)驱动,结合短期记忆与长期记忆对于用户的指令做出决策、执行任务。主要模块包括:

短期记忆  

申昊科技人形机器人小昊-动作规划演示视频

- 动作记忆:记录动作类型以及触发时间,从而规划一系列复杂动作的顺序。  

- 对话记忆:记录多轮对话的上下文,从而保持对话的连贯性和理解深度。  

- 定位记忆:用于记录机器人当前的点位以获取对应位置的上下文信息,从而根据环境信息与用户交互。

长期记忆

申昊科技人形机器人小昊-识人聊天演示视频

- 在向量数据库中储存企业知识、行业知识等信息。通过用户指令的文本向量检索相关信息,并将检索结果作为上下文输入大模型生成对应回答。实现对专业知识的问答能力。  

- 在向量数据库中检索人脸图片向量,返回人员信息的检索结果,实现大模型与对话人的定制话题问答,模拟人类认识人的能力。

from dashscope import TextEmbedding
from dashscope.api_entities.dashscope_response import Role
from dashvector import Client

########################################################################
# RAG
########################################################################
# generate text embedding
def generate_embeddings(doc):
    rsp = TextEmbedding.call(model=TextEmbedding.Models.text_embedding_v2, input=doc)
    embeddings = [record['embedding'] for record in rsp.output['embeddings']]
    return embeddings if isinstance(doc, list) else embeddings[0]


# search for relevant text in the vector database
def search_relevant_doc(question, collection_name, topk):
    client = Client(api_key=os.getenv('DASHVECTOR_API_KEY'), endpoint=os.getenv('DASHVECTOR_ENDPOINT'))
    collection = client.get(collection_name)
    rsp = collection.query(question, output_fields=['raw'], topk=topk)
    # for face recognition, select the closest result
    if topk == 1:
        result = rsp.output[0]
        raw = rsp.output[0].fields['raw']
        score = result.score
        print(score)
        if score > 1.1:
            print(raw)
            return False
        else:
            return raw
    # for RAG, select the closest k results
    else:
        result = [raw.fields['raw'] for raw in rsp.output]
        return ';'.join(result)


# RAG
def rag(question, collection_name, topk):
    # search relevant document in dashvector collection
    embedding = generate_embeddings(question)
    context = search_relevant_doc(embedding, collection_name, topk)
    print(context)
    prompt = f'请基于```内的内容回答问题。```{context}```我的问题是:{question}。'
    return prompt

- 大语言模型: 调用云端百炼的大模型通义千问生成热启动的实例,输入用户指令,并传回流式回答文字,并输入云端的语音合成(TTS)模型CosyVoice生成语音。如果需要调用工具,如视觉、机械臂与导航,大语言模型会生成与任务相匹配的特殊符号。决策引擎识别到特殊符号后会通过ROS通信框架发送至对应节点执行任务。

from random import randint
from dashscope import Generation
from dashscope.api_entities.dashscope_response import Role

# chat with LLM
def chat(prompt):
    msg = memory['messages']
    msg.append({'role': Role.USER, 'content': prompt})
    # if the length of message exceeds 3k, pop the oldest round
    msg = check_len(msg)
    # Use language generation model to generate a response
    responses = Generation.call(
        model='qwen-plus',
        messages=msg,
        seed=randint(1, 100),
        enable_search=True,
        result_format='message',
        stream=True,
        incremental_output=True
    )
    # Process the generated response
    full_content = stream_tts(responses, prompt)
    # load the reply to the message
    msg.append({'role': Role.ASSISTANT, 'content': full_content})
    memory['messages'] = msg

- 视觉语言模型:当大语言模型判断需要调用视觉执行任务时,决策引擎会调用相机拍摄彩图感知物理世界环境,并连同照片和用户指令一起输入视觉语言模型,与大语言模型类似地传回流式回答。

from dashscope import MultiModalConversation
from dashscope.api_entities.dashscope_response import Role
import numpy as np
import mmap

# initialize camera
fd = os.open('/dev/shm/camera_7', os.O_RDONLY)
mmap_data = mmap.mmap(fd, length=640 * 480 * 3, access=mmap.ACCESS_READ)

def snap(photo_name):
    frame = np.frombuffer(mmap_data, dtype=np.uint8).reshape((480, 640, 3))
    cv2.imwrite(photo_name, frame)
    subprocess.run(["aplay", "cozy_voice/snap.wav"])

# chat with vision language model
def vl_chat(prompt):
    # take a photo
    photo_name = '/home/robot/chatbot/image/color_image.png'
    snap(photo_name)
    # load the prompt to the message
    msg = memory['vl']
    text_msg = memory['messages']
    text_msg.append({'role': Role.USER, 'content': prompt})
    msg.append({'role': Role.USER, 'content': [{'image': 'file://' + photo_name},
                                               {'text': '这张照片显示你刚拍摄的眼前的真实环境。请你观察照片回答问题:' + prompt}]})
    # get the reply from tongyi vl
    responses = MultiModalConversation.call(model='qwen-vl-max', messages=msg, stream=True, incremental_output=True)
    full_content = stream_tts(responses, prompt, vl=True)
    # load the reply to the message
    msg.append({'role': Role.ASSISTANT, 'content': [{'text': full_content}]})
    # load the reply to text message
    text_msg.append({'role': Role.ASSISTANT, 'content': full_content})
    # check if the length of text messages exceeds 5k
    text_msg = check_len(text_msg)
    msg = check_len(msg)
    memory['vl'] = msg
    memory['messages'] = text_msg
    # end the process
    terminate(llm=False, vl=True)

- 大模型+工具调用实现动作:

  • 当大语言模型判断需要移动寻找物品时,会使用深度相机对目标物体测距,计算旋转角度。并将前行距离与角度通过ROS通信框架发送至主控算法,控制轮式底盘移动至目标处。
  • 当大语言判断需要执行机械臂动作时,发送相应指令至机械臂控制算法以触发特定动作。
  • 当大语言模型判断需要移动到地图上的特定点位时,会发送点位消息给导航系统,导航系统将测算自由路径并移动至点位。到达点位后,决策引擎接收导航系统的确认消息,并将该点位的环境信息以文字形式发送给大语言模型,使其能够感知周围环境。

2. 实现功能

迎宾表演

用户说出问候唤醒词,触发机器人挥手动作,并回复问候词,同时开启对话。用户说出表演唤醒词,触发机器人太极动作及音乐播放,开启娱乐表演。

申昊科技人形机器人小昊-太极表演

对话问答

点击触屏常见问题按钮或直接问询,触发机器人对话。由大模型驱动的具身智能系统使用语音、动作回复用户。

申昊科技人形机器人小昊-展会问答

目标追踪

用户下发指令要求机器人寻找物品时,机器人使用大语言模型理解任务,确认需要寻找的物品。决策引擎使用相机拍照,并使用视觉语言模型对物品定位,返回物品在照片中的像素坐标。决策引擎调用深度相机计算移动至目标物品的角度和距离,驱动轮式底盘到目标处。

申昊科技人形机器人小昊-目标追踪

展厅讲解

用户下发指令要求机器人移动至特定展区时,机器人使用大语言模型理解需要前往的点位,将点位发消息给导航系统。导航系统规划自由路径,移动至目标点位。决策引擎在收到抵达点位的消息后,系统发送介绍词自动给大模型作为上下文,实现与用户的对答。

申昊科技人形机器人小昊-展厅讲解

相关实践学习
使用ROS创建VPC和VSwitch
本场景主要介绍如何利用阿里云资源编排服务,定义资源编排模板,实现自动化创建阿里云专有网络和交换机。
阿里云资源编排ROS使用教程
资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、配置等,并自动完成所有资源的创建和配置,以达到自动化部署、运维等目的。编排模板同时也是一种标准化的资源和应用交付方式,并且可以随时编辑修改,使基础设施即代码(Infrastructure as Code)成为可能。 产品详情:https://www.aliyun.com/product/ros/
目录
相关文章
|
1月前
|
API 数据库 决策智能
基于百炼平台qwen-max的api 打造一套 检索增强 图谱增强 智能工具调用决策的智能体
本文介绍了一种基于阿里云百炼平台的`qwen-max` API构建的智能体方案,该方案集成了检索增强、图谱增强及智能工具调用决策三大模块,旨在通过结合外部数据源、知识图谱和自动化决策提高智能回答的准确性和丰富度。通过具体代码示例展示了如何实现这些功能,最终形成一个能灵活应对多种查询需求的智能系统。
173 11
|
1月前
|
自然语言处理 NoSQL API
基于百炼平台qwen-max的api 打造一套 检索增强 图谱增强 基于指令的智能工具调用决策 智能体
基于百炼平台的 `qwen-max` API,设计了一套融合检索增强、图谱增强及指令驱动的智能工具调用决策系统。该系统通过解析用户指令,智能选择调用检索、图谱推理或模型生成等工具,以提高问题回答的准确性和丰富性。系统设计包括指令解析、工具调用决策、检索增强、图谱增强等模块,旨在通过多种技术手段综合提升智能体的能力。
178 5
|
1月前
|
JSON 自然语言处理 Serverless
基于阿里云通义千问开发智能写作助手
现代办公中,撰写邮件、会议记录、报告等任务耗费大量时间。一个智能写作助手能显著提升效率,帮助用户快速生成高质量的文本内容。阿里云通义千问作为阿里巴巴推出的强大大语言模型(LLM),具备出色的自然语言理解与生成能力,非常适合用于开发智能写作工具。本博客将介绍如何基于通义千问构建一个智能写作助手,实现高效的内容生成和编辑功能。
99 2
|
2月前
|
人工智能 自然语言处理 算法
具身智能高校实训解决方案 ----从AI大模型+机器人到通用具身智能
在具身智能的发展历程中,AI 大模型的出现成为了关键的推动力量。高校作为培养未来科技人才的摇篮,需要紧跟这一前沿趋势,开展具身智能实训课程。通过将 AI 大模型与具备 3D 视觉的机器人相结合,为学生搭建一个实践平台。
227 64
|
27天前
|
机器学习/深度学习 人工智能 算法
人工智能与机器人的结合:智能化世界的未来
人工智能与机器人的结合:智能化世界的未来
179 32
|
3天前
|
人工智能 前端开发 搜索推荐
研发智能化新篇章:通义灵码企业级方案与实践
《研发智能化新篇章:通义灵码企业级方案与实践》简介: 本文探讨了通义灵码在提升企业研发效能方面的核心影响和实际应用。首先分析了AIGC(人工智能生成内容)如何从个体效率、协同效率和持续化三个维度提升企业生产力。接着,通过亚信科技的实际案例,展示了其在不同场景下的智能化实践,包括智能编程助手的选型、部署及效果评估。最后,展望了未来研发智能化的发展方向,提出构建覆盖软件开发全流程的智能体工具集,以进一步降低使用门槛并提升整体效率。文中强调了通义灵码在代码补全、知识问答等方面的应用成效,并指出了企业在落地过程中面临的挑战及应对策略。
|
23天前
|
传感器 算法 机器人
聚焦视听触感官协同配合的具身精细操纵,人大胡迪团队领衔探索机器人模态时变性挑战
中国人民大学胡迪团队提出MS-Bot方法,通过阶段性引导的动态多感官融合,使机器人能像人类一样灵活运用视觉、听觉和触觉完成复杂任务。实验表明,该方法提高了操作准确性和效率,但仍面临数据依赖、计算复杂度和泛化能力等挑战。论文链接:https://arxiv.org/abs/2408.01366v2
63 21
|
30天前
|
人工智能 算法 机器人
EMMA-X:新加坡科技设计大学推出具身多模态动作模型,使夹爪机器人具备空间推理和任务规划能力
EMMA-X是由新加坡科技设计大学推出的具身多模态动作模型,具备70亿参数,通过在链式思维推理数据上微调OpenVLA创建。该模型结合层次化的具身数据集,增强空间推理和任务规划能力。
86 3
EMMA-X:新加坡科技设计大学推出具身多模态动作模型,使夹爪机器人具备空间推理和任务规划能力
|
10天前
|
数据采集 监控 数据可视化
优锘科技携手逐际动力,共创数字孪生与具身智能机器人新未来
近日,优锘科技与逐际动力正式宣布达成战略合作,双方将在业务和技术领域展开深度协作,共同探索数字孪生与具身智能机器人的融合应用。这一合作无疑将为智能科技领域注入全新动力,推动行业智能化转型迈向更高水平。
|
1月前
|
人工智能 自然语言处理 机器人
机器人迈向ChatGPT时刻!清华团队首次发现具身智能Scaling Laws
清华大学研究团队在机器人操作领域发现了数据规模定律,通过大规模数据训练,机器人策略的泛化性能显著提升。研究揭示了环境和对象多样性的重要性,提出了高效的數據收集策略,使机器人在新环境中成功率达到约90%。这一发现有望推动机器人技术的发展,实现更广泛的应用。
78 26