回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

行空板M10扩展板——小智AI语音骑行导航 简单

头像 云天 2025.06.30 21 1

【项目背景】

随着智能硬件技术的飞速发展,人们对于便捷、高效出行的需求日益增长。在骑行出行场景中,传统的导航设备往往存在操作复杂、信息展示不直观等问题,给骑行者带来诸多不便。为了改善这一现状,我们提出了一个创新的解决方案:利用行空板K10和行空板M10搭建一个智能骑行导航系统,通过语音交互实现路径规划和导航播报,为骑行者提供更加轻松、愉悦的出行体验。

行空板K10和行空板M10是两款功能强大的智能硬件设备,具备丰富的接口和强大的处理能力。小智AI是一款智能语音助手,能够理解自然语言指令并执行相应的操作。高德地图API则提供了丰富的地图数据和路径规划服务,能够为骑行者提供精准的导航信息。将这些技术和设备相结合,我们能够打造出一个高效、智能的骑行导航系统,满足骑行者在不同场景下的出行需求。

【项目设计】

1.硬件架构设计

(1)行空板K10:安装小智AI,作为语音交互的前端设备。骑行者可以通过语音指令向小智AI发起路径规划请求,小智AI将请求发送给行空板M10上的Mcp服务,并将导航结果以语音形式播报给骑行者。

(2)行空板M10:运行Mcp服务,作为后端处理中心。它负责接收行空板K10发送的路径规划请求,调用高德地图API获取规划路径,并将结果返回给行空板K10上的小智AI进行播报。

2.软件架构设计

(1)小智AI:作为语音交互的核心模块,负责接收骑行者的语音指令,解析指令内容,并将其转换为路径规划请求发送给Mcp服务。同时,它还负责将Mcp服务返回的导航结果以语音形式播报给骑行者。

(2)Mcp服务:作为后端处理模块,运行在行空板M10上。它通过定义的接口接收行空板K10发送的路径规划请求,调用高德地图API获取规划路径,并将路径信息进行处理和封装后返回给小智AI。

(3)高德地图API:作为地图数据和路径规划服务的提供者,Mcp服务通过调用其提供的接口,获取起点和终点的经纬度信息,以及从起点到终点的详细路径规划结果,包括总距离、总耗时和每一步的导航指令等。

3.功能设计

(1)语音交互功能:骑行者可以通过语音指令与小智AI进行交互,如“小智,从我家到公司怎么走?”小智AI能够准确识别和理解指令,并将其转换为路径规划请求发送给Mcp服务。

(2)路径规划功能:Mcp服务接收小智AI发送的路径规划请求后,调用高德地图API获取起点和终点的经纬度信息,并根据这些信息规划出最优的骑行路径。路径规划结果包括总距离、总耗时以及每一步的导航指令等详细信息。

(3)导航播报功能:小智AI将Mcp服务返回的路径规划结果以语音形式播报给骑行者,骑行者可以根据播报的导航指令进行骑行,无需手动操作导航设备,提高了骑行的安全性和便捷性。

4.数据流程设计

(1)骑行者通过语音指令向行空板K10上的小智AI发起路径规划请求。

(2)小智AI解析语音指令,提取起点和终点信息,并将请求发送给行空板M10上的Mcp服务。

(3)Mcp服务接收请求后,调用高德地图API的地理编码接口,将起点和终点的地址转换为经纬度信息。

(4)Mcp服务再次调用高德地图API的骑行路径规划接口,根据起点和终点的经纬度信息获取详细的路径规划结果。

(5)Mcp服务对路径规划结果进行处理和封装,提取关键信息,如总距离、总耗时、每一步的导航指令等。

(6)Mcp服务将处理后的路径规划结果返回给行空板K10上的小智AI。

(7)小智AI将路径规划结果以语音形式播报给骑行者,骑行者根据播报的导航指令进行骑行。

【高德地图】

注册高德地图开放平台,获取API。https://lbs.amap.com/

image.png

【小智AI】

配置小智AI角色,获取Mcp接入点。

image.png
image.png

【代码编写】

代码
# server.py
from mcp.server.fastmcp import FastMCP
import sys
import logging

logger = logging.getLogger('navigation')

# Fix UTF-8 encoding for Windows console
if sys.platform == 'win32':
    sys.stderr.reconfigure(encoding='utf-8')
    sys.stdout.reconfigure(encoding='utf-8')

import requests,json
address_origin=""
address_destination=""
def get_geocode(address, api_key):
    url = f"https://restapi.amap.com/v3/geocode/geo?address={address}&key={api_key}"
    response = requests.get(url)
    if response.status_code == 200:
        return response.json()
    else:
        return None
def get_route(origin, destination, api_key):
    url = f"https://restapi.amap.com/v3/direction/bicycling?origin={origin}&destination={destination}&key={api_key}"
    response = requests.get(url)
    if response.status_code == 200:
        return response.json()
    else:
        return None
def extract_route_info(route_result):
    global address_origin,address_destination
    # 提取起点和终点信息
    origin =address_origin
    destination =address_destination
    # 提取总距离和总耗时
    total_distance = route_result['route']['paths'][0]['distance']
    total_duration = route_result['route']['paths'][0]['duration']
    # 提取路径规划的步骤信息
    steps = route_result['route']['paths'][0]['steps']
    route_info = f"从起点{origin}到终点{destination}的路径规划如下:\n"
    route_info += f"总距离为{total_distance}米,总耗时{total_duration}秒。\n"
    route_info += "具体步骤如下:\n"
    for i, step in enumerate(steps):
        instruction = step['instruction']
        distance = step['distance']
        duration = step['duration']
        route_info += f"步骤{i + 1}:{instruction},行驶距离{distance}米,耗时{duration}秒。\n"
    return route_info

# Create an MCP server
mcp = FastMCP("navigation")

# Add an addition tool
@mcp.tool()
def calculator(origin: str,destination: str) -> dict:
    """可实现路径规划,当需要进行路径规划时使用此工具
    参数'origin':为出发地,'destination':为目的地
    返回一个字典,包含以下键:
    - 'success': 操作是否成功 (bool)
    - 'result':路径规划结果
    """
    global address_origin,address_destination
    api_key = "2212ec79d9b52554225db797a7379b27"
    logger.info(f"{origin}")
    logger.info(f"{destination}")
    address_origin=origin
    address_destination=destination
    geocode_result1 = get_geocode(origin, api_key)
    geocode_result2 = get_geocode(destination, api_key)
    
    logger.info(f"{geocode_result1}")
    logger.info(f"{geocode_result2}")
    reorigin=geocode_result1['geocodes'][0]['location']
    redestination=geocode_result2['geocodes'][0]['location']
    logger.info(f"{reorigin}")
    logger.info(f"{redestination}")
    route_result = get_route(reorigin, redestination, api_key)
    
    route_info = extract_route_info(route_result)
    logger.info(f"{route_info}")
    return {"success": True, "result": route_info}

# Start the server
if __name__ == "__main__":
    mcp.run(transport="stdio")

【项目硬件】

9c77120301c6a8519c9f3cd2d3511bf.jpg

 

433226d726c39f283412ed3d93eb64d.jpg
9a092219f6dde72b9872253d15d566a.jpg
3d51dec151553eea52ffff288075b5a.jpg
f2c7ec7846b6d8abb14c98ca72738e5.jpg
652b30491448d81463487f5c7cdc468.jpg

【演示视频】

评论

user-avatar
  • feng0539

    feng05392025.07.01

    太精致了

    0