「ROS2实战-2」集成大语言模型:ollama_ros_chat 本地智能对话功能包部署和使用解析

张开发
2026/4/13 11:50:18 15 分钟阅读

分享文章

「ROS2实战-2」集成大语言模型:ollama_ros_chat 本地智能对话功能包部署和使用解析
在机器人应用场景中人机对话正变得越来越重要——从服务机器人接待引导到工业设备语音控制再到家庭陪护机器人闲聊陪伴。传统的关键词匹配方案早已无法满足需求而调用云端大模型又存在延迟、断网风险和隐私泄露问题。有没有一种方案既拥有大模型的自然语言理解能力又能完全在本地运行保护用户隐私答案就是Ollama ROS2。本文介绍的ollama_ros_chat功能包正是这样一套解决方案。它将本地部署的 DeepSeek-R1 等大语言模型无缝集成到 ROS2 系统中通过服务通信和话题通信两种方式为机器人提供安全、低延迟、可离线工作的智能对话能力。一、功能定位与设计思路1.1 为什么选择本地大模型目前主流的机器人语音交互方案有两种方案优点缺点云端 API如 ChatGPT、通义千问模型强大无需本地算力依赖网络延迟高数据上传有隐私风险本地模型Ollama DeepSeek数据不出门离线可用低延迟需要本地 GPU/CPU 算力ollama_ros_chat选择了后者核心设计原则是隐私优先所有对话数据在机器人本地处理不上传云端ROS2 原生使用标准的 ROS2 话题和服务接口易于集成灵活切换既支持本地 Ollama 模型也支持在线 API如通义千问轻量部署通过 launch 文件一键启动无需修改代码即可切换模型1.2 整体架构客户端节点接收用户输入文本或语音转文字发送请求服务端节点调用 Ollama API与大模型交互返回响应通信方式支持 ROS2 Service同步请求-响应和 Topic异步发布-订阅二、快速上手两种通信方式的使用2.1 环境准备在使用功能包之前需要确保机器人端已安装# 安装 Ollamacurl -fsSL https://ollama.com/install.sh | sh# 拉取 DeepSeek-R1 模型约 4.7GBollama pull deepseek-r1:7b# 安装 Python 依赖pip3 install requests2.2 服务通信模式推荐新手服务通信采用同步请求-响应模式适合一问一答的简单场景。启动服务端一个终端ros2 run ollama_ros_chat chat_service终端会输出当前可用的模型列表和已选择的模型。启动客户端另一个终端ros2 run ollama_ros_chat chat_client然后在客户端终端输入问题等待模型推理完成后即可看到回复。2.3 话题通信模式话题通信采用异步发布-订阅模式适合需要持续对话或流式输出的场景。启动话题服务端ros2 run ollama_ros_chat topic_server启动话题客户端ros2 run ollama_ros_chat topic_client两者的区别在于服务通信每次请求会阻塞直到收到回复话题通信可以同时处理多个请求且支持更灵活的消息流。2.4 一键启动使用 launch 文件为了避免每次手动启动两个节点功能包提供了 launch 文件ros2 launch ollama_ros_chat ollama_ros_chat.launch.py该 launch 文件会同时启动服务端和客户端并支持参数配置见下文。三、进阶配置切换模型与参数调优3.1 本地模型 vs 在线 API功能包支持两种后端通过修改base_url和api_key即可切换。本地 Ollama 配置默认base_url: [http://localhost:11434/v1](http://localhost:11434/v1)api_key: ollama # 本地任意字符串即可use_model: deepseek-r1 # 或留空自动选择第一个阿里云通义千问在线配置base_url: [https://dashscope.aliyuncs.com/compatible-mode/v1](https://dashscope.aliyuncs.com/compatible-mode/v1)api_key: sk-你的真实API密钥use_model: qwen-plus # 或 deepseek-r1 等⚠️ 注意通过 launch 文件启动时修改参数需要在.launch.py中设置如果直接运行 node则需要在 Python 代码中修改默认值。3.2 关键参数调优功能包暴露了以下可调参数直接影响对话效果参数类型说明推荐值temperaturefloat控制回复的随机性0 最确定1 最多样0.7创意对话/ 0.2精确问答streambool是否流式输出逐字显示True用户体验好history_lengthint保留的对话历史消息数量5~10节省内存timeoutint服务端响应超时时间秒30复杂问题需要更久在服务端代码中修改超时时间的位置如下ollama_service.py 中client OpenAI(base_urlself.base_url, api_keyself.api_key, timeout60) # 改为60秒3.3 服务通信超时处理由于大模型推理耗时较长尤其是 7B 模型在 CPU 上可能超过 30 秒服务通信容易触发超时。功能包已内置超时捕获机制当读取超时时会显示Read timeout。用户可以适当调大timeout参数或在客户端实现重试逻辑。四、技术细节与二次开发4.1 节点与通信接口功能包在setup.py中定义了四个可执行节点console_scripts: [topic_server ollama_ros_chat.ollama_topic_server:main,topic_client ollama_ros_chat.ollama_topic_client:main,chat_service ollama_ros_chat.ollama_service:main,chat_client ollama_ros_chat.ollama_client:main,]通信接口ROS2 消息类型为自定义的String通信类型客户端请求话题/服务服务端响应话题/服务话题通信/chat_message/chat_response服务通信/chat_service/chat_service同一个服务4.2 将对话能力集成到自己的机器人假设你已经有了一个语音识别节点输出文本和一个语音合成节点输入文本集成步骤如下启动ollama_ros_chat的服务端后台运行在你的语音识别节点中添加一个服务客户端# 伪代码示例from std_srvs.srv import Triggerfrom rclpy.callback_groups import MutuallyExclusiveCallbackGroupclient self.create_client(Trigger, /chat_service)while not client.wait_for_service(timeout_sec1.0):self.get_logger().info(等待对话服务...)req Trigger.Request()req.data recognized_text # 语音识别的结果future client.call_async(req)# 在回调中获取响应并发送给语音合成3.处理响应服务端返回的响应字符串可以直接送入 TTS 节点播报。4.3 性能优化建议硬件加速如果机器人配备 NVIDIA GPU安装ollama的 CUDA 版本推理速度可提升 5~10 倍。模型量化DeepSeek-R1 提供 4-bit 量化版本约 2.5GB精度损失不大但速度更快。预热机制首次请求会触发模型加载耗时 5~10 秒建议在机器人启动时发送一个空请求进行预热。五、ROS1 版本说明功能包同时提供了 ROS1 版本ollama_chat_ros使用方式类似仅启动命令不同# ROS1 启动服务端rosrun ollama_chat_ros chat_service.py# ROS1 启动客户端rosrun ollama_chat_ros chat_client.py# 使用 launch 文件roslaunch ollama_chat_ros ollama_chat_ros.launch注意 ROS1 需要先运行roscore且话题/服务名称与 ROS2 版本保持一致方便后续迁移。资源链接功能包仓库ollama_ros_chat请联系作者获取Ollama 官网https://ollama.comDeepSeek-R1 模型https://deepseek.com

更多文章