这次我们来看一个面向硕博研究生的具身智能入门教程。具身智能Embodied AI是当前人工智能与机器人领域的前沿交叉方向它强调智能体通过与物理环境的交互来学习和完成任务。对于希望进入机器人、自动驾驶、智能体等领域的同学来说掌握具身智能的核心概念与开发技能至关重要。本教程将系统性地梳理从Embodied AI导论、机器人空间描述、底层逻辑控制到技术发展的完整学习路径并提供可落地的实践思路。如果你关心如何从理论过渡到实践如何搭建仿真环境以及如何规划自己的学习与科研路线这篇文章可以直接收藏。我们将重点关注具身智能的核心框架、必备的数学与编程基础、主流的仿真平台选择以及一个从零开始的简单开发示例。文章不会空谈概念而是会给出具体的学习资源、工具链和验证方法帮助你判断这个方向是否适合自己并知道第一步该从哪里开始。1. 核心能力速览具身智能学习路径剖析在深入细节之前我们先通过一个表格快速了解学习具身智能需要掌握的核心模块、对应的关键技能以及推荐的实践工具。这能帮助你快速建立全局认知。学习模块核心内容与目标关键技能/知识点推荐工具/平台Embodied AI 导论理解具身智能的定义、研究范式仿真到现实、交互学习、与经典AI的区别。马尔可夫决策过程MDP、部分可观测马尔可夫决策过程POMDP、强化学习基础、具身认知理论。相关综述论文、经典课程如斯坦福CS330。机器人的空间描述描述机器人本体及环境中物体的位置与姿态是运动规划和控制的基础。刚体运动学、位姿表示旋转矩阵、四元数、欧拉角、齐次变换、李群与李代数初步。Python (NumPy, SciPy), MATLAB, ROS2 (TF2)。底层逻辑控制实现机器人从期望位姿到实际关节电机指令的生成与执行。机器人动力学建模、PID控制、运动学逆解、轨迹规划多项式、样条。ROS2控制框架、Gazebo/Isaac Sim仿真、实际机器人SDK如UR、Franka。技术发展与集成实践了解当前前沿如大模型机器人、模仿学习并完成一个端到端的小项目。仿真环境搭建、传感器数据处理图像、激光、任务规划、系统集成与调试。NVIDIA Isaac Sim、MuJoCo、PyBullet、ROS2 Navigation2、MoveIt2。学习与验证门槛硬件依赖低主要以仿真为主需要较强的数学基础和编程能力。线性代数、概率论、Python/C编程、Linux基础。个人电脑推荐配备独立显卡以运行3D仿真、Ubuntu系统。这个路径明确了从理论到仿真再到潜在实物部署的阶梯。对于学生和研究者仿真环境是成本最低且效率最高的学习和验证平台。2. 适用场景与使用边界具身智能的研究与应用有明确的边界了解这些能帮助你找准定位。适合谁** robotics/AI方向的硕博研究生**这是最直接的目标群体用于确定研究方向、开展课题实验。高级本科生或跨专业学习者如果你有强烈的兴趣和扎实的数学、编程基础可以通过仿真项目入门。工业机器人应用开发者希望为机器人引入更高级的感知和决策能力实现柔性化、智能化的任务执行。自动驾驶、无人机等领域的工程师这些本质上是移动机器人的具体应用底层逻辑相通。能解决什么问题智能移动与操作让机器人学会在复杂环境中导航、避障并抓取、操作特定物体。任务导向的交互学习通过演示模仿学习或试错强化学习让机器人学会完成一项长期任务如“整理桌面”。仿真到现实的迁移在低成本、高效率的仿真环境中训练策略并尝试迁移到物理机器人上降低实物训练风险与成本。多智能体协作研究多个机器人如何通过感知与通信完成协同任务。不适合什么场景追求短期、快餐式应用开发具身智能涉及底层控制、中间件、算法等多个层次需要长期投入。缺乏编程和数学基础线性代数、概率论、微积分和良好的编程能力是硬性门槛。仅对上层应用如聊天机器人感兴趣具身智能聚焦于物理实体与环境的交互与纯软件智能体差异较大。安全与伦理边界仿真优先强烈建议在仿真环境中完成绝大部分算法开发与验证待充分测试后再考虑实物部署。实物操作安全操作真实机器人时必须遵守安全规范设置急停开关并在导师或专业人员指导下进行。数据合规如果使用真实场景数据如图像、点云进行训练需确保数据来源合法并注意隐私保护。3. 环境准备与前置条件开始实践前需要搭建一个稳定的开发环境。以下是一个通用且主流的配置方案。操作系统首选 Ubuntu LinuxROS/ROS2 及其庞大的机器人生态对 Ubuntu 支持最好。推荐Ubuntu 22.04 LTS或20.04 LTS。备选方案Windows 用户可通过 WSL2 (Windows Subsystem for Linux) 安装 Ubuntu这是折中方案。macOS 也可行但可能遇到更多依赖库问题。编程语言与工具Python 3.8机器学习、强化学习算法、快速原型开发的主要语言。务必熟悉 NumPy, SciPy, Matplotlib 等科学计算库。C (17/20)高性能实时控制、底层驱动开发的必备语言。ROS2 的核心和许多性能关键模块由 C 编写。Git版本控制用于管理代码和克隆开源项目。Docker (可选但推荐)用于创建可复现的仿真与开发环境避免系统依赖冲突。机器人中间件ROS2ROS2Robot Operating System 2是当前机器人开发的事实标准框架它提供了通信、工具、功能包等基础设施。版本选择Ubuntu 22.04 对应ROS2 Humble HawksbillUbuntu 20.04 对应ROS2 Foxy Fitzroy。建议选择 Humble。安装方法请严格按照 ROS2 官方文档进行安装。通常包括设置软件源、安装核心包和基础工具。仿真环境三选一或组合使用Gazebo ROS2经典组合开源免费插件丰富社区资源多。适合学术研究和基础教学。NVIDIA Isaac Sim基于 Omniverse图形渲染质量高对 NVIDIA 硬件优化好内置许多高级 AI 功能。适合需要高质量视觉和 GPU 加速仿真的研究。PyBullet/MuJoCo轻量级物理仿真器常用于强化学习研究Python 接口友好运行速度快。硬件建议CPU多核处理器建议 i5/R5 及以上。内存16GB 及以上大型仿真场景需要更多。GPU非必须但强烈推荐。如果使用 Isaac Sim 或进行视觉相关的深度学习训练一块中端及以上独立显卡如 NVIDIA GTX 1660 / RTX 3060 及以上会极大提升体验。存储至少 50GB 可用空间用于安装系统、仿真环境和模型数据。4. 安装部署与启动方式以 ROS2 Gazebo 为例我们以最通用的 ROS2 Humble Gazebo 组合为例展示如何搭建一个基础的移动机器人仿真环境。这是验证后续空间描述和控制算法的前提。步骤 1安装 ROS2 Humble在 Ubuntu 22.04 终端中执行以下命令# 1. 设置语言环境 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 # 2. 添加 ROS2 软件源 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 # 3. 安装 ROS2 桌面版包含ROS、RViz、Gazebo等 sudo apt update sudo apt install ros-humble-desktop -y # 4. 设置环境变量每次打开新终端都需要执行或将其加入 ~/.bashrc source /opt/ros/humble/setup.bash echo source /opt/ros/humble/setup.bash ~/.bashrc步骤 2安装 Gazebo 与 ROS2 集成ROS2 桌面版通常已包含 Gazebo但为了确保集成良好可以安装额外的包sudo apt install ros-humble-gazebo-ros-pkgs -y步骤 3创建一个工作空间并启动示例让我们创建一个 ROS2 工作空间并运行一个简单的 TurtleBot3 仿真示例来验证环境。# 1. 创建工作空间目录 mkdir -p ~/ros2_ws/src cd ~/ros2_ws/src # 2. 克隆 TurtleBot3 仿真相关的包 git clone -b humble-devel https://github.com/ROBOTIS-GIT/turtlebot3_simulations.git # 3. 返回工作空间根目录安装依赖并编译 cd ~/ros2_ws rosdep install -i --from-path src --rosdistro humble -y colcon build --symlink-install # 4. 设置工作空间环境变量 source ~/ros2_ws/install/setup.bash echo source ~/ros2_ws/install/setup.bash ~/.bashrc # 5. 设置 TurtleBot3 型号例如 burger export TURTLEBOT3_MODELburger echo export TURTLEBOT3_MODELburger ~/.bashrc # 6. 启动 Gazebo 仿真世界和机器人模型 ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py如果一切顺利你将看到 Gazebo 界面启动并加载出一个带有 TurtleBot3 机器人的仿真环境。同时RVizROS 可视化工具也会打开显示机器人的激光雷达数据等信息。这表明你的基础仿真环境已经就绪。5. 功能测试与效果验证从空间描述到简单控制环境搭建好后我们通过三个递进的测试来验证对机器人“空间描述”和“底层逻辑控制”的理解。5.1 测试一理解空间变换TF2在 ROS2 中机器人的各个部件如底盘、激光雷达、相机之间的位姿关系通过 TF2 库来管理和广播。这是“空间描述”的工程化体现。测试目的查看机器人坐标系之间的变换关系。操作步骤确保上一节的 Gazebo 仿真仍在运行。打开一个新的终端输入以下命令查看当前的坐标变换树# 在新的终端中先 source 环境 source ~/ros2_ws/install/setup.bash source /opt/ros/humble/setup.bash export TURTLEBOT3_MODELburger # 启动 tf2_tools 查看变换 ros2 run tf2_tools view_frames命令执行后会在当前目录生成一个frames.pdf文件。打开它你可以看到如odom-base_footprint-base_link-base_scan等坐标系之间的树状关系。odom里程计坐标系是参考系base_scan激光雷达坐标系是子系它们之间的变换描述了雷达在机器人上的安装位置。预期结果与判断成功生成并查看 PDF 文件图中清晰展示了坐标系之间的父子关系。这说明 TF2 系统工作正常你能通过程序接口查询到任何一个部件相对于另一个部件的位置和姿态。5.2 测试二手动控制机器人移动话题通信这是最基础的“控制”测试通过发布速度指令话题来控制机器人。测试目的验证机器人仿真模型能接收指令并运动。操作步骤仿真环境保持运行。新开终端列出当前活跃的话题ros2 topic list你会看到/cmd_vel等话题。/cmd_vel是用于接收速度指令的标准话题。 3. 通过命令行手动发布速度指令让机器人转圈ros2 topic pub -r 10 /cmd_vel geometry_msgs/msg/Twist {linear: {x: 0.2, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.5}}这条命令以 10Hz 的频率发布消息线速度 x 方向 0.2 m/s角速度 z 方向 0.5 rad/s。预期结果Gazebo 中的 TurtleBot3 机器人开始以弧线运动。在 RViz 中你也可以看到激光雷达扫描的数据随着机器人运动而变化。判断成功机器人按指令运动。这证明了仿真模型的控制接口是通的你可以通过编程向/cmd_vel话题发送Twist消息来控制机器人。5.3 测试三编写一个简单的定点移动节点Python现在我们将“空间描述”和“控制”结合起来。假设我们知道目标点在机器人坐标系下的位置(x1.0, y0.0)我们写一个简单的 Python 节点控制机器人移动到这个点。测试目的实现一个开环的点位控制综合运用坐标变换和速度控制。操作步骤在~/ros2_ws/src下创建一个新的功能包cd ~/ros2_ws/src ros2 pkg create --build-type ament_python my_first_robot_controller cd my_first_robot_controller/my_first_robot_controller创建节点文件go_to_point.py#!/usr/bin/env python3 import rclpy from rclpy.node import Node from geometry_msgs.msg import Twist import math class GoToPointNode(Node): def __init__(self): super().__init__(go_to_point_node) self.publisher_ self.create_publisher(Twist, /cmd_vel, 10) self.timer self.create_timer(0.1, self.timer_callback) # 10Hz控制循环 self.target_x 1.0 # 目标位置在机器人初始坐标系下 self.target_y 0.0 self.kp_linear 0.5 # 比例系数 self.kp_angular 1.0 self.distance_tolerance 0.05 # 到达容差 def timer_callback(self): # 注意这是一个极其简化的示例假设机器人初始位于(0,0)朝向x轴正方向。 # 实际应用中需要通过TF2查询机器人当前位置这里用假数据模拟。 current_x 0.0 # 应通过TF2从 odom 获取 current_y 0.0 current_yaw 0.0 # 计算位置误差在机器人坐标系下 dx self.target_x - current_x dy self.target_y - current_y distance math.sqrt(dx**2 dy**2) target_angle math.atan2(dy, dx) angle_error target_angle - current_yaw # 简单的P控制器 msg Twist() if distance self.distance_tolerance: msg.linear.x self.kp_linear * distance msg.angular.z self.kp_angular * angle_error else: msg.linear.x 0.0 msg.angular.z 0.0 self.get_logger().info(Target reached!) self.timer.cancel() # 停止定时器 self.publisher_.publish(msg) def main(argsNone): rclpy.init(argsargs) node GoToPointNode() rclpy.spin(node) rclpy.shutdown() if __name__ __main__: main()修改setup.py文件添加入口点在setup.py的entry_points部分的console_scripts括号内添加go_to_point my_first_robot_controller.go_to_point:main,编译并运行cd ~/ros2_ws colcon build --packages-select my_first_robot_controller source install/setup.bash ros2 run my_first_robot_controller go_to_point预期结果与判断启动该节点后机器人应开始向正前方移动。由于我们的控制器极其简化且没有真实位姿反馈它可能无法精确到达 (1,0) 点但你会看到机器人因msg.linear.x被赋值而开始运动。这个测试成功的关键在于你实现了一个完整的 ROS2 节点结构它能够周期性地发布控制指令。这为你后续集成真实的位姿反馈通过 TF2 监听打下了基础。6. 接口 API 与系统集成思路在具身智能系统中各个模块感知、规划、控制通常作为独立的节点Node运行并通过 ROS2 的话题Topic、服务Service或动作Action进行通信。掌握这种接口设计是进行复杂任务集成的基础。通用节点通信模式发布/订阅Topic单向异步通信适用于持续性的数据流如传感器数据/camera/image、控制指令/cmd_vel。请求/响应Service双向同步通信适用于需要即时响应的任务如查询状态、触发一次计算。动作Action双向异步通信适用于长时间、可抢占的任务如导航到目标点NavigateToPose。示例创建一个简单的目标点设置服务假设我们想让测试三中的定点移动功能通过服务来触发而不是自动运行。创建服务定义文件GoToPoint.srv在功能包的srv目录下float32 target_x float32 target_y --- bool success string message编写服务端节点接收目标点并启动控制逻辑。客户端可以是另一个节点或命令行调用该服务传入目标坐标。批量任务与实验管理对于研究而言经常需要批量运行不同参数的实验。ROS2 本身不直接提供批量任务队列但可以通过外部脚本轻松管理。使用 Launch 文件ROS2 Launch 文件可以一次性启动多个节点并配置参数。你可以为不同的实验编写不同的 launch 文件。使用 Python 脚本封装编写一个 Python 脚本利用subprocess模块依次启动不同的 launch 文件或节点并记录日志和结果。与强化学习框架结合如使用 Stable-Baselines3, Ray RLlib 等框架训练策略时其本身具备实验管理功能。你的 ROS2 仿真环境可以作为这些框架的“环境”Environment被调用。一个简单的实验脚本框架如下#!/usr/bin/env python3 import subprocess import time import yaml experiment_configs [ {kp_linear: 0.3, kp_angular: 0.8, world: empty}, {kp_linear: 0.5, kp_angular: 1.0, world: empty}, {kp_linear: 0.3, kp_angular: 1.0, world: maze}, ] for exp_id, config in enumerate(experiment_configs): print(fStarting experiment {exp_id}: {config}) # 1. 启动 Gazebo 仿真世界 gazebo_proc subprocess.Popen([ros2, launch, my_pkg, f{config[world]}_world.launch.py]) time.sleep(10) # 等待仿真加载 # 2. 启动控制器节点并传入参数 ctrl_proc subprocess.Popen([ros2, run, my_controller, node_name, --ros-args, -p, fkp_linear:{config[kp_linear]}, -p, fkp_angular:{config[kp_angular]}]) # 3. 运行一段时间或等待任务完成 time.sleep(30) # 4. 终止进程保存日志 ctrl_proc.terminate() gazebo_proc.terminate() # 5. 处理并保存本次实验数据 print(fExperiment {exp_id} finished.)7. 资源占用与性能观察在本地运行机器人仿真时了解系统资源占用情况对于调试和优化至关重要。观察工具系统级使用htop或top查看 CPU 和内存总体占用。进程级使用ps aux | grep ros或ros2 topic list配合ros2 topic hz /topic_name查看话题发布频率。GPU如果使用 Isaac Sim 或 GPU 加速使用nvidia-smi命令。典型仿真场景资源占用Gazebo TurtleBot3CPUGazebo 物理仿真和渲染会占用一个核心的 100%RViz 占用较少。总体可能在 150%-250% 即 1.5 到 2.5 个核心之间波动。内存约 1GB - 2GB取决于仿真世界的复杂度。GPUGazebo 使用 OGRE 渲染会占用部分 GPU。如果使用集成显卡可能会感到卡顿。使用独立显卡如 GTX 1060则非常流畅。磁盘ROS2 和 Gazebo 模型库安装后约占 5-10GB。运行时的日志和数据存储需额外空间。性能优化建议简化仿真世界在算法开发初期使用空荡荡empty或结构简单的世界可以大幅提升仿真速度。调整物理引擎参数Gazebo 中可以通过降低迭代次数、增大步长来提升速度但会损失物理精度。使用无头模式在不需可视化界面时使用headless模式运行 Gazebo (gzserver代替gazebo)可以节省大量 GPU 资源。优化节点频率并非所有节点都需要高频率运行。降低非关键节点如某些可视化节点的发布频率。使用性能分析工具ROS2 提供了ros2 trace等工具可以分析节点间的通信延迟和回调函数执行时间。8. 常见问题与排查方法在学习和部署过程中你一定会遇到各种问题。下表汇总了典型问题及其排查思路。问题现象可能原因排查方式解决方案运行ros2命令提示“未找到命令”ROS2 环境变量未设置。执行echo $ROS_DISTRO若无输出则未设置。执行source /opt/ros/humble/setup.bash并确认已加入~/.bashrc。Gazebo 启动黑屏或卡住3D 渲染问题可能是显卡驱动或集成显卡性能不足。查看终端错误信息通常与OpenGL相关。1. 更新显卡驱动。2. 使用LIBGL_ALWAYS_SOFTWARE1环境变量强制软件渲染会很卡。3. 换用性能更强的机器。编译功能包时出现依赖错误缺少系统或 ROS 依赖包。查看colcon build的错误输出通常指明缺失的包名。使用rosdep自动安装rosdep install -i --from-path src --rosdistro humble -y。节点启动后收不到话题消息1. 话题名称不匹配。2. 节点未正确连接到 ROS 网络。3. 消息类型不匹配。1.ros2 topic list查看所有话题。2.ros2 topic echo /topic_name查看是否有数据。3.ros2 topic info /topic_name查看发布者和订阅者。1. 检查代码中的话题名称是否与发布者一致。2. 确保所有节点在同一个 ROS_DOMAIN_ID 下默认都是0。3. 检查消息类型定义。TF2 变换查询失败1. 变换尚未发布。2. 坐标系名称错误。3. 查询的时间点无可用变换。1.ros2 run tf2_tools view_frames生成变换树图。2.ros2 topic echo /tf_static查看静态变换。1. 确保发布变换的节点正在运行。2. 检查代码中的源坐标系和目标坐标系名称注意拼写和前缀。3. 使用tf2_ros::Buffer::lookupTransform时尝试使用tf2::TimePointZero或rclcpp::Time(0)查询最新变换。仿真中机器人不动1. 速度指令未发布。2. 指令话题名称错误。3. 仿真时间未运行。1.ros2 topic echo /cmd_vel查看是否有指令。2. 检查 Gazebo 界面左下角仿真时间是否在增长。1. 确认控制节点正在运行并发布到正确的/cmd_vel话题。2. 确认仿真已取消暂停Pause。3. 尝试用ros2 topic pub手动发布指令测试。Python 节点无法导入自定义消息1. 功能包未正确编译。2.package.xml和setup.py中依赖未声明。3. 环境变量未刷新。1. 检查编译日志是否有错误。2. 在 Python 文件中尝试import rclpy看是否成功。1. 在package.xml和setup.py中声明对消息所在功能包的依赖ament_python在setup.py的install_requires和data_files中配置。2. 重新编译 (colcon build) 并source install/setup.bash。9. 最佳实践与使用建议为了更高效、更规范地进行具身智能开发遵循一些最佳实践可以事半功倍。版本控制与文档从一开始就使用 Git 管理代码。为每个项目创建清晰的README.md说明如何安装依赖、编译和运行。使用.gitignore忽略构建目录build/,install/,log/和大型数据文件。模块化设计将感知、规划、控制等不同功能拆分为独立的 ROS2 节点或类。使用参数服务器rclcpp::Parameter或 launch 文件来配置参数避免硬编码。仿真先行实物后置95% 的算法开发和调试应在仿真中完成。建立一个与实物机器人尽可能相似的仿真模型URDF/SDF。仅在仿真验证稳定后才进行实物测试并准备好急停措施。善用可视化工具RViz 是调试的利器。除了显示传感器数据还可以可视化路径、点云、坐标系、标记Marker等。将中间结果可视化能极大提升调试效率。日志与数据记录使用 ROS2 的rclcpp::Logger输出不同级别的日志INFO, WARN, ERROR。对于实验数据使用ros2 bag record命令录制话题数据便于回放和分析。逐步提升复杂度不要一开始就挑战复杂环境下的导航或操作。从空环境、单个简单任务开始如直线走到目标点逐步增加障碍物、传感器噪声、动态物体等复杂度。关注社区与开源项目ROS2 和 Gazebo/Isaac Sim 有活跃的社区。遇到问题时在 GitHub Issues、ROS Discourse 论坛或相关 Stack Exchange 站点搜索通常能找到解决方案或思路。伦理与安全考量在仿真中可以进行任何探索但涉及实物机器人尤其是移动或带机械臂的机器人时必须将安全放在第一位。永远假设你的代码会有 bug并设置软件和硬件的安全边界。10. 总结与下一步具身智能是一个将人工智能算法落地到物理世界的前沿领域充满了挑战与乐趣。本教程为你搭建了一个从理论认知到仿真实践的最小可行路径。最值得尝试的起点就是在你的电脑上成功运行起 ROS2 和 Gazebo并让一个仿真机器人动起来。你应该最先验证的功能就是“空间描述”通过 TF2 查看坐标系和“底层逻辑控制”通过发布速度指令让机器人运动。这两个基础环节打通后你就可以在此基础上叠加更复杂的感知如激光SLAM、视觉识别和决策如基于地图的路径规划、强化学习策略模块。最容易踩的坑往往是环境配置和 ROS2 通信机制。务必严格按照官方文档安装并理解话题、服务、动作等通信模式的区别。多使用ros2 topic list/echo/info等命令行工具来诊断问题。后续你可以沿着以下几个方向深入深入机器人学基础精读《Robotics: Modelling, Planning and Control》等经典教材夯实运动学、动力学、状态估计、控制理论。掌握一个仿真平台除了 Gazebo可以深入探索 NVIDIA Isaac Sim利用其强大的 GPU 加速和内置的 AI 功能栈进行更复杂的研究。学习先进的感知与决策算法如图像深度估计、3D 目标检测、视觉语言模型VLM用于任务理解、模仿学习与强化学习算法。参与开源项目或竞赛在 GitHub 上寻找相关的开源项目阅读代码尝试贡献。或参加如 ICRA RoboMaster、AWS DeepRacer 等竞赛以赛促学。尝试实物平台在条件允许且确保安全的前提下尝试在 TurtleBot3、JetBot 或一台旧笔记本改装的移动底盘上部署你的算法体验仿真到现实的“现实差距”。这条路很长但每一步的进展都会非常实在。建议收藏本文在搭建环境和实践过程中遇到问题时可以回溯到对应的章节查找思路。