MATLAB机器人工具箱机械臂仿真入门:DH建模与轨迹规划全流程
在机械臂仿真这条路上我最早踩的坑就是“工具选错”。一开始想用 SolidWorks 建模再导入仿真结果装配体和坐标系统一折腾就是一下午后来切到 MATLAB 机器人工具箱Robotics Toolbox for MATLAB才真正体会到“写代码建模、拖动滑块看运动、直接输出轨迹曲线”的顺畅感。这篇文章就来分享一套完整的机械臂仿真入门实操基于 Peter Corke 的 Robotics Toolbox 10.4 版本从环境安装、DH 参数建模到正逆运动学、轨迹规划和可视化演示全部用可复现的 MATLAB 代码串起来。本文适合刚接触机械臂仿真的学生、做课程设计的本科生以及想快速验证机器人算法的工程师。读完你至少能掌握三件事第一正确安装并验证机器人工具箱第二用Link和SerialLink搭出你自己的机械臂模型第三完成“从关节角度到位姿、从位姿回到关节角度、再生成运动轨迹”的完整仿真闭环。文中涉及的命令和源码我都会逐行解释版本差异也会单独说明避免你因为工具箱 API 变化而卡在第一步。先说清楚一个容易混淆的概念本文讲的“机器人工具箱”是 Peter Corke 开发的开源工具箱 Robotics Toolbox不是 MATLAB 官方的 Robotics System Toolbox。两者名字相近功能侧重完全不同。后者偏 ROS 联合仿真、导航和 UAV 控制前者则以串联机械臂的运动学、动力学、轨迹规划见长特别适合课堂教学和算法原型验证。后续文章中如果提到“机器人工具箱”指的都是前者。1. 背景与核心概念1.1 机械臂仿真到底在仿真什么机械臂仿真并不是“画一个好看的 3D 模型然后转一转”而是要在计算机里建立机械臂的数学模型用数值方式计算机器人的运动状态。核心包括四个方面运动学描述用 DH 参数描述连杆和关节之间的关系。正运动学求解已知关节角度求末端执行器的位置和姿态。逆运动学求解已知末端位姿反推关节角度。轨迹规划在关节空间或笛卡尔空间生成平滑的运动轨迹。MATLAB 机器人工具箱的最大价值就是把这些底层数学计算封装成稳定的函数和类。你不需要每次手推旋转矩阵和变换矩阵只需要把 DH 参数表告诉它工具箱就能自动生成机械臂模型并为你提供可视化、数值求解和轨迹规划能力。1.2 为什么选择 MATLAB 机器人工具箱做教学市面上可以做机械臂仿真的工具不少比如 Gazebo、CoppeliaSimV-REP、Adams、Webots但 MATLAB 机器人工具箱在教学场景下有几个独特优势上手门槛低不需要像专业仿真软件那样先学界面操作只要会写 MATLAB 脚本就能开始。数学透明工具箱所有核心算法都以源码形式提供适合学习原理。可视化直观teach命令可以打开滑块窗口拖动关节滑块机械臂模型实时响应。生态成熟从运动学到轨迹规划再到动力学和控制接口风格统一学习路径清晰。简单说如果你想快速验证一个机械臂算法或者想弄清 DH 参数、正逆解这些基础概念MATLAB 机器人工具箱是最合适的起点。1.3 10.4 版本需要注意什么Robotics Toolbox 10.x 是一个变化较大的版本。它和旧版 9.x 最大的区别在于开始依赖 Spatial Math Toolbox因此部分函数返回值类型发生了变化。最典型的就是fkine函数旧版直接返回 4x4 齐次变换矩阵新版本返回的是一个SE3位姿对象。这个变化会在后面的代码示例中具体体现。我的建议是如果你的 MATLAB 版本较新优先安装 10.x 版本并习惯新的对象式写法如果你用的教材是旧版代码中fkine的返回值处理需要额外留意。每个版本的具体支持范围不一样建议安装前查看工具箱自带的 README 或发布说明确认和当前 MATLAB 版本兼容。2. 环境准备与工具箱安装2.1 环境需求本文的代码示例在 Windows 10/11 下的 MATLAB R2022a 环境验证过但这不是硬性要求。机器人工具箱的安装思路和代码语法在 R2020a 到 R2023a 之间基本一致如果你的版本稍有不同可以按下面思路自行调整。需要说明的是不同版本的机器人工具箱对 MATLAB 最低版本要求不同。安装前请先确认MATLAB 版本是否满足工具箱的系统要求是否已经安装 MATLAB 的 Simulink 基础组件如果只做运动学仿真不是必须但后续动力学和 Simulink 联合仿真会用到是否具备工具箱解压目录的写权限。2.2 下载与安装机器人工具箱的安装方式很简单本质就是“把工具箱代码下载到本地然后把路径加入 MATLAB 搜索路径”。我推荐两种安装方式方式一通过 MATLAB 的 Add-On Explorer 安装。在 MATLAB 菜单栏选择“主页”选项卡点击“附加功能”在搜索框中输入Robotics Toolbox找到 Peter Corke 发布的 Robotics Toolbox for MATLAB直接点击安装。这种方式会处理依赖关系还会自动安装 Spatial Math Toolbox。方式二手动下载安装。从 Peter Corke 的个人主页或 GitHub 仓库下载工具箱压缩包解压后打开 MATLAB在“主页”选项卡中点击“设置路径”将解压后的工具箱根目录及其子文件夹添加到搜索路径中。也可以使用命令addpath(genpath(D:\Toolbox\robotics-toolbox-10.4)); savepath;注意这里的路径要换成你本机实际解压位置。genpath会递归把目录下所有子文件夹都加入路径savepath会保存路径设置避免下次启动 MATLAB 又失效。2.3 验证安装是否成功安装完成之后先验证一下工具箱是否被正确识别。在 MATLAB 命令窗口输入startup_rvcstartup_rvc是机器人工具箱自带的启动脚本运行后如果没有任何报错通常说明核心路径已经配置成功。再运行一条命令检查核心类是否存在which SerialLink.m如果返回了SerialLink.m的文件路径说明工具箱已经被 MATLAB 找到了。接下来可以试着加载工具箱自带的 PUMA560 机械臂模型mdl_puma560运行后工作区会出现p560、qz、qr、qn等变量。其中p560是一个SerialLink对象qz是零角度关节向量qr是机械臂的“就绪位形”qn是“名义位形”。能成功执行这段命令说明环境已经完好。2.4 安装阶段常见问题如果安装后出现“未定义函数或变量 SerialLink”大概率是路径没有添加成功或者工具箱依赖的 Spatial Math Toolbox 没有一起加入路径。如果出现版本不兼容报错比如提示某个函数找不到建议检查工具箱版本是否和 MATLAB 版本匹配优先下载最新发布版。3. 机械臂建模基础DH 参数与 SerialLink3.1 先理解 DH 参数DH 参数Denavit-Hartenberg 参数是描述相邻连杆坐标系之间关系的标准方法。每个连杆用四个参数表示theta绕 Z 轴的关节角对于旋转关节来说是变量d沿 Z 轴的连杆偏距a沿 X 轴的连杆长度alpha绕 X 轴的连杆扭角。这四个参数构成一个 4x4 齐次变换矩阵描述的是“从当前关节坐标系变换到下一个关节坐标系”的关系。所有连杆的变换矩阵依次相乘就得到末端执行器相对于基坐标系的位姿。在机器人工具箱中Link对象用来表示一个连杆它内部存储了这四个 DH 参数。默认使用标准 DH 表示法。如果使用修正 DH 表示法创建SerialLink时需要额外指定robot SerialLink([L1 L2], modified);初学者最容易在这里混淆。标准 DH 和修正 DH 的区别在于坐标系的附着位置不同同一台机械臂的 DH 参数表会因此不同。建议先选定一种表示法并坚持使用不要混用。3.2 Link 对象的基本用法Link构造函数支持参数名和参数值成对出现的写法可读性更好。看一个最简单的二连杆机械臂示例% 文件路径demo_2link.m clear; clc; close all; % 创建两个连杆对象 % d0, a1, alpha0默认 theta 为关节变量 L1 Link(d, 0, a, 1, alpha, 0); L2 Link(d, 0, a, 1, alpha, 0); % 将两个连杆组装成串联机械臂 two_link SerialLink([L1 L2], name, two_link); % 打印机械臂连杆参数表 two_link.display(); % 打开示教窗口 two_link.teach();在这个示例中两个连杆长度a都为 1相当于一个平面二连杆机械臂。运行display()后MATLAB 会打印每个连杆的 DH 参数表方便核对建模是否正确。teach()会打开一个 GUI 窗口里面有每个关节对应的滑块。拖动滑块机械臂的二维线段模型会实时变化。对于新手来说这是理解“关节角度变化如何影响末端位置”的最好工具。3.3 给连杆设置关节限位实际机械臂每个关节都有运动范围。如果不设置关节限位teach窗口中的滑块范围就是默认的[-pi, pi]这往往和真实机械臂不符。可以通过qlim参数为连杆添加关节限位L1 Link(d, 0, a, 1, alpha, 0, qlim, [-pi/2 pi/2]); L2 Link(d, 0, a, 1, alpha, 0, qlim, [-pi/3 pi/3]);qlim是一个 1x2 的行向量表示关节角度的上下限。设置之后示教窗口的滑块范围会自动调整为指定区间轨迹规划时如果超出范围也更容易被人工发现。3.4 创建一个六自由度机械臂模型二连杆模型适合理解概念但实际教学和算法验证通常需要六自由度机械臂。下面演示如何根据 DH 参数表创建六自由度关节型机械臂模型。这里的 DH 参数参考常见六轴工业机械臂的结构特点核心是演示建模范式不严格对应任何具体品牌型号。% 文件路径demo_6r_robot.m clear; clc; close all; % 六自由度机械臂 DH 参数 L1 Link(d, 0.33, a, 0, alpha, -pi/2, qlim, [-pi pi]); L2 Link(d, 0, a, 0.30, alpha, 0, qlim, [-pi pi]); L3 Link(d, 0, a, 0.03, alpha, -pi/2, qlim, [-pi pi]); L4 Link(d, 0.33, a, 0, alpha, -pi/2, qlim, [-pi pi]); L5 Link(d, 0, a, 0, alpha, pi/2, qlim, [-pi pi]); L6 Link(d, 0.06, a, 0, alpha, 0, qlim, [-pi pi]); robot6 SerialLink([L1 L2 L3 L4 L5 L6], name, my6R); % 展示模型信息 robot6.display(); % 示教 robot6.teach();这段代码创建了一个具有 6 个旋转关节的机械臂模型。注意这里用的alpha都是弧度制MATLAB 三角函数默认使用弧度这一点要格外小心。如果把alpha误写成 90 而不是pi/2模型形状会完全错误。3.5 建模过程中最常见的错误DH 参数建模的报错通常不是语法错误而是模型形状和预期不符。常见错误包括alpha使用了角度值而不是弧度值标准 DH 和修正 DH 混用连杆顺序写反导致机械臂结构镜像或错位d和a的含义搞混导致连杆长度和偏距颠倒。建议每建完一个模型都先运行teach()拖动关节观察各关节转动是否符合物理直觉再做后续运动学计算。4. 正运动学与逆运动学仿真4.1 正运动学fkine 函数正运动学解决的是“已知关节角求末端位姿”的问题。在机器人工具箱中SerialLink对象的fkine方法负责这件事。先加载工具箱自带的 PUMA560 机械臂作为示例mdl_puma560然后计算零位形下的末端位姿% 零角度位形 T p560.fkine(qz);在 10.x 版本中T是一个SE3对象而不是朴素的 4x4 矩阵。你可以直接显示它disp(T)如果想得到 4x4 数值矩阵使用T_matrix T.T;这里的第一个T是变量名第二个.T是SE3对象的一个属性表示对应的 4x4 齐次变换矩阵。如果你的工具箱版本是 9.10 之前fkine可能直接返回 4x4 矩阵此时不需要.T这一步。齐次变换矩阵的结构是| R11 R12 R13 px | | R21 R22 R23 py | | R31 R32 R33 pz | | 0 0 0 1 |左上角 3x3 是旋转矩阵描述末端姿态右上角 3x1 是平移向量描述末端位置。初学者拿到矩阵后不知道看什么最简单的做法是分别提取位置和姿态position T_matrix(1:3, 4); rotation T_matrix(1:3, 1:3);4.2 逆运动学ikine 函数逆运动学是正运动学的反问题已知末端位姿求关节角度。机器人工具箱提供的ikine方法采用数值迭代求解因此需要关注初值和收敛性问题。仍然以 PUMA560 为例先由一组已知关节角生成目标位姿再反解% 已知关节角生成目标位姿 q_known qr; T_target p560.fkine(q_known); % 逆运动学求解 q_solution p560.ikine(T_target);这里qr是 PUMA560 的一个典型位形。理论上q_solution应该和q_known很接近。不过由于数值迭代存在多解且初值可能影响收敛结果两者不一定完全相等需要对比验证。如果想指定初始关节角在版本支持的情况下可以这样写q_solution p560.ikine(T_target, q0, qz);指定一个合理的初值可以有效提高求解成功率和收敛速度。4.3 逆运动学求解失败怎么办ikine本质上是求数值解遇到以下几种情况很容易失败目标位姿超出了机械臂的可达工作空间目标位姿位于奇异位形附近初值选择不合理迭代陷入局部极值机械臂自由度不足无法同时满足位置和姿态要求。排查时先确认目标位置是否在工作空间内再尝试更换不同的初始关节角或者把目标位姿拆成位置和姿态两部分分别验证。对于满足球腕结构的六自由度机械臂还可以尝试解析法工具箱中部分版本提供了类似ikine6s的方法专门用于球腕型六自由度机械臂的解析求解。4.4 位姿验证方法做逆运动学仿真一定要养成“正解回代验证”的习惯。求解得到关节角后再调用fkine算回末端位姿和原始目标位姿比较T_check p560.fkine(q_solution); % 比较位置误差 pos_error norm(T_target.T(1:3, 4) - T_check.T(1:3, 4)); fprintf(位置误差%.6f\n, pos_error);如果误差在1e-6量级以下说明求解结果正确。这个流程在工程实践中很有价值能避免“表面看上去算出来实际上完全不对”的问题。4.5 运动学仿真的完整示例下面把正逆运动学串成一个完整脚本% 文件路径demo_kinematics.m clear; clc; close all; % 加载 PUMA560 模型 mdl_puma560; % 目标关节角 q_target [0.2 0.5 -0.4 0.3 0.6 0.8]; % 正运动学 T_target p560.fkine(q_target); fprintf(末端位置\n); disp(T_target.T(1:3, 4)); % 逆运动学 q_result p560.ikine(T_target, q0, qz); % 显示逆解结果 fprintf(原关节角); disp(q_target); fprintf(逆解关节角); disp(q_result); % 正解回代验证 T_check p560.fkine(q_result); pos_error norm(T_target.T(1:3, 4) - T_check.T(1:3, 4)); fprintf(位置误差%.6f\n, pos_error);这段代码演示了完整的运动学仿真闭环。运行后如果位置误差接近 0说明正逆运动学计算链路没有问题。5. 轨迹规划与动画演示5.1 关节空间轨迹规划jtraj机械臂执行任务时需要从当前位形平滑运动到目标位形。最常用的方法是关节空间轨迹规划即对每个关节的角度进行插值。工具箱中的jtraj函数基于五次多项式插值默认起点和终点的速度、加速度均为 0保证运动平滑% 定义时间向量 t 0:0.05:2; % 起始关节角 q0 qz; % 目标关节角 q1 [0.5 0.8 -0.6 0.2 0.4 0.3]; % 关节空间轨迹规划 [q, qd, qdd] jtraj(q0, q1, t);其中q是每个时刻的关节角度矩阵大小为length(t) x 6qd是每个时刻的关节速度qdd是每个时刻的关节加速度。如果希望指定起点和终点的速度可以传入额外的参数[q, qd, qdd] jtraj(q0, q1, t, [0 0 0 0 0 0], [0 0 0 0 0 0]);对于大多数入门场景默认参数已经足够。5.2 笛卡尔空间轨迹规划ctraj关节空间轨迹规划的特点是关节角度平滑但末端执行器的运动轨迹不一定是直线。如果需要末端走直线就要使用笛卡尔空间轨迹规划。ctraj函数用于在位姿之间进行插值% 起止位姿 T0 p560.fkine(q0); T1 p560.fkine(q1); % 笛卡尔空间插值 Ts ctraj(T0, T1, length(t));Ts是一个位姿序列其中包含length(t)个中间位姿。需要注意的是在 10.x 版本中T0和T1是SE3对象新版本工具箱支持直接传入如果你的工具箱版本较旧T0和T1是 4x4 矩阵ctraj的用法也保持一致。得到笛卡尔轨迹后可以通过逆运动学将每个中间位姿转换成关节角序列% 将笛卡尔轨迹逐点逆解为关节轨迹 q_traj p560.ikine(Ts);这样就把直线轨迹转化成了可以驱动机械臂运动的关节角度序列。5.3 可视化与动画轨迹规划完成后用plot方法播放机械臂运动动画figure; p560.plot(q);p560.plot(q)会打开一个三维图形窗口逐帧显示机械臂从初始位形运动到目标位形的过程。这个函数会自动调整视角并显示坐标轴是教学中很直观的演示工具。如果想对比多个轨迹可以打开多个图形窗口figure; p560.plot(q_traj);此外还可以在轨迹动画中叠加显示末端执行器的运动轨迹。一种简单的做法是在循环中记录末端位置并绘制figure; p560.plot(q); hold on; pos zeros(length(t), 3); for i 1:length(t) T_i p560.fkine(q(i, :)); pos(i, :) T_i.T(1:3, 4); end plot3(pos(:,1), pos(:,2), pos(:,3), r-, LineWidth, 2);注意这里T_i如果是SE3对象需要用.T取出矩阵。如果是旧版本T_i本身就是矩阵可以直接索引。5.4 完整轨迹规划示例将关节空间轨迹规划、笛卡尔轨迹规划和可视化整合到一个脚本中% 文件路径demo_trajectory.m clear; clc; close all; % 加载模型 mdl_puma560; % 时间向量 t 0:0.05:2; % 起止关节角 q0 qz; q1 [0.5 0.8 -0.6 0.2 0.4 0.3]; % 1. 关节空间轨迹规划 [q, qd, qdd] jtraj(q0, q1, t); % 绘制关节角变化曲线 figure; plot(t, q); xlabel(时间(s)); ylabel(关节角(rad)); legend(J1,J2,J3,J4,J5,J6); title(关节空间轨迹); % 播放动画 figure; p560.plot(q); % 2. 笛卡尔空间轨迹规划 T0 p560.fkine(q0); T1 p560.fkine(q1); Ts ctraj(T0, T1, length(t)); % 逆解为关节轨迹 q_traj p560.ikine(Ts); % 播放动画 figure; p560.plot(q_traj); % 绘制末端位置变化曲线 pos zeros(length(t), 3); for i 1:length(t) T_i p560.fkine(q_traj(i, :)); pos(i, :) T_i.T(1:3, 4); end figure; plot3(pos(:,1), pos(:,2), pos(:,3), b-, LineWidth, 1.5); xlabel(X(m)); ylabel(Y(m)); zlabel(Z(m)); title(末端笛卡尔轨迹); grid on;运行这段脚本会依次显示关节角曲线、关节空间动画、笛卡尔轨迹动画和末端位置曲线。对新手来说这一套流程可以完整看到“规划到底做了什么”。5.5 两种轨迹规划怎么选关节空间轨迹规划计算简单不会出现笛卡尔空间中的奇异问题适合点到点运动笛卡尔空间轨迹规划适合需要末端走直线、走圆弧等有明确路径要求的场景但可能因路径经过奇异点而导致逆解失败。实际工程中可以先做笛卡尔路径规划再做逆解如果逆解失败则退回到关节空间规划或者对路径做平滑避让处理。6. 常见问题与排查思路MATLAB 机器人工具箱虽然方便但新手容易在几个固定地方卡住。下面整理一份高频问题排查表。问题现象常见原因解决思路运行SerialLink报“未定义函数或变量”工具箱路径未添加到 MATLAB 搜索路径重新执行addpath(genpath(...))并savepath启动时报缺少依赖类只装了 Robotics Toolbox没装 Spatial Math Toolbox确认依赖工具箱已安装并加入路径fkine返回值不是 4x4 矩阵10.x 版本返回SE3对象用T.T取出数值矩阵或直接使用对象方法ikine求解结果错误或不收敛目标位姿超出工作空间或初值不合适检查目标可达性换初值或分步求解teach窗口滑块范围不符合预期连杆没有设置qlim在Link中显式设置qlim参数模型形状和真实机械臂不同DH 参数表有误或标准/修正 DH 混用核对每个连杆的alpha和a统一 DH 表示法动画刷新很慢轨迹点过多或电脑配置不足增大时间步长减少轨迹点数量plot3d没有三维模型文件工具箱自带的plot3d需要额外的模型文件改用plot绘制线框模型排查建议遇到问题先看错误信息然后检查工作区变量类型。比如fkine返回的结果新老版本类型不同很多报错都源于“以为它是矩阵结果它是对象”。7. 最佳实践与工程建议7.1 建模阶段的规范机械臂建模是整个仿真链路的地基。建模时建议遵循以下几条规范写一个单独的参数文件或函数把 DH 参数集中管理方便后续修改每个关节都显式设置qlim保证示教和轨迹规划不越界机械臂模型保存成.mat文件或独立脚本避免每次重写在注释中标注 DH 参数来源方便追溯。一个比较推荐的结构是把机械臂定义封装成函数function robot createMyRobot() L1 Link(d, 0.33, a, 0, alpha, -pi/2, qlim, [-pi pi]); L2 Link(d, 0, a, 0.30, alpha, 0, qlim, [-pi pi]); L3 Link(d, 0, a, 0.03, alpha, -pi/2, qlim, [-pi pi]); L4 Link(d, 0.33, a, 0, alpha, -pi/2, qlim, [-pi pi]); L5 Link(d, 0, a, 0, alpha, pi/2, qlim, [-pi pi]); L6 Link(d, 0.06, a, 0, alpha, 0, qlim, [-pi pi]); robot SerialLink([L1 L2 L3 L4 L5 L6], name, my6R); end这样在任意脚本中都可以直接调用整体结构清晰。7.2 运动学仿真中的验证习惯不要轻易相信一次计算的结果。无论是正运动学还是逆运动学建议都做交叉验证正解回代逆解得到的关节角再正解回来和原始位姿对比多初值对比同一目标位姿用不同初值多次求解观察结果是否一致可视化确认用teach或plot观察机械臂是否到达预期位置。这些习惯在写论文和做项目时都能减少大量“算错了还不知道错在哪里”的时间。7.3 轨迹规划与可视化优化对于轨迹规划有几个实际建议时间步长不必过小采样点 20 到 50 个通常足够展示动画效果如果轨迹点很多不要把每个点都存储可以边算边画关节角曲线图建议添加图例标注每个关节需要导出图片时使用saveas(gcf, filename.png)保存当前图形窗口。还要注意绘制动画前先figure创建新窗口避免覆盖之前的曲线图。多个动画进行比较时可以适当调整视角让机械臂朝向更直观。7.4 从仿真走向工程MATLAB 机器人工具箱适合做算法验证和教学演示但真正的工程落地还需要考虑控制周期、动力学模型、碰撞检测等现实因素。建议学习顺序是先做运动学仿真理解位姿和关节角的关系再做轨迹规划理解不同空间规划的区别然后引入雅可比矩阵分析机械臂的速度和奇异位形最后研究动力学模型和控制算法。每一步都可以在工具箱中找到对应函数循序渐进不要一上来就碰最复杂的部分。8. 总结与下一步学习路线这篇教程带你完整走了一遍 MATLAB 机器人工具箱 10.4 的机械臂仿真流程从工具箱安装、DH 参数建模到正逆运动学求解、轨迹规划和动画演示。现在你应该能够做到独立安装并验证机器人工具箱用Link和SerialLink建立任意串联机械臂模型使用fkine和ikine完成正逆运动学求解使用jtraj和ctraj规划机械臂运动轨迹通过teach和plot完成可视化与调试。如果只看不练很难真正掌握机械臂仿真。建议你打开 MATLAB先运行本文给出的二连杆示例再尝试把六自由度机械臂模型改成你熟悉的任何一台真实机械臂参数最后用jtraj规划一段运动观察关节角和末端轨迹的变化。这个过程会帮助你建立对机械臂运动学的直觉。后面我计划继续更新机器人工具箱的进阶内容包括雅可比矩阵与速度分析、动力学建模、工作空间可视化以及和 Simulink 结合的联合仿真方法。如果你对某个方向更感兴趣可以在评论区留言告诉我。机械臂仿真这条路核心不在于背会多少函数而在于真正动手把一个模型“动”起来再在运动过程中发现问题、解决问题。看完这篇文章建议你从最简单的示例开始一步一步构建自己的机械臂仿真环境。