免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

MATLAB与CoppeliaSim联合仿真:SCARA机械臂运动学建模与轨迹规划实战

MATLAB与CoppeliaSim联合仿真:SCARA机械臂运动学建模与轨迹规划实战 简介本资源是一套面向机器人控制方向初学者与进阶学习者的MATLABCoppeliaSim联合仿真实践方案聚焦SCARA机械臂的运动学建模、轨迹规划与闭环控制验证解决理论脱离实操、仿真平台衔接不畅等典型学习痛点适用于自动化、机器人工程、控制科学等专业课程设计、毕业设计及科研原型开发。压缩包共9个文件348KB含6个核心MATLAB脚本如运动学正逆解、关节空间三次多项式轨迹规划、同步通信测试等、1个CoppeliaSim场景文件.ttt、1个README说明文档及1个remoteApi.dll通信支持库结构紧凑、即装即用。已有393人学习下载读者可直接复现从DH参数建模、轨迹生成、MATLAB指令下发到CoppeliaSim实时驱动的完整链路掌握跨平台协同仿真的关键配置与调试逻辑并获得可迁移至其他串联机械臂的模块化代码框架与接口调用范例。 这几年机器人仿真相关的项目我接触了不少SCARA是我个人特别推荐用来入门机器人运动控制的一个典型对象。它的结构不算复杂但运动学建模、轨迹规划、控制反馈这些核心环节一个都不少很适合把理论链路完整走一遍。这个项目标题把核心思路写得非常清楚MATLAB 机器人工具箱做理论计算CoppeliaSim 做三维环境仿真验证两者配合完成 SCARA 机械臂从运动学建模到轨迹规划再到运动控制算法验证的闭环。这篇文章我会完全按照实际项目推进的顺序来写包括 DH 参数建模、正逆运动学求解、关节空间与笛卡尔空间轨迹规划、CoppeliaSim 场景搭建、Remote API 联合仿真以及我在实际调试中踩过的一些坑和排查思路。适合正在做机器人方向课程设计、毕业设计或者刚开始接触仿真验证的工程师参考。整个流程跑通之后你会发现换一个机械臂型号、换一个控制目标本质上的套路是一样的。1. 项目整体设计与思路拆解1.1 项目核心需求解析这个项目要做的事情本质上可以拆成四步第一步给 SCARA 机械臂建立完整的运动学模型也就是用 DH 参数法把每个关节的坐标系关系确定下来然后写出正运动学和逆运动学的求解代码。第二步在 MATLAB 机器人工具箱里验证运动学是否正确检查末端位姿的计算结果是否符合物理直觉。第三步设计轨迹规划算法让机械臂从起点到终点走一条平滑、可控、不产生冲击的路径包括关节空间规划和笛卡尔空间直线规划两种方式。第四步把 CoppeliaSim 作为三维仿真环境通过 Remote API 接收 MATLAB 下发的关节目标位置驱动虚拟机械臂运动并采集末端实际位置与理论轨迹进行对比完成运动控制算法的验证。SCARA 机械臂的全称是 Selective Compliance Assembly Robot Arm选择性顺应性装配机械臂。它通常有四个自由度前两个旋转关节控制末端在水平面内的位置第三个移动关节控制末端上下升降第四个旋转关节控制末端绕垂直轴旋转。这个结构特点让它特别适合水平面内的搬运、装配、点胶等场景。项目要求“完整”地完成运动学建模与仿真验证意味着不能只做正解逆解也要推导清楚不能只做关节空间规划笛卡尔空间的运动也要能跑通。1.2 技术选型为什么是 MATLAB 工具箱加 CoppeliaSim先说 MATLAB 机器人工具箱。这里指的是 Peter Corke 维护的 Robotics Toolbox核心函数包括 Link、SerialLink、fkine、ikine、jtraj 等。它的优势在于建模过程可视化函数调用直接调试方便而且工具箱内部对 DH 参数的处理做了很多优化适合把精力集中在算法本身而不是底层矩阵运算上。Python 也有一些机器人库但 MATLAB 在矩阵计算、绘图、数据分析上的体验确实更顺手尤其是后面要做误差曲线、轨迹对比图MATLAB 的绘图能力省了很多事。再说 CoppeliaSim。它以前叫 V-REP是一款跨平台的机器人仿真软件支持多种编程语言远程控制物理引擎可选。它和 MATLAB 的通信通过 Remote API 实现本质上是基于 socket 的客户端-服务器架构。为什么不用 MATLAB 自带的 Simscape 或者直接在 MATLAB 里画三维图因为 Simscape Multibody 建模链路相对繁琐而且视觉反馈不够直观直接在 MATLAB 里画机械臂虽然能看但离“仿真验证”还有距离。CoppeliaSim 的好处是场景真实、关节控制方便、自带碰撞检测和物理引擎而且支持 URDF 导入后面如果要更换机械臂型号或加入视觉传感器扩展性很强。整体技术链路可以概括为一句话MATLAB 负责“大脑”运动学计算、轨迹生成、控制算法CoppeliaSim 负责“身体”三维模型、关节执行、物理反馈。两者通过 Remote API 通信完成一个实时控制闭环。提示这个项目不需要实体机械臂所以特别适合在实验室设备不足或者不想冒损坏风险的情况下先通过仿真把算法验证完整再迁移到实物平台。2. 运动学建模SCARA 的正解与逆解2.1 建立 DH 参数表SCARA 的运动学建模一般用标准 DH 参数法。标准 DH 的核心思想是在每个关节上建立一个坐标系然后用四个参数描述相邻坐标系的变换关系连杆长度 a、连杆扭角 alpha、连杆偏距 d、关节角 theta。四个参数中如果是旋转关节theta 是变量如果是移动关节d 是变量。我以一个常见的四自由度 SCARA 为例各连杆参数可以参考下面的表格。这里我把基座高度、两个水平连杆长度、移动关节行程都做了典型取值方便后续计算演示。关节 ia (m)alpha (rad)d (m)theta (rad)10.20000.100theta120.15000theta2300d304000theta4这个表里体现 SCARA 结构特点的地方在于前两个关节的轴线都是垂直的alpha 为 0所以末端在水平面的位置相当于一个平面两连杆机构第三个关节是移动关节沿垂直方向运动用于控制末端高度第四个关节仍然是绕垂直轴旋转控制末端姿态角。由于所有旋转轴都平行姿态角的方向是 theta1 theta2 theta4。在 MATLAB 里创建这个模型的代码如下% SCARA 机械臂 DH 参数建模 L1 Link([0 0.100 0.200 0]); L2 Link([0 0 0.150 0]); L3 Link([0 0.050 0 0]); % d3 的初始值设为 0.050类型下面会改 L4 Link([0 0 0 0]); % 将第三个关节设为移动关节 L3.jointtype P; scara SerialLink([L1 L2 L3 L4], name, SCARA); % 查看模型参数和结构 scara.display(); scara.teach();注意Link 参数顺序是 [theta d a alpha]和 DH 表顺序略有不同写代码时不要搞混。运行scara.teach()会弹出一个滑块窗口拖动关节变量就能看到机械臂的三维图形随动这是验证 DH 参数是否正确的最直观方式。如果滑块拖动时机械臂的运动方向不符合直觉多半是某个参数的正负号或者坐标系方向标错了。2.2 正运动学求解正运动学的本质就是把四个关节变量代入 DH 变换矩阵依次相乘得到末端坐标系的位姿。用工具箱的fkine函数一行代码就能完成% 给定一组关节变量 q_test [0.3, -0.5, 0.08, 0.2]; % 计算末端位姿 T scara.fkine(q_test);T是一个 4x4 的齐次变换矩阵包含了末端坐标系的位置和姿态信息。比如当 q_test 为[0, 0, 0.08, 0]时末端位置的理论值应该是 x 0.200 0.150 0.350 my 0z 0.100 - 0.08 0.020 m。如果仿真中机械臂末端的实际位置和这个值对不上优先检查零位对齐问题。为了加深理解也可以手动写一遍正解计算不依赖工具箱。SCARA 的末端位置可以拆成水平面和垂直方向两部分% 手动正运动学便于理解几何关系 function [x, y, z, phi] scara_forward(q, L1, L2, d_base) theta1 q(1); theta2 q(2); d3 q(3); theta4 q(4); x L1 * cos(theta1) L2 * cos(theta1 theta2); y L1 * sin(theta1) L2 * sin(theta1 theta2); z d_base - d3; phi theta1 theta2 theta4; end这段代码不需要矩阵运算直接从几何关系出发。用它可以很方便地和工具箱fkine的结果互相验证确保建模没有方向偏反这类低级错误。我的习惯是“工具箱算一遍 手动代码算一遍”两边结果一致才敢继续往下写轨迹规划。2.3 逆运动学求解SCARA 的逆解比六轴机械臂简单太多不需要迭代法可以直接用几何法推导。给定末端的期望位置 (x, y, z) 和姿态角 phi求解思路如下水平面内已知 x 和 y反解二连杆机构的两个关节角 theta1 和 theta2。垂直方向直接解出移动关节的 d3。姿态角减去前两个关节角得到 theta4。具体公式如下function q scara_inverse(x, y, z, phi, L1, L2, d_base) % 计算 theta2注意有两个解 cos_theta2 (x^2 y^2 - L1^2 - L2^2) / (2 * L1 * L2); if abs(cos_theta2) 1 error(目标点超出工作空间); end theta2 acos(cos_theta2); % 这里取正解 % 计算 theta1 k1 L1 L2 * cos(theta2); k2 L2 * sin(theta2); theta1 atan2(y, x) - atan2(k2, k1); % 计算 d3 和 theta4 d3 d_base - z; theta4 phi - theta1 - theta2; q [theta1, theta2, d3, theta4]; end注意acos(cos_theta2)默认返回 0 到 pi 之间的角度对应机械臂“肘部向上”的位形。实际上第二关节也可以取负角度对应“肘部向下”。对于 SCARA 的典型装配任务通常取较小的工作空间解或根据关节限位选择。在实际项目中我会把两个解都算出来再根据当前关节角和关节限位选择离当前位形最近的那组解这样机械臂运动最短且不会撞限位。提示如果目标点位于工作空间边缘或接近奇异位置x^2 y^2会接近L1 L2的平方此时cos_theta2接近 1机械臂处于完全伸直状态逆解退化但依然可解。真正需要注意的反而是接近工作空间中心的情况那里第二关节可能无解。3. 轨迹规划与运动控制算法设计3.1 关节空间轨迹规划轨迹规划要解决的核心问题是机械臂从当前关节角到目标关节角中间过程怎么走。最粗暴的方法是直接一步到位但那样关节速度理论上趋近无穷大实际机械会剧烈冲击。所以必须对轨迹本身做平滑处理。关节空间规划里我推荐优先用五次多项式插值。相比三次多项式五次多项式可以对起点和终点的位置、速度、加速度全部施加约束保证关节运动平稳。工具箱里的jtraj函数就是基于五次多项式实现的% 定义起点和终点关节角 q0 [0, 0, 0.02, 0]; % 起始位形 qt [pi/3, -pi/4, 0.08, pi/6]; % 目标位形 % 规划时间 2 秒采样 50 个点 t linspace(0, 2, 50); [q_traj, qd_traj, qdd_traj] jtraj(q0, qt, t); % 查看各关节位置曲线 figure; plot(t, q_traj(:, 1), LineWidth, 1.5); hold on; plot(t, q_traj(:, 2), LineWidth, 1.5); plot(t, q_traj(:, 3), LineWidth, 1.5); plot(t, q_traj(:, 4), LineWidth, 1.5); xlabel(时间 (s)); ylabel(关节角 (rad)); legend(关节1, 关节2, 关节3, 关节4);跑完这段代码后你会看到每条曲线都是平滑的 S 形起点和终点的速度都为零。这在物理上意味着机械臂从静止开始加速到中间过程再减速到静止没有速度突变对电机和减速器都非常友好。jtraj返回的三个变量分别是位置、速度和加速度。如果要对速度或加速度做限制比如要求关节 1 的最高速度不超过某个值可以适当延长规划时间或者调整采样点数。这是后面做实际运动控制时需要考虑的约束条件。3.2 笛卡尔空间直线轨迹规划关节空间规划虽然平滑但机械臂末端的运动路径在三维空间里是一条曲线不是直线。对于点胶、焊接、装配这类要求末端严格沿直线运动的场景就必须做笛卡尔空间轨迹规划通常叫 Cartesian Linear 或 Cartesian Straight Line。做法并不复杂先在起点和终点的末端位姿之间做直线插值得到一系列中间位姿然后逐点调用逆运动学解出对应的关节角。不过要注意直线插值过程中某个中间点可能超出机械臂工作空间导致逆解失败。所以在实际项目中我会在规划前先做一次可达性检测把路径离散成几百个点逐一判断是否在工作空间内。工具箱里可以用ctraj做笛卡尔位姿插值% 末端起点和终点位姿 T0 scara.fkine(q0); T1 scara.fkine(qt); % 在起点和终点之间插值 50 个位姿 T_vals ctraj(T0, T1, 50); % 对每个位姿求逆解 q_vals zeros(50, 4); for i 1:50 q_vals(i, :) scara.ikine(T_vals(i), q0, q0, mask, [1 1 1 0 0 1]); end这里的mask参数很关键。SCARA 的末端姿态只有绕 z 轴的旋转自由度x、y 方向的旋转自由度不存在所以 mask 要写成[1 1 1 0 0 1]表示只对 x、y、z 平移和绕 z 轴的旋转做误差约束忽略绕 x、y 轴的旋转。如果 mask 不设置或设置错误ikine的迭代结果很容易发散。注意笛卡尔直线轨迹经过逆解后关节角序列可能不平滑尤其是经过奇异点附近时会有突变。如果发现关节角跳变可以增加插值密度同时在仿真中观察是否出现剧烈抖动。3.3 运动控制算法的理论分析与实现思路标题中提到“运动控制算法的理论分析与实践应用”在实际仿真项目中这个“控制算法”可以拆成两层来理解。底层是 CoppeliaSim 内部的关节伺服控制。CoppeliaSim 的 Joint 模块在 Position 模式下自带 PID 控制器MATLAB 只需要给每个关节下发目标位置仿真环境会自动计算力矩让关节转动到目标位置。这层相当于硬件上的伺服驱动器不用我们自己写。上层才是我们真正要实现的运动控制逻辑。最基础的控制方式是“位置前馈”直接把轨迹规划生成的关节角序列按时序发送给 CoppeliaSim。这是在开环工作CoppeliaSim 内部会跟踪目标但外部没有反馈校正。如果要体现“算法”含量更高一点可以在 MATLAB 端做闭环位置控制% 期望终点位置 x_des 0.15; y_des 0.20; z_des 0.04; % 不断读取仿真实际末端位置计算误差并修正 for k 1:100 % 用 Remote API 读取当前末端位置 [x_cur, y_cur, z_cur] get_end_effector_position(clientID, vrep); % 计算位置误差 err_x x_des - x_cur; err_y y_des - y_cur; err_z z_des - z_cur; % 简单的比例控制kg 为增益 x_target x_cur kg * err_x; y_target y_cur kg * err_y; z_target z_cur kg * err_z; % 逆解并下发关节目标 q_target scara_inverse(x_target, y_target, z_target, phi_des); send_joint_angles(clientID, vrep, q_target); end这里展示的是笛卡尔空间的 P 控制器思想根据末端当前位置与期望位置的偏差修正下一步的目标位置再通过逆解转换到关节空间。实际项目中可以在这个基础上加积分项、微分项或者加速度前馈构成完整的闭环控制策略。仿真环境的好处是调整增益系数非常安全不会损坏设备可以从容地观察不同参数下系统的响应特性。4. CoppeliaSim 环境搭建与联合仿真验证4.1 场景创建与机械臂导入CoppeliaSim 自带模型库里就有 SCARA 机械臂模型。打开软件后在左侧 Model Browser 里依次展开robots→non-mobile可以看到 SCARA 相关的模型直接拖拽到场景中即可。这种方式最省事模型自带关节定义和可视化网格。如果你的机械臂是自己设计的或者想要验证一个特定型号可以用 URDF 导入。CoppeliaSim 支持通过插件导入 URDF 文件但要特别注意以下几点单位一定要统一。URDF 里如果用的是毫米导入后默认会被转成米制场景后续 MATLAB 侧也用米两边才能对得上。检查关节类型和运动范围。URDF 导入后关节默认可能是 Force 模式需要手动改成 Position 模式才能接受位置指令。坐标系的初始方向会影响 DH 建模。导入后在场景里让机械臂处于零位姿态与 MATLAB 模型的零位保持一致。如果直接用自带模型场景里机械臂的初始位形不一定和你的 DH 零位一致。这时候不要急着改代码先在 CoppeliaSim 里选中机械臂把每个 Joint 的Value手动设为零观察机械臂的姿态再回 MATLAB 里验证末端位置。两边核对一致后再开始联调。4.2 Remote API 配置与联调CoppeliaSim 和 MATLAB 通信的流程相对固定我整理后如下在 CoppeliaSim 中启动 Remote API 服务器。默认端口是 19997打开场景后会自动启动也可以在Tools菜单里手动确认。在 MATLAB 中将 CoppeliaSim 安装目录下的programming/remoteApi文件夹加入路径。里面有一个remApi.m类文件和编译好的 mex 文件如remApi.mexw64这是 MATLAB 与 CoppeliaSim 通信的桥梁。MATLAB 端建立连接% 加载 Remote API 类 vrep remApi(remoteApi); % 关闭可能残留的连接 vrep.simxFinish(-1); % 连接 CoppeliaSim端口 19997 clientID vrep.simxStart(127.0.0.1, 19997, true, true, 5000, 5); if clientID 0 error(无法连接到 CoppeliaSim请检查服务器是否启动); else disp(连接成功); end获取场景中机械臂各关节和末端对象的句柄[res, j1] vrep.simxGetObjectHandle(clientID, /SCARA/joint1, vrep.simx_opmode_blocking); [res, j2] vrep.simxGetObjectHandle(clientID, /SCARA/joint2, vrep.simx_opmode_blocking); [res, j3] vrep.simxGetObjectHandle(clientID, /SCARA/joint3, vrep.simx_opmode_blocking); [res, j4] vrep.simxGetObjectHandle(clientID, /SCARA/joint4, vrep.simx_opmode_blocking); [res, tip] vrep.simxGetObjectHandle(clientID, /SCARA/tip, vrep.simx_opmode_blocking);这里对象路径的命名要参考场景层级结构。如果机械臂模型在场景里被包在一个子对象下路径可能需要写成/父对象/关节名。拿不准的时候在 CoppeliaSim 的场景层级视图中查看对象的完整路径。下发关节目标位置% 发送四个关节的目标位置 vrep.simxSetJointTargetPosition(clientID, j1, q_target(1), vrep.simx_opmode_streaming); vrep.simxSetJointTargetPosition(clientID, j2, q_target(2), vrep.simx_opmode_streaming); vrep.simxSetJointTargetPosition(clientID, j3, q_target(3), vrep.simx_opmode_streaming); vrep.simxSetJointTargetPosition(clientID, j4, q_target(4), vrep.simx_opmode_streaming);读取末端位置并验证[res, position] vrep.simxGetObjectPosition(clientID, tip, -1, vrep.simx_opmode_blocking);simxGetObjectPosition的第三个参数传-1表示相对于世界坐标系读取位置。返回的position是一个三维向量单位是米。通信模式上我建议先用异步模式把流程跑通。异步模式下MATLAB 发出的指令会立即返回CoppeliaSim 后台执行。异步模式代码简单适合初期验证。如果想做严格的同步验证可以开启同步模式让 MATLAB 控制仿真步进每次触发一步仿真再读取结果。同步模式更稳定、可控但对代码逻辑要求更高容易出现“忘记触发仿真导致卡死”的问题建议在基本流程无误后再切换。4.3 验证结果对比联调跑通后我通常会做一个直线轨迹跟踪测试来验证整套系统的精度。以笛卡尔空间直线轨迹为例从起点 A 到终点 B 走一条直线每隔一段时间记录一次 CoppeliaSim 中末端的位置然后与理论轨迹进行对比。下面是一个典型结果的表格示意不同模型和场景下具体数值会有差异这里展示的是分析逻辑采样点理论 x (m)实测 x (m)理论 y (m)实测 y (m)误差 (mm)10.2500.2490.0000.0011.420.2170.2180.1250.1241.130.1830.1820.1830.1841.240.1500.1510.2000.1991.050.1500.1490.2500.2511.3从表中可以看到典型误差在 1~2 mm 量级。这个误差主要来自三部分一是 Remote API 通信和 CoppeliaSim 仿真步长的离散化二是关节内部 PID 对目标位置的跟踪滞后三是逆解和正解之间数值精度。对于仿真验证而言这个精度已经足够验证运动学算法和控制算法的正确性。如果实测误差明显偏大比如超过 5 mm我会优先检查是不是关节没有完全到位就采集了位置数据。可以增加每段轨迹的等待时间或者用同步模式确保关节到达目标后再读取位置。还有一个隐蔽坑是通讯丢包高频发送指令时某些目标位置没有送达导致关节出现了轻微的反复移动。5. 常见问题与排查技巧实录5.1 典型问题速查表这个项目从头到尾跑一遍遇到最多的问题基本集中在下表这些环节。我把现象、可能原因和解决方法整理在一起方便对着排查。问题现象可能原因解决方法MATLAB 无法连接 CoppeliaSimRemote API 服务器未启动、端口被占用、杀毒软件拦截确认场景已打开并通过 Tools 启动 API 服务换一个端口如 19999临时关闭防火墙测试simxGetObjectHandle 返回错误对象路径写错、对象名不存在在 CoppeliaSim 场景层级视图中核对完整路径注意大小写关节不运动或运动方向反了Joint 模式不是 Position、DH 符号与仿真模型相反把 Joint 的 Mode 改成 Position对比双方运动方向修符号或加负号末端位置与 MATLAB 理论值对不上零位不对齐、单位不一致手动在 CoppeliaSim 中把关节值均设为 0检查末端位置是否与 DH 零位一致逆解报错“超出工作空间”目标点不在 SCARA 可达范围内检查目标点到基座的平面距离确保在 L1L2 半径内且在最小半径之外轨迹执行时末端抖动通信频率过高、指令序列不连续、插值点数太少降低发送频率或增加插值点数确认关节角序列平滑无跳变同步模式下 MATLAB 卡死忘记调用 simxSynchronousTrigger 触发仿真在同步模式下每轮先 simxSynchronousTrigger再 simxGetPingTime 等待笛卡尔轨迹通过奇异点时误差增大逆解在奇异点附近数值敏感规划时避开奇异区域或改用关节空间轨迹5.2 独家调试技巧与避坑心得第一先验证单向指令链路再做闭环控制。我第一次联调时一上来就跑完整轨迹结果完全分不清问题是出在通信、运动学还是控制参数上。后来改成先手动设置一组固定关节角让 CoppeliaSim 里的机械臂动到指定位置确认链路没问题再逐步加入轨迹和闭环逻辑。这个习惯能帮你大幅缩短排查时间。第二零位校准不要靠猜要定量验证。把 MATLAB 模型和 CoppeliaSim 模型都恢复零位比较末端位置。比如我的模型零位时末端位置为 (0.35, 0, 0.02)CoppeliaSim 里如果对不上就微调 DH 参数中的 offset 或者在场景里调整 Joint 的初始 Value。这一步不做扎实后面的所有对比数据都没有意义。第三通信频率不是越高越好。我用过 100 Hz 的频率发送数据结果是 CoppeliaSim 反应不过来偶尔丢包关节运动反而出现抖动。后来把频率降到 20~50 Hz每发送一次目标位置后稍微等待几个仿真步轨迹反而平滑了很多。核心原因是 Joint 内部 PID 需要时间响应频率过高时连续目标之间的差值太小反而让控制失去重点。第四做轨迹对比时记得在 MATLAB 端加时间戳。CoppeliaSim 的仿真时间和 MATLAB 的时钟并不完全同步尤其开启物理引擎后仿真速度可能慢于真实时间。如果不记录对应关系误差分析会失真。我的做法是在 MATLAB 端用tic/toc记录每次采样对应的实际时间保证理论轨迹和实测数据在时间轴上对齐。第五URDF 导入后务必检查关节单位。URDF 通常用弧度但有时转成度CoppeliaSim 里关节角度默认弧度。如果 MATLAB 下发的是弧度CoppeliaSim 里关节却按度解析机械臂的运动会非常奇怪。这个问题排查起来比较隐蔽但一出现就是整体性的错误。最后再分享一个小技巧在联合仿真时可以在 CoppeliaSim 里加一个 Dummy 对象绑定到机械臂末端然后用simxGetObjectPosition读取这个 Dummy 的位置用来代替直接读取机械臂模型本身的末端框架。这样做的好处是位置数据更稳定不受关节内部坐标系方向的影响而且在 CoppeliaSim 视觉上能看到一个明显的参考点方便直观判断末端位置。加上一个 Graph 函数记录当前误差曲线整个运动控制系统的表现一目了然。这个套路在我后续做六轴机械臂和移动机器人项目时也一直在用整体流程完全通用只是换了 DH 参数表和逆解模块而已。本文还有配套的精品资源点击获取
返回列表