尧图精选

机器人空间描述与坐标变换:旋转矩阵、欧拉角与齐次变换

🕒 发布时间:2026/10/2 19:22:01 📁 来源:尧图网络
1. 先把问题摆清楚机器人为什么非要和坐标系较劲带过几届做机器人方向的学生和实习生我发现一个挺有意思的规律真正让大家在入门阶段卡住的往往不是后面的雅可比矩阵也不是动力学方程而是第一章的空间描述与坐标变换。这章看起来全是矩阵乘法符号简单但真到了要写代码、要对接相机、要调试机械臂末端位置的时候一堆人就开始怀疑人生——明明公式背下来了结果算出来的位置就是差那么几厘米或者方向整个反了。这篇东西我想按一个真实项目从业者的角度把机器人学里最基础也最容易被敷衍过去的这块讲透。核心就三件事位置怎么描述、姿态怎么描述、把两者拼起来之后怎么在不同坐标系之间来回换算。关键词就是空间描述和坐标变换。不管你是刚翻开教材的在校生还是从别的方向转过来做机械臂、移动机器人、视觉伺服这套东西都是绕不过去的地基。地基没打牢后面学正逆运动学、轨迹规划、手眼标定全都是空中楼阁。我会从最直白的物理场景切入一层层把位置矢量、旋转矩阵、欧拉角、四元数、齐次变换矩阵讲清楚然后手把手算一遍两连杆机械臂的正运动学最后把我自己踩过的坑、调试时用过的自检方法整理出来。目标是让你看完之后能自己推公式、能自己写代码验证、遇到问题时知道从哪儿下手排查而不是只会套书上的结论。1.1 一个真实场景机械臂为什么抓不到那个杯子先别急着上数学。假设你面前有一台六轴机械臂工作台上放着一个杯子相机装在机械臂之外的支架上。相机说杯子在我的坐标系里的位置是(0.32, -0.11, 0.45)。你把这三个数原封不动发给机械臂控制器让它去抓。结果机械臂要么扑空要么直接撞到桌子。问题出在哪三个数本身没错错在它所属的坐标系不是机械臂基座坐标系。相机有相机自己的坐标系机械臂底座有基座坐标系末端夹爪有工具坐标系杯子还有它自己的物体坐标系。任何一个位置离开坐标系谈都是废话。你要做的事情是把同一个物理点在多个坐标系之间做变换让所有信息统一到同一个参照系下再计算。这就是空间描述和坐标变换要解决的核心问题也是机器人学区别于普通几何的第一道门槛。我经常跟新人说机器人学的本质之一就是坐标系的管理学。你能把项目里所有的坐标系画成一张清晰的树状图说明谁相对谁、变换怎么传递这个项目基本就成功一半了。反过来坐标系关系一团乱麻代码写得再花哨也是白搭。1.2 空间描述到底在描述哪几件事严格来说描述一个刚体在空间中的状态需要两组信息缺一不可。第一组是位置也就是这个刚体的参考点相对于某个坐标系原点的偏移用三个数就能表示。第二组是姿态也就是这个刚体的朝向也就是它自己的坐标轴相对于参考坐标系的三个轴是怎么转过去的。位置加姿态业内叫位姿英文pose这是一个整体概念不是两个可以随便拆开的东西。很多人初期会把位姿当成一个六个数的数组觉得六个数互相独立。实际上姿态的三个自由度是非线性的、耦合的这也是后面所有麻烦的根源。位置那部分你可以放心大胆地做加减法姿态那部分就不行姿态的相加其实对应的是旋转矩阵相乘顺序还有讲究。把这个区别刻在脑子里后面很多坑能提前避开。还有第三层容易被忽略的东西点和向量的区别。点代表空间中的一个具体位置它依赖坐标系原点向量代表方向和大小跟原点在哪没关系。在做齐次变换的时候点会被平移影响向量不会。这个区别在写代码时如果不注意就会出现把工具坐标系方向向量也平移了一次这种低级但致命的错误。1.3 新手最容易走偏的三个认知第一个误区是把旋转矩阵当成普通矩阵。旋转矩阵不是随便九个数的方阵它有两个硬性约束每一列都是单位向量且任意两列互相垂直这叫正交性行列式必须等于正一不能是负一。满足这两个条件它才是一个合法的旋转。手动赋值或者数值积分之后不重新正交化矩阵就会慢慢漂移算出来的姿态越来越歪。第二个误区是以为变换顺序无所谓。先绕X转再绕Y转和先绕Y转再绕X转结果通常完全不同。旋转不可交换这是根本性质。实际工程里必须明确约定先转哪个轴、是绕固定轴还是绕自身轴这个约定不写清楚两个人对接接口时一定会对不上。第三个误区是忽视单位与角度制。这类错误太常见了代码里传进去的是角度函数内部以为是弧度结果末端直接飞出一个诡异的轨迹。90%的诡异bug其实来源都很平庸不是算法错了是坐标、单位、顺序这类约定问题。2. 位置与姿态的数学表达从矢量到旋转矩阵搞清楚问题之后我们开始上工具。这一节的核心是把怎么把位置和姿态写成数学对象这件事讲明白并且说清楚每种表示法各自的适用场景和代价。选哪种表示法是个典型的工程权衡不是越高级越好。2.1 位置矢量最简单也最容易想当然的一层位置的表示没有任何玄机。在某个坐标系A下一个点P的位置就是一个三行一列的列向量记作P的坐标三个分量分别是它在该坐标系三个轴上的投影。就这么简单但有几个细节必须抠。第一列向量的写法是行业惯例因为它能直接和旋转矩阵做矩阵乘法也就是R乘以P。这种约定让后续推导特别顺。如果你按行向量写就得改成左乘P的转置公式形式会变容易出错。第二位置矢量本质上是从坐标系原点到该点的有向线段它的数值依赖原点选择。换一个原点数值全变。所以在团队协作里永远要标注清楚这个坐标是相对于谁的。第三符号记法要有层次。一般我会用上标标出参考坐标系用下标标出被描述对象比如P在A坐标系下的表示。这种记号在推导多级变换时能救命因为它逼着你写清楚每个量到底属于谁。我见过太多人因为符号不统一推着推着就把两个坐标系的量加到一起了。2.2 旋转矩阵九个数的外壳四个约束的内核姿态用旋转矩阵表示就是一个3×3的方阵它的每一列分别是物体自身坐标系的三个轴X、Y、Z在参考坐标系下的方向。理解这一句话非常关键旋转矩阵的列就是新坐标系的轴在老坐标系里长什么样。这么理解比死记绕着某轴转多少度要直观得多。它表面上写了九个数实际上只有三个独立自由度剩下六个都被约束条件锁死了。约束就是前面说的正交性和行列式为正一。为什么是正交因为坐标轴之间必须两两垂直且长度为一。为什么行列式必须是正一因为纯旋转不改变体积、不产生镜像翻转。这两条是判断一个矩阵到底是不是合法旋转的硬标准也是写自检代码时的第一条检查。提示只要你在代码里对旋转矩阵做过累加、插值或者积分就一定要在关键节点做一次正交化校验否则误差会像雪球一样滚大。还有一点经常被忽略旋转矩阵是正交矩阵它的转置等于它的逆。这个性质带来巨大的计算便利——求一个旋转的逆直接转置就行不用做任何数值求逆又准又快。这个性质在下一节讲逆变换时会反复用到。2.3 三个基本旋转矩阵与它们的记忆技巧绕单一坐标轴的旋转是构建所有姿态的基础零件一共就三个。绕Z轴转θ的旋转矩阵长这样Rz(θ) [ cosθ -sinθ 0 sinθ cosθ 0 0 0 1 ]绕X轴转θRx(θ) [ 1 0 0 0 cosθ -sinθ 0 sinθ cosθ ]绕Y轴转θRy(θ) [ cosθ 0 sinθ 0 1 0 -sinθ 0 cosθ ]记忆的窍门是找规律。绕哪个轴转那个轴对应的行和列就是单位向量保持不动这在物理上很好理解因为绕轴旋转时轴本身不变。剩下那两块2×2的小结构都是标准的旋转形式。唯一容易记混的是绕Y轴那个矩阵它的右上角和左下角是正sinθ在左上、负sinθ在右下跟另外两个正好相反这是因为Y轴在右手系里相对特殊。我每次写代码前都会下意识核对一下这个符号因为它错一次会连累后面所有推导。这三个矩阵都是右手定则下的形式大拇指指向转轴正方向四指的绕向就是正旋转方向。用左手定则推出来的符号会整个反过来这也是团队对接时常见的不一致来源。2.4 欧拉角、固定角与旋转顺序的坑旋转矩阵信息冗余、不直观人看着一大片小数根本无法想象姿态所以工程上更爱用三个角度来表示姿态这就是欧拉角。问题是欧拉角有太多约定一不小心就踩坑。核心区别在两种旋转方式。一种是绕固定参考轴转每次旋转都绕原始坐标系的三根轴这种方式得出的角常被称为固定角或RPY角。另一种是绕自身不断变化的轴转每转一次后续旋转的参考轴跟着动这叫欧拉角狭义。有意思的是绕固定轴按某顺序转等价于绕自身轴按相反顺序转这个对偶关系是理解所有角序约定的钥匙。最常用的约定有两种ZYX顺序和XYZ顺序。航模和很多机器人软件里默认用的是ZYX也就是先偏航、再俯仰、最后翻滚术语叫yaw-pitch-roll。为什么是ZYX因为对于常见的地面平台和摄像头朝向这个顺序在绝大多数工作姿态附近不容易出现奇异而且符合人的直觉先定朝向、再定抬头、最后定侧倾。注意拿到任何一个欧拉角三元组第一件事是问清楚它的旋转顺序和是内旋还是外旋否则这三个数的物理意义是不确定的。欧拉角最致命的缺点是万向节死锁。当中间的旋转角到达正负90度时第一个和第三个旋转轴在空间上重合其中一个自由度丢失姿态表示出现奇异。这时候用欧拉角做插值会突然跳变控制器可能瞬间抖动。我在第一次做姿态插值时就被这个坑过机械臂末端在某个特定朝向上突然抽搐查了很久才定位到是俯仰角接近90度触发了奇异。2.5 四元数省空间、好插值的替代方案为了绕开欧拉角的奇异和旋转矩阵的冗余工程上大量使用四元数来表示姿态。它是四个数带一个实部和三个虚部满足单位长度约束。它在表示姿态方面同样有三个独立自由度但因为多了一个约束和更平滑的代数结构插值和连续更新比欧拉角稳定得多而且没有万向节死锁。四元数最大的好处在姿态插值上。做轨迹规划时从姿态A平滑过渡到姿态B用四元数做球面线性插值出来的旋转路径均匀自然用欧拉角直接线性插值结果可能是歪的、甚至绕远路用旋转矩阵插值插出来的中间矩阵根本不是合法旋转矩阵。我在做机械臂末端姿态过渡时四元数是默认选择。代价也有四元数不直观人和它对不上号两个四元数表达同一个姿态互为相反数写比较逻辑时要小心和一个零四元数做插值时还要处理符号选择避免走远路。所以我的习惯是——内部计算和插值用四元数人机交互和日志显示时转成欧拉角或旋转矩阵各取所长。3. 齐次变换矩阵把旋转和平移塞进一个4x4姿态和位置分开表示推导的时候要写两套公式非常烦。齐次变换矩阵的出现就是为了把旋转和平移统一成一个对象让多级坐标系的复合变成纯粹的矩阵相乘写代码也干净。3.1 为什么非要做齐次坐标这一步原因很实在。如果没有齐次坐标一个点从坐标系B变到坐标系A要写成先旋转再加平移两步先做矩阵乘再做向量加。每级变换都是乘一次加一次多级串联起来展开就长得吓人还容易漏项、错序。齐次坐标的思路是给三维点补一个额外的维度让它变成四维同时把平移塞进第四列。这样一来旋转和平移被打包进一个4×4矩阵点变换只需要一次矩阵乘法多级变换只需要连乘。它把乘加混合的麻烦彻底消除这是它在工程上被普遍采用的根本原因。一个点P的齐次形式在三维坐标后面补一个1方向向量则补一个0。这个1和0的区别就对应上一节说的点会被平移影响、向量不会。平移的分量乘以1会被保留乘以0就消失这个设计非常优雅。3.2 变换矩阵的四个分块各管什么标准形式长这样T [ R p 0 1 ]其中左上角3×3的R是旋转部分描述姿态右上角3×1的p是平移部分描述位置左下角是一行三个零右下角是一个1这两块是固定的结构不携带信息。整个矩阵共十六个数真正有效的是十二个而这十二个里又有九个被姿态约束锁住所以实际上一个位姿只有六个独立自由度三个位置、三个姿态。理解这个分块结构看代码就能秒懂。凡是看到哪个库里存了一个4×4矩阵你立刻就知道左上是旋转、右上是平移。这也是为什么很多机器人库直接拿4×4矩阵当位姿的标准载体因为它把两种信息装在了一起接口简洁组合方便。3.3 复合变换左乘右乘搞反的代价多级坐标系的复合是这章最核心的操作也是最容易被搞反的地方。假设我们知道坐标系1相对坐标系0的变换也知道坐标系2相对坐标系1的变换想求坐标系2相对坐标系0的变换答案是直接相乘顺序是从下往上、从左往右依次串起来。关键在于矩阵乘法的顺序就是变换链的顺序谁先变谁在右边。这个链条如果画成一张从世界坐标系到末端夹爪的树每一段都是一次矩阵乘法从根到叶依次连乘就能得到末端在世界系下的位姿。整个正运动学就是这么来的。还有一种情况是把变换当成算子用也就是在一个固定坐标系下对点做一次旋转或平移操作。这时矩阵是左乘当前位姿。这两种用法——描述坐标系之间的关系和作为动作算子——虽然用的是同一个矩阵形式但语义完全不同乘的位置也相反。初学阶段最崩溃的就是这个同样的矩阵一会儿左乘一会儿右乘结果天差地别。我的经验是每次动手前先在纸上把坐标系的树状图或操作流程图写出来明确每一步的语义然后再决定乘的顺序不要凭感觉。提示一个屡试不爽的自检方法——把变换的平移部分单位设为米随机取几个点手算一遍和代码算一遍数值对上了再往下写。顺序错了的话位置会明显偏。3.4 逆变换的快速写法反向求解也就是已知从0到1的变换求从1到0的变换是高频操作。很多人直接调数值求逆函数能用但不优雅也不够快还有数值误差。正确做法是利用旋转矩阵正交的性质直接写解析形式若 T [ R p 则 T^{-1} [ R^T -R^T·p 0 1 ] 0 1 ]旋转部分取转置平移部分是负的转置旋转矩阵乘以原平移向量。这个公式背后的逻辑很清晰从1看0姿态是反转的也就是转置位置是原来那个向量在反向旋转后取负。这个写法又快又准我在代码里一律用它替代通用求逆。实测下来在高频循环里性能差距非常明显而且不会积累数值误差。4. 动手算一遍两连杆平面机械臂的正运动学理论讲了一大堆不实际算一遍都是空的。我挑一个最简单又不失代表性的例子平面两连杆机械臂边算边讲细节你可以拿纸笔跟着走一遍。4.1 建模与坐标系定义先定义清楚。第一根连杆长0.5米第二根连杆长0.4米。基座固定在原点第一关节绕垂直纸面的Z轴旋转角度θ1设为30度第二关节也绕Z轴旋转相对第一连杆的角度θ2设为45度。我们要算的是末端执行器相对于基座坐标系的位置和姿态。按照前面说的从根到叶逐级连乘的思路我先建立三个坐标系基座坐标系0、连杆1末端坐标系1、连杆2末端坐标系2。坐标系1相对0的变换只包含一次绕Z旋转θ1加上一段沿旋转后X轴方向的平移长度是第一连杆。坐标系2相对1的结构完全一样只是角度变成θ2、长度变成第二连杆。这个逐步递推的结构就是正运动学的标准套路。4.2 逐级构造变换矩阵坐标系1相对0的变换矩阵旋转部分是绕Z转30度平移部分是旋转后沿X方向走0.5米也就是0.5乘上cos30和sin30T01 [ 0.8660 -0.5000 0 0.4330 0.5000 0.8660 0 0.2500 0 0 1 0 0 0 0 1 ]坐标系2相对1的变换矩阵同理转到45度、平移0.4米T12 [ 0.7071 -0.7071 0 0.2828 0.7071 0.7071 0 0.2828 0 0 1 0 0 0 0 1 ]这两块很好写关键是下一步——把它们乘起来。4.3 数值代入与手工核对末端的位姿就是T01乘以T12结果是T02 [ 0.2588 -0.9659 0 0.5365 0.9659 0.2588 0 0.6364 0 0 1 0 0 0 0 1 ]旋转部分对应绕Z转了75度因为两个关节角在平面里叠加30加45正好是75cos75约0.2588、sin75约0.9659完全吻合。平移部分末端位置为(0.5365, 0.6364)。为了确保没错我用教科书里的正运动学公式独立核对一遍。末端X等于第一杆长乘cos30加第二杆长乘cos75算出来是0.5乘0.8660加0.4乘0.2588等于0.5365对上了。末端Y等于0.5乘sin30加0.4乘sin75等于0.25加0.3864得到0.6364也对上了。两条路径殊途同归说明我们的变换矩阵构造和乘法顺序都没问题。这个核对习惯非常重要。我到现在仍然会偶尔用平面几何的直觉去验证矩阵算出来的结果因为矩阵出错的方式往往很隐蔽——数字差一点点你很难凭直觉发现但用另一个独立方法交叉验证就能立刻暴露问题。4.4 用Python复现并验证纸上算完了接下来用代码复现一遍这样你能直接拿去改。我习惯把旋转函数、平移函数、拼装函数分开写方便复用import numpy as np def rot_z(theta): c, s np.cos(theta), np.sin(theta) return np.array([[c, -s, 0.0], [s, c, 0.0], [0.0, 0.0, 1.0]]) def tf_from(R, p): T np.eye(4) T[:3, :3] R T[:3, 3] np.asarray(p, dtypefloat) return T def planar_link(theta, length): # 绕z转theta再沿旋转后的x方向平移length R rot_z(theta) p np.array([length*np.cos(theta), length*np.sin(theta), 0.0]) return tf_from(R, p) deg np.pi / 180.0 T01 planar_link(30*deg, 0.5) T12 planar_link(45*deg, 0.4) T02 T01 T12 print(np.round(T02, 4))跑出来末端位置那两列就是0.5365和0.6364跟手算完全一致。这里有个细节很值得说平移向量我是用角度直接算cos和sin得到的不是随便填的。因为对于这种绕Z转完再沿自身X前进的连杆平移就是长度乘上cos和sin。这个习惯让代码和物理含义一一对应改起来不容易错。接着把逆变换也实现一遍方便后面做逆运动学或者坐标回流def inv_tf(T): R T[:3, :3] p T[:3, 3] Ti np.eye(4) Ti[:3, :3] R.T Ti[:3, 3] -R.T p return Ti print(np.allclose(inv_tf(T02) T02, np.eye(4))) # 应为 True最后加一句正交性检查养成习惯R T02[:3, :3] print(np.allclose(R.T R, np.eye(3))) # 正交 print(np.isclose(np.linalg.det(R), 1.0)) # 行列式为1这两个断言一旦不成立说明你的旋转矩阵已经污染了后面所有姿态都没意义。4.5 扩展到三维加一个腰部旋转关节平面例子够用但真实机械臂是三位的。怎么扩展思路完全一样只是每个关节的旋转轴可能不同。比如给这个两连杆加一个腰部关节让整条臂绕垂直轴整体旋转那就在最前面左乘一个绕Z转的底座变换所有末端位置自动跟着转。你也可以让第二个关节绕Y轴转把平面臂掰到三维空间里这时旋转部分就从Rz换成Ry平移方向也跟着变。这里会碰到一个关键点关节轴的方向和连杆的平移方向必须一致定义。在标准建模方法比如工业界常用的DH参数法里就是把这两个方向绑定好用四个参数描述每个连杆然后整个正运动学就是一套规范的连乘。但那套方法细节较多放到后面的章节展开更合适。你现在只要建立起每个关节贡献一个变换整链连乘的直觉就够用了。5. 常见问题与排查技巧实录前面都在讲应该怎么做这一节讲我实际踩过的坑以及排查时的套路。这部分是文档里基本不会写的但对能不能把项目跑起来影响巨大。5.1 旋转矩阵不正交数值漂移怎么处理现象很典型系统跑了一段时间后姿态开始慢慢偏移关节角没变末端姿态却歪了。原因多半是旋转矩阵经过了多次累加或者积分正交性被破坏误差一点点积累。处理办法有几个层次。最直接的是每次更新后做一次正交化常用做法是不断把矩阵往正交方向拉比如用矩阵与其转置乘积平衡一下或者直接做分解再重建。更根本的解决办法是不要用旋转矩阵做长时间积分改用四元数或者旋转向量做状态量只在需要出结果的时候转成矩阵。四元数归一化一次就能保持单位长度稳定性好太多。我现在的习惯是只要涉及姿态递推状态里一定存四元数。5.2 万向节死锁现象、成因与绕开办法前面提到过这里展开说排查。现象是姿态在某个特定朝向上出现跳变或者插值路径突然拐了个大弯。成因就是中间那个欧拉角接近正负90度时两个轴重合自由度退化。排查方法很直接把当前姿态转成欧拉角打印出来看中间那个角是不是接近90度。如果是基本就确认了。绕开的办法有两种。一是改用四元数表示和插值从根上避免奇异。二是在必须用欧拉角的时候切换到另一个旋转顺序让奇异点落在工作空间之外。比如某个任务里俯仰角通常不会接近90度那用ZYX就没问题但如果工作姿态恰好靠近那个区域就得换约定。这是个纯工程判断需要结合你的实际任务范围来定。5.3 旋转顺序记错一份对照表旋转顺序是出错重灾区我把常见的对应关系整理成表方便你对照排查。常见叫法旋转顺序特性典型应用ZYX偏航-俯仰-翻滚先绕Z再绕Y再绕X内旋欧拉角俯仰角近90度会奇异无人机、摄像头朝向、多数机器人库默认XYZ固定角先绕X再绕Y再绕Z外旋固定角绕原坐标轴依次转部分CAD与仿真软件轴角绕任意单位轴转一个角度无约定歧义但插值不便标定输出、单步旋转四元数四个数整体表示无奇异、插值优但不直观姿态插值、状态递推排查时把两端用的约定对齐问题往往当场解决。我遇到过一次双方对不上最后发现一边默认内旋一边默认外旋虽然顺序标注都是ZYX但实际旋转轴完全不同折腾了大半天。5.4 单位与角度制90%的低级错误来源这个没什么好讲的就是检查。所有涉及角度的接口进去出来都明确标注是度还是弧度必要时在函数入口做类型和范围断言。我现在的做法是函数签名里参数名直接带单位比如写成角度形式的名字让人一眼能看出来。这种看似啰嗦的习惯能帮你省掉大量调试时间。5.5 变换方向搞反一个自检小技巧搞不清变换方向时我的自检套路是这样的取一个当前坐标系下已知有明确物理意义的点比如工具坐标系原点用待检查的变换把它变过去看结果是不是落在你预期的坐标系里。如果变换方向反了点会跑到一个明显离谱的位置。这个方法几乎不依赖公式记忆纯靠物理直觉就能判断对错我强推。再补一个更结构化的自检任取两台坐标系之间的变换链用正向连乘算出总变换再用逆向逐级求逆连乘两者相乘应该得到单位矩阵。这个闭环检查写进单元测试里能自动拦住绝大多数坐标系错误。6. 工程落地时我会额外关注的几件事基础打完之后想真正在项目里用起来还有几个工程细节值得单独提。6.1 标定误差是怎么逐级放大的正运动学算出来的末端位姿理论上很准但真实世界里有制造公差、关节零位偏差、连杆长度误差。这些误差会沿着坐标变换链一级级传递和放大。换句话讲你算得再准只要参数不准结果就偏。这就是为什么真实项目一定要做运动学标定把实际参数辨识出来而不是照抄图纸。理解这一点很重要坐标变换是计算框架标定是参数修正两者是配合关系。只学计算不关注参数做出来的系统精度上不去。6.2 库函数的选择与验证做二次开发时不同库对旋转的定义可能微妙不同尤其是欧拉角约定和左乘右乘语义。我的原则是任何新引入的旋转库先写一组最小测试用例用我手算过的数值验证一遍确认约定一致再接入项目。这一步花不了多少时间但能避免后期一整个模块重写。6.3 从手推到代码的验证闭环我最推崇的学习方法也是我要求团队新人都做的一件事每个变换公式先在纸上独立推一遍再用代码复现再用手工算一组数值交叉验证最后写成自动测试固化下来。这个四步闭环走下来你不仅理解了公式还拥有了一个能长期守护代码正确性的资产。以后有人改了这块代码测试一旦挂了立刻就能发现。空间描述与坐标变换这章看起来枯燥但它决定了你后面所有内容的地基是否牢固。我个人的体会是别急着刷后面的高级算法把这一章的每种表示法都手推一遍、写代码跑一遍把顺序、单位、方向这三个高频出错点变成肌肉记忆后面学运动学、手眼标定、轨迹规划会顺畅很多。最后再分享一个小技巧把项目里所有的坐标系画成一张树状图贴在工位上每次调试前先盯着这张图走一遍变换链很多错误根本不用打开调试器就能看出来。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →