十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

从零入门ROS2机器人开发:构建内网对话机器人实战指南

从零入门ROS2机器人开发:构建内网对话机器人实战指南 从WRC看未来如何入门机器人开发并构建你的第一个“家庭助手”最近在WRC世界机器人大会上各种机器人应用让人眼花缭乱从宇树科技的四足机器人灵活地制作早餐到擎朗智能的商用机器人尝试洗衣服务再到各种工业、服务和特种机器人百花齐放。这背后传递出一个清晰的信号机器人技术正以前所未有的速度从实验室和工厂走向我们的日常生活“机器人到家”已不再是科幻概念而是正在发生的技术浪潮。对于开发者而言这既是机遇也是挑战。你是否也想参与其中却不知从何入手面对ROS2、机器人导航、仿真平台这些术语感到迷茫本文将从零开始为你系统梳理机器人开发的学习路径并通过一个完整的实战项目——构建一个简易的“内网网站对话机器人”带你亲手触摸机器人开发的核心。无论你是学生、嵌入式爱好者还是希望转型的软件工程师都能从本文找到清晰的路线图和可运行的代码。1. 机器人开发核心概念与技术栈扫盲在动手之前我们需要理解机器人系统的基本构成。一个完整的机器人系统通常可以抽象为三个核心部分感知、决策和执行。感知相当于机器人的眼睛和耳朵。它通过各类传感器如摄像头、激光雷达、超声波、IMU获取环境信息。在WRC上展示的机器人无论是进行视觉引导抓取的工业机械臂还是能自主导航的送餐机器人都离不开强大的感知能力。相关的技术热点包括计算机视觉CV、激光SLAM同步定位与建图等。决策是机器人的大脑。它处理感知信息进行理解、规划和判断。例如早餐机器人需要识别食材、规划抓取和烹饪路径对话机器人需要理解语义并生成回复。这部分涉及人工智能AI、路径规划、任务调度等算法。当前基于ROS2的节点通信框架是构建决策系统的主流选择。执行是机器人的手脚。它通过电机、舵机、机械结构等将决策转化为物理动作。从精密的工业机器人关节到四足机器人的腿部驱动器都属于执行层。这部分需要硬件驱动、运动控制等知识。对于软件开发者入门机器人开发通常从“决策层”和部分“感知层”的算法与软件框架切入。目前ROS/ROS2是绝对的行业标准框架它提供了节点通信、工具、库和生态让开发者能像搭积木一样构建机器人软件。ROS与ROS2的关键区别ROSRobot Operating System第一代基于TCPROS通信存在主节点单点故障等问题。ROS2采用DDS数据分发服务作为中间件实现了去中心化通信更好地支持实时性、跨平台和分布式系统是未来发展的方向。新项目建议直接从ROS2开始学习。常见误区澄清误区一机器人开发必须精通硬件。并非如此。软件算法、仿真测试是机器人开发的重要部分。你可以完全在Gazebo、Webots等仿真环境中开发、测试算法再部署到实体机器人。误区二必须使用昂贵的机器人平台。入门阶段一台树莓派摄像头套件甚至完全在虚拟机中进行仿真就足以开始学习核心概念。误区三机器人等于人工智能。AI特别是机器学习是提升机器人智能的重要手段但机器人学还包含大量传统控制理论、运动学、动力学等内容。两者结合才是趋势。2. 环境准备搭建你的机器人开发工作站工欲善其事必先利其器。我们将以最流行的Ubuntu ROS2组合搭建开发环境。如果你使用Windows强烈建议通过WSL2安装Ubuntu或直接使用虚拟机。2.1 操作系统与ROS2版本选择ROS2有多个发行版每个版本对应特定的Ubuntu版本。为获得长期支持和最稳定的生态我们选择ROS2 Humble Hawksbill它兼容Ubuntu 22.04 LTS。操作系统Ubuntu 22.04 LTS (Jammy Jellyfish) 桌面版或服务器版。ROS2发行版Humble Hawksbill (LTS支持至2027年5月)。2.2 安装ROS2 Humble以下是在Ubuntu 22.04上安装ROS2 Humble的完整步骤。请逐条在终端中执行。步骤一设置语言环境并添加ROS2软件源# 确保语言环境支持UTF-8 sudo apt update sudo apt install locales sudo locale-gen en_US en_US.UTF-8 sudo update-locale LC_ALLen_US.UTF-8 LANGen_US.UTF-8 export LANGen_US.UTF-8 # 添加ROS2 GPG密钥和软件源 sudo apt install software-properties-common sudo add-apt-repository universe sudo apt update sudo apt install curl -y sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg echo deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release echo $UBUNTU_CODENAME) main | sudo tee /etc/apt/sources.list.d/ros2.list /dev/null步骤二安装ROS2核心包# 更新软件源并安装ROS2 sudo apt update sudo apt upgrade -y # 安装桌面完整版推荐包含GUI工具、仿真器等 sudo apt install ros-humble-desktop -y步骤三配置环境变量安装完成后每次使用ROS2都需要source其安装脚本。为了方便将其添加到bashrc中。# 将source命令添加到 ~/.bashrc echo source /opt/ros/humble/setup.bash ~/.bashrc # 立即生效 source ~/.bashrc步骤四验证安装打开一个新的终端运行以下命令测试ROS2核心功能是否正常。# 测试话题发布/订阅一个终端运行 ros2 run demo_nodes_cpp talker # 另一个终端运行 ros2 run demo_nodes_cpp listener如果能看到talker终端周期性发布消息listener终端能接收到相同消息则说明ROS2安装成功。2.3 安装必要的开发工具# 安装colcon构建工具和rosdep依赖管理工具 sudo apt install python3-colcon-common-extensions python3-rosdep2 -y # 初始化rosdep sudo rosdep init rosdep update # 安装常用工具RViz2可视化、Gazebo仿真、Turtlesim入门演示 sudo apt install ros-humble-rviz2 ros-humble-gazebo-ros-pkgs ros-humble-turtle-tf2-py -y至此你的机器人开发基础环境已经就绪。3. ROS2核心概念与快速上手在开始项目前我们需要快速掌握ROS2的几个核心概念这是构建任何机器人应用的基石。3.1 核心概念解析节点Node机器人软件中的可执行程序是完成具体功能的独立单元。例如一个节点负责读取摄像头数据另一个节点负责处理图像。话题Topic节点间进行异步通信的渠道采用发布/订阅模型。数据以**消息Message**的形式在话题上传递。例如摄像头节点发布图像数据到/camera/image话题图像处理节点订阅该话题。服务Service节点间进行同步请求/响应通信的机制。客户端发送请求服务端处理并返回响应。适用于需要确认结果的指令如请求机器人移动到某个位置。动作Action一种更复杂的通信机制类似于可中断、带反馈的服务。常用于长时间运行的任务如导航到目标点过程中持续反馈位置可取消。3.2 创建你的第一个ROS2工作空间和包工作空间是存放项目代码的目录。我们来创建一个并编写一个简单的发布-订阅示例。# 1. 创建并进入工作空间目录 mkdir -p ~/ros2_ws/src cd ~/ros2_ws/src # 2. 创建一个Python功能的ROS2包依赖rclpy和std_msgs ros2 pkg create my_first_robot_pkg --build-type ament_python --dependencies rclpy std_msgs # 3. 进入包目录 cd my_first_robot_pkg/my_first_robot_pkg3.3 编写一个简单的发布者节点创建文件simple_publisher.py#!/usr/bin/env python3 # 文件路径~/ros2_ws/src/my_first_robot_pkg/my_first_robot_pkg/simple_publisher.py import rclpy from rclpy.node import Node from std_msgs.msg import String import time class SimplePublisher(Node): def __init__(self): super().__init__(simple_publisher) # 节点名 # 创建一个发布者发布String类型消息到‘my_topic’话题队列大小为10 self.publisher_ self.create_publisher(String, my_topic, 10) timer_period 1.0 # 发布周期1秒 # 创建一个定时器周期性调用timer_callback函数 self.timer self.create_timer(timer_period, self.timer_callback) self.count 0 def timer_callback(self): msg String() msg.data fHello ROS2! Count: {self.count} self.publisher_.publish(msg) self.get_logger().info(fPublishing: {msg.data}) # 打印日志 self.count 1 def main(argsNone): rclpy.init(argsargs) # 初始化ROS2 Python客户端库 simple_publisher SimplePublisher() rclpy.spin(simple_publisher) # 保持节点运行等待回调 simple_publisher.destroy_node() rclpy.shutdown() if __name__ __main__: main()3.4 编写一个简单的订阅者节点创建文件simple_subscriber.py#!/usr/bin/env python3 # 文件路径~/ros2_ws/src/my_first_robot_pkg/my_first_robot_pkg/simple_subscriber.py import rclpy from rclpy.node import Node from std_msgs.msg import String class SimpleSubscriber(Node): def __init__(self): super().__init__(simple_subscriber) # 创建一个订阅者订阅‘my_topic’话题收到消息后调用listener_callback函数 self.subscription self.create_subscription( String, my_topic, self.listener_callback, 10) # 队列大小 self.subscription # 防止未使用变量警告 def listener_callback(self, msg): self.get_logger().info(fI heard: {msg.data}) def main(argsNone): rclpy.init(argsargs) simple_subscriber SimpleSubscriber() rclpy.spin(simple_subscriber) simple_subscriber.destroy_node() rclpy.shutdown() if __name__ __main__: main()3.5 配置包并运行首先需要声明这两个可执行脚本。编辑setup.py文件位于~/ros2_ws/src/my_first_robot_pkg/找到console_scripts部分进行修改entry_points{ console_scripts: [ simple_publisher my_first_robot_pkg.simple_publisher:main, simple_subscriber my_first_robot_pkg.simple_subscriber:main, ], },然后在工作空间根目录编译并运行# 回到工作空间根目录 cd ~/ros2_ws # 安装依赖并编译包 rosdep install -i --from-path src --rosdistro humble -y colcon build --packages-select my_first_robot_pkg # 加载当前工作空间的环境 source install/setup.bash打开两个终端分别运行# 终端1运行发布者 ros2 run my_first_robot_pkg simple_publisher # 终端2运行订阅者 ros2 run my_first_robot_pkg simple_subscriber你将在终端1看到周期性发布日志终端2同步看到接收到的消息。恭喜你已经成功运行了第一个ROS2程序4. 实战项目构建内网网站对话机器人现在我们综合运用所学构建一个更具实用性的项目一个部署在内网的简易网站对话机器人。这个机器人可以作为一个Web服务接收用户的文本输入通过ROS2节点调用对话处理逻辑这里我们用简单的规则匹配模拟并返回应答。这模拟了服务机器人如展厅导览、酒店接待的人机交互后端。项目目标创建一个Web界面用户输入问题机器人返回答案。Web后端Flask与对话处理逻辑ROS2节点通过ROS2话题进行通信。4.1 项目结构设计~/ros2_dialog_bot/ ├── bot_ws/ # ROS2工作空间 │ ├── src/ │ │ └── dialog_robot/ # ROS2功能包 │ │ ├── package.xml │ │ ├── setup.py │ │ └── dialog_robot/ │ │ ├── __init__.py │ │ ├── dialog_manager.py # 对话管理ROS2节点 │ │ └── simple_nlp.py # 简易NLP处理模块 ├── web_server/ # Flask Web服务器 │ ├── app.py │ ├── templates/ │ │ └── index.html │ └── requirements.txt └── README.md4.2 创建ROS2对话处理包# 创建ROS2工作空间和包 mkdir -p ~/ros2_dialog_bot/bot_ws/src cd ~/ros2_dialog_bot/bot_ws/src ros2 pkg create dialog_robot --build-type ament_python --dependencies rclpy std_msgs cd dialog_robot/dialog_robot4.3 实现简易NLP与对话管理节点首先创建一个简单的自然语言处理模块simple_nlp.py用于意图识别和回复生成。# 文件路径~/ros2_dialog_bot/bot_ws/src/dialog_robot/dialog_robot/simple_nlp.py class SimpleDialogNLU: 一个极其简单的基于规则的自然语言理解模块 def __init__(self): self.rules { greeting: [你好, 嗨, hello, hi, 早上好, 下午好], farewell: [再见, 拜拜, 下次见, bye], capability: [你能做什么, 你会什么, 你的功能], name: [你叫什么名字, 你是谁], weather: [天气怎么样, 今天天气, 会下雨吗], joke: [讲个笑话, 说点有趣的] } self.responses { greeting: 你好我是内网对话机器人小R很高兴为你服务。, farewell: 再见期待下次与你聊天, capability: 我目前可以和你简单聊天回答关于天气、时间的问题还能讲冷笑话哦。, name: 我是运行在ROS2上的对话机器人开发者叫我小R。, weather: 模拟当前内网气象站数据显示室内温度25°C湿度50%天气晴。, joke: 为什么程序员分不清万圣节和圣诞节因为 Oct 31 Dec 25。 (Octal 31 Decimal 25), default: 抱歉我还没学会回答这个问题。你可以问我“你能做什么” } def understand(self, text): 理解用户输入返回意图标签 text_lower text.lower().strip() for intent, keywords in self.rules.items(): for kw in keywords: if kw in text_lower: return intent return default def respond(self, intent): 根据意图生成回复 return self.responses.get(intent, self.responses[default])接下来创建核心的ROS2节点dialog_manager.py。它将订阅来自Web后端的用户输入话题处理后发布回复到另一个话题。#!/usr/bin/env python3 # 文件路径~/ros2_dialog_bot/bot_ws/src/dialog_robot/dialog_robot/dialog_manager.py import rclpy from rclpy.node import Node from std_msgs.msg import String from .simple_nlp import SimpleDialogNLU import json class DialogManager(Node): def __init__(self): super().__init__(dialog_manager) # 订阅来自Web的用户输入话题 self.user_input_sub self.create_subscription( String, user_input, self.input_callback, 10 ) # 发布机器人回复到另一个话题 self.bot_response_pub self.create_publisher(String, bot_response, 10) self.nlu_engine SimpleDialogNLU() self.get_logger().info(对话管理节点已启动等待用户输入...) def input_callback(self, msg): 处理接收到的用户输入 user_text msg.data self.get_logger().info(f收到用户输入: {user_text}) # 理解意图并生成回复 intent self.nlu_engine.understand(user_text) response_text self.nlu_engine.respond(intent) # 构造回复消息并发布 response_msg String() # 可以返回更结构化的数据这里简单返回文本 response_data json.dumps({text: response_text, intent: intent}, ensure_asciiFalse) response_msg.data response_data self.bot_response_pub.publish(response_msg) self.get_logger().info(f发布机器人回复: {response_text}) def main(argsNone): rclpy.init(argsargs) node DialogManager() rclpy.spin(node) node.destroy_node() rclpy.shutdown() if __name__ __main__: main()4.4 配置ROS2包编辑setup.py文件添加节点入口entry_points{ console_scripts: [ dialog_manager dialog_robot.dialog_manager:main, ], },4.5 创建Flask Web服务器在项目根目录创建Web服务器部分。mkdir -p ~/ros2_dialog_bot/web_server/templates cd ~/ros2_dialog_bot/web_server创建requirements.txtFlask2.3.3 rclpy3.0.0创建Flask主程序app.py# 文件路径~/ros2_dialog_bot/web_server/app.py from flask import Flask, render_template, request, jsonify import rclpy from rclpy.node import Node from std_msgs.msg import String import threading import json import time # 初始化ROS2必须在Flask app创建前且只初始化一次 rclpy.init(argsNone) ros_node Node(web_interface_bridge) # 创建ROS2发布者和订阅者 user_input_pub ros_node.create_publisher(String, user_input, 10) # 用于存储最新回复的全局变量 latest_response {text: 机器人正在启动..., intent: init} def response_callback(msg): 回调函数接收机器人回复 global latest_response try: latest_response json.loads(msg.data) ros_node.get_logger().info(fWeb端收到回复: {latest_response[text]}) except Exception as e: ros_node.get_logger().error(f解析回复失败: {e}) bot_response_sub ros_node.create_subscription( String, bot_response, response_callback, 10 ) # 启动一个线程来执行rclpy.spin防止阻塞Flask def ros_spin_thread(): rclpy.spin(ros_node) spin_thread threading.Thread(targetros_spin_thread, daemonTrue) spin_thread.start() # 创建Flask应用 app Flask(__name__) app.route(/) def index(): return render_template(index.html) app.route(/ask, methods[POST]) def ask_robot(): 处理用户提问通过ROS2话题发送 user_message request.json.get(message, ).strip() if not user_message: return jsonify({error: 消息不能为空}), 400 # 发布用户输入到ROS2话题 msg String() msg.data user_message user_input_pub.publish(msg) ros_node.get_logger().info(fWeb端发布用户输入到ROS: {user_message}) # 等待并获取机器人回复简单轮询生产环境建议用更优雅的方式如WebSocket global latest_response old_response latest_response.copy() for _ in range(50): # 等待最多5秒 time.sleep(0.1) if latest_response ! old_response: break return jsonify(latest_response) if __name__ __main__: app.run(host0.0.0.0, port5000, debugFalse) # 生产环境关闭debug创建前端页面templates/index.html!DOCTYPE html html langzh-CN head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title内网对话机器人 - 演示/title style body { font-family: sans-serif; max-width: 800px; margin: 20px auto; padding: 20px; } #chat-box { border: 1px solid #ccc; height: 400px; overflow-y: auto; padding: 10px; margin-bottom: 10px; } .user-msg { text-align: right; color: #0066cc; margin: 5px 0; } .bot-msg { text-align: left; color: #009933; margin: 5px 0; } #input-area { display: flex; } #user-input { flex-grow: 1; padding: 10px; } button { padding: 10px 20px; background: #007bff; color: white; border: none; cursor: pointer; } button:hover { background: #0056b3; } /style /head body h2 内网对话机器人演示/h2 p尝试输入你好、你叫什么名字、天气怎么样、讲个笑话、再见/p div idchat-box/div div idinput-area input typetext iduser-input placeholder输入你想说的话... onkeypresshandleKeyPress(event) button onclicksendMessage()发送/button /div script const chatBox document.getElementById(chat-box); const userInput document.getElementById(user-input); function addMessage(sender, text) { const msgDiv document.createElement(div); msgDiv.className sender user ? user-msg : bot-msg; msgDiv.innerHTML strong${sender user ? 你 : 机器人}:/strong ${text}; chatBox.appendChild(msgDiv); chatBox.scrollTop chatBox.scrollHeight; } function sendMessage() { const message userInput.value.trim(); if (!message) return; addMessage(user, message); userInput.value ; userInput.disabled true; fetch(/ask, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ message: message }) }) .then(response response.json()) .then(data { if (data.error) { addMessage(bot, 错误: ${data.error}); } else { addMessage(bot, data.text); } userInput.disabled false; userInput.focus(); }) .catch(error { addMessage(bot, 网络请求失败: ${error}); userInput.disabled false; userInput.focus(); }); } function handleKeyPress(event) { if (event.key Enter) { sendMessage(); } } // 页面加载时显示欢迎语 window.onload () addMessage(bot, 你好我是内网对话机器人很高兴为你服务。); /script /body /html4.6 运行与验证第一步启动ROS2对话管理节点# 打开终端1编译并运行ROS2节点 cd ~/ros2_dialog_bot/bot_ws colcon build --packages-select dialog_robot source install/setup.bash ros2 run dialog_robot dialog_manager你应该看到节点启动日志对话管理节点已启动等待用户输入...第二步启动Flask Web服务器# 打开终端2启动Web服务 cd ~/ros2_dialog_bot/web_server # 建议使用虚拟环境安装依赖 pip install -r requirements.txt python app.py服务器启动后访问http://你的服务器IP:5000。第三步测试交互在浏览器页面中输入“你好”、“天气怎么样”等观察页面回复。同时在终端1中可以看到ROS2节点接收和处理的日志。至此一个连接Web前端与ROS2后端的内网对话机器人原型就完成了。它清晰地展示了如何将机器人软件ROS2节点与用户交互界面Web解耦并通过标准消息进行通信。5. 常见问题与排查思路在机器人开发过程中你会遇到各种问题。以下是一些典型问题及解决方法。问题现象可能原因排查思路与解决方案ROS2节点启动失败提示“Package ‘xxx’ not found”1. 包未编译。2. 工作空间环境未source。3. 包名拼写错误。1. 进入工作空间执行colcon build --packages-select 包名。2. 执行source install/setup.bash。3. 使用ros2 pkg list确认包名。编译时出现CMake或Python依赖错误1. 缺少系统依赖。2.package.xml或setup.py中依赖声明错误。1. 运行rosdep install -i --from-path src --rosdistro humble -y安装系统依赖。2. 检查package.xml中的depend标签或setup.py中的install_requires。话题通信失败订阅者收不到消息1. 话题名称不匹配。2. 消息类型不匹配。3. 节点未正确启动。4. QoS策略不兼容。1. 使用ros2 topic list确认发布和订阅的话题名完全一致。2. 使用ros2 topic info 话题名和ros2 interface show 消息类型检查。3. 使用ros2 node list和ros2 topic echo 话题名调试。4. 检查发布和订阅的QoS配置深度、可靠性策略。Gazebo仿真启动黑屏或模型加载失败1. 3D渲染问题常见于虚拟机或无独显电脑。2. 模型文件下载不完整或路径错误。1. 尝试以软件渲染启动export LIBGL_ALWAYS_SOFTWARE1然后启动Gazebo。2. 设置模型路径export GAZEBO_MODEL_PATH~/.gazebo/models:/usr/share/gazebo-11/models或手动下载模型。Python节点权限错误“/usr/bin/env: ‘python3’: Permission denied”Python脚本没有执行权限。为脚本添加可执行权限chmod x your_script.py。Web服务器无法与ROS2节点通信1. ROS2节点未运行。2. Flask中ROS2节点初始化失败。3. 话题名称在Web端和ROS端不一致。1. 确保dialog_manager节点已运行。2. 检查Flask应用的ROS2初始化部分是否有错误日志。3. 核对app.py和dialog_manager.py中的话题名 (user_input,bot_response)。6. 进阶学习路线与工程最佳实践完成基础项目后你可以沿着以下路径深入向WRC上那些更复杂的机器人应用迈进。6.1 分阶段学习路线图基础巩固阶段精通ROS2核心深入理解节点、话题、服务、动作、参数、生命周期。常用工具链熟练使用rqt可视化工具、ros2 bag数据录制回放、ros2 launch启动文件。自定义消息学习创建和使用自定义.msg、.srv、.action文件。感知与导航入门仿真环境在Gazebo或Webots中加载机器人模型如TurtleBot3添加传感器激光雷达、摄像头。视觉入门学习使用cv_bridge将ROS图像消息与OpenCV互转尝试简单的物体识别。导航栈学习使用Nav2ROS2导航框架理解代价地图、全局/局部规划器、行为树的概念。控制与硬件接口URDF建模学习使用URDF统一机器人描述格式描述你的机器人模型。控制器了解ros2_control框架尝试为仿真机器人编写简单的差分驱动控制器。真实硬件尝试用ROS2驱动一个真实的舵机或电机通过串口或PWM例如使用micro-ROS连接嵌入式开发板。项目实战与集成SLAM建图在仿真或真实机器人上运行SLAM工具箱如slam_toolbox构建环境地图。任务与行为使用行为树如BehaviorTree.CPP编排复杂的机器人任务序列。系统集成将感知、导航、对话等多个模块集成到一个完整的应用中。6.2 工程化最佳实践代码组织使用功能包Package合理划分模块保持高内聚、低耦合。将配置参数存入config目录的YAML文件中利用ROS2参数服务器动态调整。启动文件对于多节点系统务必使用launch.py文件来统一启动和配置节点而不是手动开多个终端。日志与调试合理使用rclpy.logging分级别DEBUG, INFO, WARN, ERROR记录日志。善用rqt_console查看和过滤日志。测试为关键算法编写单元测试使用ament_cmake_pytest或unittest。对节点通信进行集成测试。版本控制使用Git管理代码.gitignore中忽略build/,install/,log/等编译和运行时目录。容器化部署考虑使用Docker封装你的机器人应用确保环境一致性便于迁移和部署。安全考量内网服务也要注意基础安全如设置防火墙规则、Web服务使用Token认证、ROS2通信考虑使用SROS2ROS2安全套件进行加密和认证。机器人开发是一个融合了软件工程、算法、硬件的综合性领域。从今天这个简单的对话机器人出发持续学习、动手实践、参与开源项目你完全有能力构建出更智能、更实用的机器人应用。
返回列表