☰
具身智能机器人从仿真到真机:ROS2、Gazebo与SLAM导航实战指南
2026/11/3 14:15:13 网站建设 项目流程

1. 具身智能机器人到底在解决什么问题

我第一次接触“具身智能”这个词的时候,脑子里冒出来的是一堆问号。后来跟几个做机器人方向的朋友聊了几次,又自己动手跑了一些开源项目,才慢慢把这个概念落地。说白了,具身智能就是让机器人不再只是“会算”,而是“会动”——它得有一个物理身体,能感知环境、理解任务、规划动作,最后真的把事办了。这跟传统工业机器人有本质区别:工业机器人是“闭着眼睛”执行固定轨迹,而具身智能机器人得“睁着眼睛”随机应变。

这个方向为什么这两年突然火起来?核心原因是三股力量汇到了一起。第一股是大模型带来的语义理解和任务规划能力,机器人终于能听懂“把桌上那个红色的杯子递给我”这种模糊指令了。第二股是仿真技术的成熟,像Gazebo、MuJoCo、Isaac Sim这些工具让训练成本大幅下降,不用真机就能跑几百万次试错。第三股是硬件成本的下降,激光雷达、深度相机、谐波减速器这些核心部件的价格比五年前便宜了不止一半。

那这套东西适合谁来学?我个人的判断是三类人。第一类是传统自动化或机械背景的工程师,想往智能化方向转型。第二类是软件开发者,尤其是做AI应用或者后端开发的,想切入机器人赛道。第三类是在校学生或者刚入行的新人,想找一个有前景的技术方向深耕。如果你属于这三类中的任何一类,那从ROS2入手、配合仿真环境、再逐步接触大模型与机器人的结合,是一条比较务实的路径。

我写这篇东西的出发点很简单:把我自己从零开始摸索具身智能机器人的过程、踩过的坑、验证过的方案,尽量完整地整理出来。不搞虚的,直接讲怎么装环境、怎么跑仿真、怎么调参数、怎么把大模型接进来。你如果跟着走一遍,至少能少走两三个月的弯路。

2. 整体学习路径与方案选型思路

2.1 为什么从ROS2而不是ROS1开始

ROS1在2025年已经正式停止维护了,这个时间节点很关键。我见过不少教程还在讲ROS1,但如果你现在入行,直接上ROS2是更明智的选择。ROS2基于DDS通信中间件,天生支持分布式、实时性和多平台,而且Python和C++的接口都比ROS1干净很多。更重要的是,主流仿真工具和硬件驱动的新版本都在往ROS2迁移,你学ROS1等于一入门就在学一个正在被淘汰的东西。

ROS2的版本选择上,我建议直接用Humble。它是LTS版本,支持到2027年,社区资源最丰富,跟Gazebo和Nav2的兼容性也最稳定。Jazzy虽然更新,但生态还在完善中,新手遇到问题搜解决方案会比较痛苦。我自己的主力环境就是Ubuntu 22.04加ROS2 Humble,跑了大半年没出过什么大问题。

2.2 仿真先行还是真机先行

这个问题我被问过很多次。我的答案很明确:仿真先行。原因有三个。第一,真机贵,一台带机械臂的移动平台少说几万块,摔一次可能就报废了。第二,仿真快,你可以在一个下午跑完几百次导航测试,真机可能连充电都不够。第三,仿真可控,你可以精确复现每一次失败,真机上的干扰因素太多,排查问题效率极低。

但仿真不能完全替代真机。我的建议是仿真占七成、真机占三成。仿真里把算法逻辑跑通,真机上验证传感器噪声、通信延迟、机械误差这些仿真里模拟不出来的东西。Gazebo适合做导航和运动规划,MuJoCo适合做足式机器人的动力学控制,Isaac Sim适合做大规模并行训练。新手先从Gazebo入手,资料最多,上手最快。

2.3 大模型在机器人里扮演什么角色

大模型不是用来做底层控制的,它的价值在于“翻译”。把人类的自然语言指令翻译成机器人能理解的任务序列,或者把视觉信息翻译成语义描述。比如你说“去厨房看看煤气关了没”,大模型负责拆解成“导航到厨房→识别煤气灶→判断开关状态→返回结果”这样的子任务,然后交给传统的规划和控制模块去执行。

目前主流的做法是用大模型做任务规划层,用ROS2做执行层,中间通过话题或服务通信。大模型的选择上,如果做本地部署,可以考虑开源的中等规模模型,量化之后消费级显卡也能跑。如果做云端调用,那就看你的网络条件和成本预算了。我自己的方案是本地跑一个量化后的模型做快速响应,复杂任务再走云端。

3. 环境搭建与核心工具链配置

3.1 ROS2 Humble安装的完整流程与避坑点

安装ROS2 Humble看起来简单,但新手最容易在几个地方卡住。首先是系统版本,必须是Ubuntu 22.04,20.04和24.04都不行。我试过在24.04上强行装,依赖冲突能让你怀疑人生。其次是locale设置,不设成UTF-8的话,编译的时候会报一堆莫名其妙的编码错误。

具体步骤是这样的。先设置locale:

sudo apt update && sudo apt install locales sudo locale-gen en_US en_US.UTF-8 sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 export LANG=en_US.UTF-8

然后添加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

最后安装完整版:

sudo apt update sudo apt install ros-humble-desktop

装完之后记得source环境变量,写到.bashrc里省得每次都要手动source:

echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc source ~/.bashrc

注意:如果你之前装过Anaconda或者Miniconda,Python环境可能会冲突。建议在.bashrc里把conda的自动激活关掉,或者用virtualenv隔离ROS2的Python环境。

3.2 Gazebo仿真环境搭建与机器人模型导入

Gazebo在ROS2 Humble里对应的是Gazebo Classic 11,安装命令是:

sudo apt install ros-humble-gazebo-ros-pkgs

装完之后你可以先跑一个官方示例验证:

ros2 launch gazebo_ros gazebo.launch.py

如果能看到Gazebo的界面弹出来,说明基础环境没问题。接下来是导入机器人模型。URDF是ROS里描述机器人结构的标准格式,Xacro是它的升级版,支持宏和参数化。我建议直接用Xacro写模型,维护起来方便很多。

一个最简单的差速小车Xacro模型大概长这样:

<?xml version="1.0"?> <robot xmlns:xacro="http://www.ros.org/wiki/xacro" name="my_robot"> <xacro:property name="wheel_radius" value="0.05"/> <xacro:property name="wheel_width" value="0.02"/> <xacro:property name="base_length" value="0.3"/> <xacro:property name="base_width" value="0.2"/> <xacro:property name="base_height" value="0.1"/> <link name="base_link"> <visual> <geometry> <box size="${base_length} ${base_width} ${base_height}"/> </geometry> <material name="blue"> <color rgba="0 0 1 1"/> </material> </visual> <collision> <geometry> <box size="${base_length} ${base_width} ${base_height}"/> </geometry> </collision> <inertial> <mass value="5.0"/> <inertia ixx="0.1" ixy="0" ixz="0" iyy="0.1" iyz="0" izz="0.1"/> </inertial> </link> <link name="left_wheel"> <visual> <geometry> <cylinder radius="${wheel_radius}" length="${wheel_width}"/> </geometry> </visual> <collision> <geometry> <cylinder radius="${wheel_radius}" length="${wheel_width}"/> </geometry> </collision> <inertial> <mass value="0.5"/> <inertia ixx="0.001" ixy="0" ixz="0" iyy="0.001" iyz="0" izz="0.001"/> </inertial> </link> <joint name="left_wheel_joint" type="continuous"> <parent link="base_link"/> <child link="left_wheel"/> <origin xyz="0 ${base_width/2 + wheel_width/2} -${base_height/2}" rpy="-${pi/2} 0 0"/> <axis xyz="0 0 1"/> </joint> </robot>

这个模型定义了一个长方体车身和两个轮子。实际用的时候还需要加驱动插件,让Gazebo能控制轮子转动。差速驱动插件配置如下:

<gazebo> <plugin name="diff_drive" filename="libgazebo_ros_diff_drive.so"> <ros> <namespace>/demo</namespace> </ros> <update_rate>50</update_rate> <left_joint>left_wheel_joint</left_joint> <right_joint>right_wheel_joint</right_joint> <wheel_separation>${base_width + wheel_width}</wheel_separation> <wheel_diameter>${wheel_radius*2}</wheel_diameter> <max_wheel_torque>20</max_wheel_torque> <max_wheel_acceleration>1.0</max_wheel_acceleration> <command_topic>cmd_vel</command_topic> <odometry_topic>odom</odometry_topic> <odometry_frame>odom</odometry_frame> <robot_base_frame>base_link</robot_base_frame> </plugin> </gazebo>

提示:wheel_separation这个参数一定要算准,它是两个轮子中心之间的距离。如果设错了,机器人走直线会跑偏,转90度会转成80度或者100度。我当初就是把这个参数随手填了个大概值,调了整整一个下午才发现问题。

3.3 Docker容器化ROS2环境的利与弊

用Docker跑ROS2的好处是环境隔离、迁移方便、不怕把主机搞乱。坏处是GUI显示需要额外配置,硬件访问也麻烦一些。我的做法是开发阶段用主机环境,部署和测试用Docker。

Dockerfile大概这样写:

FROM osrf/ros:humble-desktop RUN apt update && apt install -y \ ros-humble-gazebo-ros-pkgs \ ros-humble-nav2-bringup \ ros-humble-slam-toolbox \ python3-pip \ && rm -rf /var/lib/apt/lists/* RUN echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc WORKDIR /ros2_ws

跑容器的时候记得挂载X11 socket和GPU:

docker run -it --rm \ --net=host \ --env="DISPLAY=$DISPLAY" \ --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \ --device=/dev/dri:/dev/dri \ my_ros2_image

注意:--net=host让容器直接用主机网络,ROS2的DDS发现机制在桥接网络下经常出问题,用host模式最省心。GPU挂载是为了让Gazebo能硬件加速,不然仿真帧率会低到没法用。

4. 从仿真到真机的核心实操环节

4.1 用SLAM Toolbox建图的完整操作记录

SLAM是机器人自主导航的基础,建图质量直接决定后续导航效果。我用的是SLAM Toolbox,它在ROS2 Humble里是官方推荐的方案。先安装:

sudo apt install ros-humble-slam-toolbox

启动建图节点之前,你需要先启动Gazebo仿真环境和机器人模型。假设你已经有一个能跑的仿真环境,启动SLAM的命令是:

ros2 launch slam_toolbox online_async_launch.py

然后启动键盘控制节点,手动开着机器人走一圈:

ros2 run teleop_twist_keyboard teleop_twist_keyboard

建图过程中有几个关键点。第一,速度要慢,尤其是转弯的时候,太快会导致激光雷达数据匹配不上。第二,尽量走闭环,就是绕一圈回到起点,这样SLAM算法能通过回环检测修正累积误差。第三,注意看RViz里的地图,如果发现墙壁重影或者地图扭曲,说明参数需要调。

SLAM Toolbox的核心参数在mapper_params_online_async.yaml里,我调过的几个关键参数:

参数名默认值我的建议值作用
resolution0.050.05地图分辨率,单位米/像素
max_laser_range20.012.0激光最大有效距离,室内调小
minimum_travel_distance0.50.3更新地图的最小移动距离
minimum_travel_heading0.50.3更新地图的最小旋转角度
transform_timeout0.20.5TF变换超时,仿真里可以放宽

建完图之后用map_saver保存:

ros2 run nav2_map_server map_saver_cli -f my_map

会生成my_map.pgm和my_map.yaml两个文件,后面导航的时候直接加载就行。

4.2 Nav2导航栈的配置与调参实战

Nav2是ROS2的导航框架,功能很全但配置也复杂。我刚开始的时候被那一堆yaml文件搞得头大,后来理清了逻辑就还好。核心就三块:全局规划器、局部规划器和恢复行为。

全局规划器我用的NavFn,适合静态地图上的最短路径搜索。局部规划器用DWB,适合差速底盘。配置文件nav2_params.yaml里几个关键参数:

controller_server: ros__parameters: controller_frequency: 20.0 min_x_velocity_threshold: 0.001 min_y_velocity_threshold: 0.5 min_theta_velocity_threshold: 0.001 progress_checker_plugin: "progress_checker" goal_checker_plugins: ["general_goal_checker"] controller_plugins: ["FollowPath"] progress_checker: plugin: "nav2_controller::SimpleProgressChecker" required_movement_radius: 0.5 movement_time_allowance: 10.0 general_goal_checker: stateful: True plugin: "nav2_controller::SimpleGoalChecker" xy_goal_tolerance: 0.25 yaw_goal_tolerance: 0.25 FollowPath: plugin: "dwb_core::DWBLocalPlanner" debug_trajectory_details: True min_vel_x: 0.0 max_vel_x: 0.26 max_vel_theta: 1.0 min_speed_xy: 0.0 max_speed_xy: 0.26 acc_lim_x: 2.5 acc_lim_theta: 3.2 decel_lim_x: -2.5 decel_lim_theta: -3.2 vx_samples: 20 vtheta_samples: 40 sim_time: 1.7 linear_granularity: 0.05 angular_granularity: 0.025 transform_tolerance: 0.2

提示:max_vel_x和max_vel_theta要根据你的机器人实际能力来设。设太大了机器人会冲过头,设太小了导航效率极低。我一般先在仿真里试,找到不撞墙的最大值,然后打七折用到真机上。

调参的时候有个技巧:先把所有恢复行为关掉,只留全局和局部规划器,把基本导航跑通。然后再逐个开启恢复行为,观察每个行为在什么情况下触发、效果如何。这样出问题的时候容易定位。

4.3 大模型接入ROS2做任务规划的实操方案

把大模型接进ROS2,核心思路是写一个ROS2节点,订阅语音或文本输入的话题,调用大模型API或者本地推理,把返回的任务序列发布成ROS2的动作或服务调用。

我用Python写了一个简单的任务规划节点,结构是这样的:

import rclpy from rclpy.node import Node from std_msgs.msg import String from geometry_msgs.msg import PoseStamped import json class TaskPlanner(Node): def __init__(self): super().__init__('task_planner') self.subscription = self.create_subscription( String, '/user_command', self.command_callback, 10) self.nav_publisher = self.create_publisher( PoseStamped, '/goal_pose', 10) self.get_logger().info('Task Planner ready.') def command_callback(self, msg): command = msg.data self.get_logger().info(f'Received: {command}') task_plan = self.plan_with_llm(command) self.execute_plan(task_plan) def plan_with_llm(self, command): # 这里调用大模型API,返回JSON格式的任务序列 # 实际使用时替换成你的模型调用代码 prompt = f"""将以下指令拆解为机器人可执行的任务序列, 输出JSON格式,每个任务包含action和target字段: 指令:{command}""" # response = call_your_llm(prompt) # 模拟返回 return [ {"action": "navigate", "target": "kitchen"}, {"action": "detect", "target": "gas_stove"}, {"action": "report", "target": "status"} ] def execute_plan(self, plan): for task in plan: if task["action"] == "navigate": self.navigate_to(task["target"]) elif task["action"] == "detect": self.detect_object(task["target"]) elif task["action"] == "report": self.report_status() def navigate_to(self, location): # 从预定义的位置表中查找坐标 locations = { "kitchen": (2.0, 3.0, 0.0), "living_room": (0.0, 0.0, 0.0), "bedroom": (-1.0, 2.0, 1.57) } if location in locations: x, y, theta = locations[location] goal = PoseStamped() goal.header.frame_id = "map" goal.header.stamp = self.get_clock().now().to_msg() goal.pose.position.x = x goal.pose.position.y = y goal.pose.orientation.z = theta self.nav_publisher.publish(goal) self.get_logger().info(f'Navigating to {location}') def detect_object(self, obj): self.get_logger().info(f'Detecting {obj}') def report_status(self): self.get_logger().info('Task completed.') def main(args=None): rclpy.init(args=args) node = TaskPlanner() rclpy.spin(node) node.destroy_node() rclpy.shutdown() if __name__ == '__main__': main()

这个节点的逻辑很直白:收到指令→调大模型拆解→按顺序执行。实际部署的时候,大模型调用那部分需要处理超时和异常,不然模型响应慢的时候整个节点会卡住。我的做法是把大模型调用放到单独的线程里,主线程继续处理其他回调。

注意:大模型返回的JSON格式不一定每次都正确,一定要加解析失败的兜底逻辑。我遇到过模型返回带markdown代码块标记的JSON,直接json.loads会报错,得先把json和去掉。

5. 常见问题排查与避坑经验实录

5.1 ROS2通信与TF变换的高频问题

ROS2的DDS通信在单机环境下一般没问题,但跨设备或者Docker里跑的时候经常出幺蛾子。最常见的症状是节点之间看不到对方的话题。排查步骤是这样的:先用ros2 node list确认节点是否启动,再用ros2 topic list看话题是否存在,然后用ros2 topic echo看有没有数据。如果话题存在但没数据,大概率是QoS配置不匹配。

QoS是ROS2的新概念,简单说就是通信质量策略。传感器数据一般用SensorDataQoS,普通话题用默认的就行。如果你订阅一个传感器话题但收不到数据,试试在订阅的时候指定QoS:

from rclpy.qos import QoSProfile, ReliabilityPolicy, HistoryPolicy qos = QoSProfile( reliability=ReliabilityPolicy.BEST_EFFORT, history=HistoryPolicy.KEEP_LAST, depth=10 ) self.subscription = self.create_subscription( LaserScan, '/scan', self.scan_callback, qos)

TF变换的问题是另一个高频坑。机器人跑着跑着RViz里模型突然散了,或者导航报“TF timeout”,基本都是TF树的问题。排查用ros2 run tf2_tools view_frames生成TF树图,看看有没有断链或者循环。常见原因是某个link的frame_id写错了,或者时间戳不同步。

问题现象可能原因排查命令解决方法
节点看不到话题QoS不匹配ros2 topic info -v统一QoS配置
TF timeout时间戳不同步ros2 run tf2_tools view_frames检查use_sim_time参数
机器人模型散架URDF关节定义错误check_urdf my_robot.urdf修正joint的parent/child
导航原地转圈局部规划器参数不当ros2 param get调小max_vel_theta
Gazebo帧率极低没启用GPU加速glxinfo安装显卡驱动

5.2 仿真与真机的差异处理经验

仿真里跑得好好的,上真机就翻车,这是常态。我总结了几条经验。第一,传感器噪声。仿真里的激光雷达是完美的,真机上有噪声、有盲区、有反射干扰。解决办法是在仿真里给传感器加噪声模型,提前适应。第二,通信延迟。仿真里话题发布到订阅是微秒级,真机上可能几十毫秒。导航的频率不能设太高,不然真机跟不上。第三,机械误差。仿真里轮子说转90度就转90度,真机上可能只有87度。里程计会累积误差,必须靠激光雷达或者视觉来修正。

我的做法是在仿真里把参数调得“保守”一些,留出余量。比如仿真里最大速度0.5m/s能跑,真机就设0.3m/s。仿真里定位精度1cm,真机就按5cm来设计容错。这样上真机的时候落差不会太大。

5.3 大模型任务规划的可靠性提升技巧

大模型做任务规划最大的问题是“幻觉”——它可能编出一个不存在的动作或者位置。我试过几种方法来提升可靠性。第一种是约束输出格式,用JSON Schema强制模型按固定结构返回。第二种是加白名单校验,模型返回的动作和位置必须在预定义列表里,不在就拒绝执行。第三种是加确认机制,关键动作执行前先发一个确认请求,等人类确认后再执行。

还有一个实用技巧是把常用任务做成模板。比如“去X拿Y”这种指令,直接匹配模板填充参数,不走大模型。只有复杂的长指令才交给大模型拆解。这样既保证了常见任务的响应速度,又保留了处理复杂情况的能力。

提示:大模型的温度参数建议设低一些,0.1到0.3之间。温度高了输出随机性大,任务规划这种场景需要确定性。

6. 产业应用场景与进阶方向

6.1 从实验室到产线的落地案例拆解

具身智能机器人在产业里的应用,目前我看到几个比较实在的方向。第一个是柔性产线上的物料搬运。传统AGV只能走固定路线,具身智能机器人可以动态避障、自主规划路径,换产线的时候不用重新铺磁条或者二维码。第二个是仓储拣选。结合视觉识别和大模型任务规划,机器人可以理解“把货架上第三层左边第二个箱子拿下来”这种指令。第三个是巡检场景。在变电站、化工厂这些环境里,机器人自主导航加异常检测,替代人工巡检。

这些场景的共同特点是:环境半结构化、任务有变化但不算太复杂、对成本敏感。具身智能方案相比传统自动化方案的优势在于部署快、适应性强,劣势在于初期技术门槛高、稳定性需要时间打磨。

6.2 足式机器人与MuJoCo仿真进阶

轮式底盘在平坦地面上效率最高,但遇到楼梯、台阶、崎岖地形就歇菜了。足式机器人是解决这些场景的方向。MuJoCo是目前做足式机器人仿真最好的工具之一,它的接触模型比Gazebo精确很多,适合做动力学控制算法的验证。

MuJoCo的入门门槛比Gazebo高一些,因为它没有ROS2的原生集成,需要自己写桥接。但它的Python接口很干净,适合快速原型验证。我建议的路径是:先在MuJoCo里用Python把控制算法跑通,再移植到ROS2里做系统集成。四足机器人的控制核心是步态生成和平衡控制,这两个在MuJoCo里都有成熟的示例可以参考。

6.3 多机器人协同与集群智能的探索

单机器人能做的事有限,多机器人协同是下一个台阶。ROS2的DDS天生支持多机通信,这是它比ROS1强的地方。多机器人系统的核心问题有三个:任务分配、路径协调、通信拓扑。任务分配可以用拍卖算法或者市场机制,路径协调可以用时空A星或者优先级规划,通信拓扑要看具体场景是集中式还是分布式。

我在仿真里试过三台机器人协同搬运的场景,用ROS2的多机通信加一个中央调度节点。效果还行,但通信延迟和时钟同步是两个大坑。真机上做多机协同,建议先用PTP或者NTP把各机器人的时钟对齐,不然TF变换会乱成一锅粥。

7. 学习资源与工具链推荐

7.1 入门阶段最高效的学习材料组合

市面上的ROS2教程很多,但质量参差不齐。我筛选下来,觉得最高效的组合是:官方文档打底、古月居的ROS2入门教程补实践、再加上一个完整的仿真项目跟做。官方文档的好处是准确,坏处是枯燥。古月居的教程比较接地气,但有些内容偏旧。最好的学习方式是找一个开源项目,把代码clone下来,一行行看懂,然后自己改功能。

书的话,ROS2方面目前没有特别好的中文书,建议直接看官方文档和GitHub上的示例代码。机器人控制算法方面,有一本讲控制理论的书值得看,但名字我记不太清了,核心是PID、LQR、MPC这几个算法,网上资料很全。大模型方面,提示词工程和微调的实战资料很多,找几个GitHub上star多的项目跟着做就行。

7.2 硬件选型与成本控制建议

如果你想上真机,硬件选型是个绕不开的话题。我的建议是分阶段投入。第一阶段用仿真,零成本。第二阶段买一个便宜的差速小车底盘,几百到一千块,配合树莓派或者Jetson Nano,先把ROS2的通信和控制跑通。第三阶段再考虑加激光雷达、深度相机、机械臂这些外设。

激光雷达选单线还是多线?预算有限就单线,几百块能买到,做SLAM和导航够用了。深度相机可以考虑奥比中光或者Intel的入门款,一千左右。机械臂是最贵的部分,建议先租或者借,确认方向后再买。总之一句话:先跑通再升级,别一上来就堆硬件。

7.3 社区与持续学习路径

机器人这个领域更新很快,保持学习节奏很重要。我常逛的几个地方:ROS Discourse论坛、GitHub上的awesome-ros2仓库、还有几个活跃的Discord群组。国内的话,古月居论坛和知乎的机器人话题质量还行。大模型方面,Hugging Face的模型库和Papers With Code是找最新进展的好地方。

学习路径上,我的建议是每三个月定一个小目标。第一个三个月:ROS2基础加Gazebo仿真跑通。第二个三个月:SLAM建图加Nav2导航调通。第三个三个月:大模型接入加一个完整场景的demo。第四个三个月:上真机验证加性能优化。这样一年下来,你就有拿得出手的项目经验了。

最后分享一个我自己的习惯:每次调参或者改代码之前,先把当前能跑的版本备份一份。机器人系统涉及的东西太多,改了一个地方可能影响另一个地方,有备份才能放心折腾。我吃过好几次亏,改崩了回不去,只能从头再来。这个习惯看起来笨,但省下来的时间远超备份花的那几秒钟。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询