当前位置:   article > 正文

【机器人工具箱学习笔记】第二章 位置与姿态描述_transl机器人工具箱

transl机器人工具箱
  1. 函数表

  1. rot2()%旋转矩阵
  2. det()%矩阵的模
  3. syms %定义变量
  4. simplify() %简述
  5. logm() %矩阵对数
  6. expm() %矩阵指数
  7. skew() %构造反对称指数
  8. vex() %skew()的逆运算
  9. transl2()%二维平移
  10. trot2()%二维旋转
  11. SE2() %齐次变换
  12. axis() %绘制坐标
  13. plotvol()%绘制坐标
  14. trplot2() %绘制二维齐次变换
  15. P=[] %定义一个点
  16. plot_point() %加入图中
  17. inv()%矩阵求逆
  18. double(inv())*[P;1] %求点相对于坐标系的坐标
  19. h2e() %e2h将欧几里得点转换为齐次坐标形式,h2e进行逆转换
  20. homtrans(T,P) %将齐次变换T应用于按列存储在P中的点
  21. eye() %单位矩阵
  22. Twist() %Twist就是Twist
  23. tw.T()%将Twist tw转为SE()
  24. tw.pole%求Twist tw的旋转中心点
  25. rotx() %以x为转轴的旋转矩阵
  26. trplot() %绘制相应的三维坐标系
  27. tranimate() %旋转动画
  28. eul2r() %ZYZ欧拉角表示的旋转矩阵
  29. tr2eul() %找到给定矩阵的欧拉角
  30. rpy2r() %RPY角表示的旋转矩阵
  31. tr2rpy() %找到给定矩阵的rpy角
  32. oa2r() %利用双向量表示法定义坐标系
  33. tr2angvec() %由旋转矩阵定义旋转的角度大小和绕其旋转的向量
  34. eig() %求矩阵的特征值和特征向量
  35. angvec2r() %从角度和向量计算出相应的旋转矩阵
  36. trlog() %分别返回旋转轴和旋转角
  37. UnitQuaternion() %单位四元数
  38. q.norm %四元数的大小
  39. q*q %四元数的乘法
  40. q.inv() %求四元数的共轭
  41. q.R %四元数转化为一个正交旋转矩阵
  42. q.plot() %绘制一个四元数所指的方向
  43. trotx()%绕x轴旋转()的齐次变换矩阵
  44. t2r() %提取旋转部分
  45. transl() %提取平移部分
  46. trnorm()%规范化
  1. 二维

{B}相对于A的相对位姿/对{A}施加平移和旋转使它转化为{B}

2.1标准正交旋转矩阵

  1. >> R = rot2(0.2) %弧度为2的旋转矩阵
  2. >> det(R) %矩阵的模
  3. >> det(R*R) %相乘后模仍为1
  4. ans =
  5. 1
  6. >> syms theta %工具箱支持符号变量
  7. >> R = rot2(theta)
  8. >> simplify(R*R) %简明表示
  9. >> simplify(det(R))

2.2矩阵指数

  1. >> R = rot2(0.3)
  2. R =
  3. 0.9553 -0.2955
  4. 0.2955 0.9553
  5. >> skew(2) %构造反对称矩阵
  6. ans =
  7. 0 -2
  8. 2 0
  9. >> vex(ans) %反对称矩阵的逆运算
  10. ans =
  11. 2
  12. %可使用logm和vex找到旋转矩阵的旋转角
  13. >> S = logm(R) %计算矩阵R的对数
  14. S =
  15. 0 -0.3000
  16. 0.3000 0
  17. >> vex(S) %找到反对称矩阵的元素
  18. ans =
  19. 0.3000
  20. >> expm(S) %logm的逆运算 构造标准正交旋转矩阵
  21. ans =
  22. 0.9553 -0.2955
  23. 0.2955 0.9553
  24. >> R = rot2(0.3);
  25. >> R = expm( skew(0.3) ); %与rot2(0.3)等价

【3B1B笔记】e的矩阵指数——怎么算?为什么?知:,即R = expm(skew(θ) ),也即

2.3齐次变换矩阵

  1. >> T1=SE2(1,2,30*pi/180)
  2. 或>> T1 = transl2(1, 2) * trot2(30, 'deg')
  3. >> axis([0 5 0 5]);
  4. 或>> plotvol([0 5 0 5]); %创建2D图并设置边界
  5. >> trplot2(T1, 'frame', '1', 'color', 'b') %绘制齐次变换
  6. >> T2 = transl2(2, 1)
  7. >> trplot2(T2, 'frame', '2', 'color', 'r');
  8. %复合运算的不可交换性
  9. >> T3 = T1*T2
  10. >> trplot2(T3, 'frame', '3', 'color', 'g');
  11. >> T4 = T2*T1;
  12. >> trplot2(T4, 'frame', '4', 'color', 'c');
  13. >> P = [3 ; 2 ]; %定义一个点
  14. >> plot_point(P, 'label', 'P', 'solid', 'ko'); %求在该点相对于坐标系1的坐标
  15. >> P1 = inv(T1) * [P; 1] %对点P附加一个1将欧几里得点转换为齐次形式
  16. >> h2e( inv(T1) * e2h(P) ) % e2h将欧几里得点转换为齐次坐标形式,h2e进行逆转换
  17. >> homtrans( inv(T1),P) %将齐次变换inv(T1)应用于按列存储在P中的点

2.4旋转

  1. >> plotvol([-5 4 -1 5]);
  2. >> T0 = eye(3,3);
  3. >> trplot2(T0, 'frame', '0');
  4. >> X = transl2(2, 3);
  5. >> trplot2(X, 'frame', 'X');
  6. >> R = trot2(2);
  7. >> trplot2(R*X, 'framelabel', 'RX', 'color', 'r');
  8. >> trplot2(X*R, 'framelabel', 'XR', 'color', 'r');
  9. >> C = [1 2]';
  10. >> plot_point(C, 'label', ' C', 'solid', 'ko')'
  11. >> RC = transl2(C) * R * transl2(-C)
  12. >> trplot2(RC*X, 'framelabel', 'XC', 'color', 'r');

RX绕原点旋转,而XR绕X点旋转。

而对于绕C旋转的XC,从右向左读,先将C点转换到原点,绕C旋转,然后再将坐标系平移回C

2.5 Twist

  1. >>tw = Twist('R',C)%以R为旋转扭,C为旋转中心点的坐标变换
  2. tw =
  3. ( 2 -1; 1 )
  4. >>tw.T(2)%沿twist中心点旋转2弧度的旋转矩阵
  5. ans =
  6. -0.4161 -0.9093 3.2347
  7. 0.9093 -0.4161 1.9230
  8. 0 0 1.0000
  9. >>tw.pole' %求twist的旋转中心点
  10. ans =
  11. 1 2
  12. >>tw = Twist('T', [1 1]) %纯平移的twist
  13. tw =
  14. ( 0.70711 0.70711; 0 )
  15. >>tw.T(sqrt(2)) %对纯平移的twist,参数为根2,变换矩阵为
  16. ans =
  17. 1 0 1
  18. 0 1 1
  19. 0 0 1
  20. >> T = transl2(2, 3) * trot2(0.5) %任意坐标变换矩阵
  21. T =
  22. 0.8776 -0.4794 2.0000
  23. 0.4794 0.8776 3.0000
  24. 0 0 1.0000
  25. >>tw = Twist(T) %将SE(2)转为twist,我们注意到C=0.5,即这不是一个单位twist
  26. tw =
  27. ( 2.7082 2.4372; 0.5 )
  28. >> tw.T %所以将其转换为一个二维坐标变换时不需要提供旋转角度这个参数
  29. ans =
  30. 0.8776 -0.4794 2.0000
  31. 0.4794 0.8776 3.0000
  32. 0 0 1.0000

二维twist的中心思想即为:任何坐标变换均为绕某点的旋转?

  1. 三维

欧拉角:ZYZ序列 eul2r

横滚-俯仰-偏航角(卡尔丹角/泰特-布莱恩角/导航角): XYZ序列 rpy2r

双向量表示法: 接近向量 oa2r

3.1正交旋转矩阵

  1. >> R = rotx(pi/2) %以x为转轴的旋转矩阵
  2. >> trplot(R)
  3. >> tranimate(R) %旋转动画
  4. >> R = rotx(pi/2) * roty(pi/2)
  5. >> roty(pi/2)*rotx(pi/2) %证明旋转的不可交换性

3.2三角度表示法

  1. >> R = rotz(0.1) * roty(0.2) * rotz(0.3);
  2. >> R = eul2r(0.1, 0.2, 0.3) %计算欧拉角为(0.1, 0.2, 0.3)的等价旋转矩阵
  3. >> gamma = tr2eul(R) %找到给定矩阵的欧拉角
  4. >> R = eul2r(0.1 , -0.2, 0.3) %但如果θ为复数时
  5. >> tr2eul(R) %其反函数结果与原来不同
  6. ans =
  7. -3.0416 0.2000 -2.8416
  8. >> eul2r(ans) %但旋转矩阵相同
  9. >> R = eul2r(0.1, 0, 0.3)
  10. >> tr2eul(R) %对于θ=0的情况,与奇异点有关
  11. >> R = rpy2r(0.1, 0.2, 0.3) %计算RPY角为(0.1, 0.2, 0.3)的等价旋转矩阵
  12. >> gamma = tr2rpy(R) %找到给定矩阵的RPY角

3.3双向量表示法

  1. >> a = [1 0 0]'; %接近向量
  2. >> o = [0 1 0]'; %姿态向量
  3. >> R = oa2r(o, a) %利用双向量表示法定义坐标系

3.4绕任意向量旋转

  1. >> R = rpy2r(0.1 , 0.2, 0.3);
  2. >> [theta, v] = tr2angvec(R) %由R定义旋转的角度大小和绕其旋转的向量
  3. theta =
  4. 0.3655
  5. v =
  6. 0.1886 0.5834 0.7900
  7. >> [x,e] = eig(R) %求矩阵的特征值和特征向量
  8. x =
  9. 0.6944 + 0.0000i 0.6944 + 0.0000i 0.1886 + 0.0000i
  10. -0.0792 - 0.5688i -0.0792 + 0.5688i 0.5834 + 0.0000i
  11. -0.1073 + 0.4200i -0.1073 - 0.4200i 0.7900 + 0.0000i
  12. e =
  13. 0.9339 + 0.3574i 0.0000 + 0.0000i 0.0000 + 0.0000i
  14. 0.0000 + 0.0000i 0.9339 - 0.3574i 0.0000 + 0.0000i
  15. 0.0000 + 0.0000i 0.0000 + 0.0000i 1.0000 + 0.0000i
  16. >> R = angvec2r(pi/2, [1 0 0]) %从角度和向量计算出相应的旋转矩阵

一个正交旋转矩阵总有一个实特征值=1,其相应的特征向量位于矩阵v中对应的列向量,这个向量就是旋转轴

3.5矩阵指数

  1. >> R = rotx(0.3)
  2. >> S = logm(R)
  3. >> vex(S)'
  4. ans =
  5. 0.3000 0 0
  6. >> [th,w] = trlog(R) %返回R的旋转角度和旋转轴
  7. th =
  8. 0.3000
  9. w =
  10. 1.0000
  11. 0
  12. 0
  13. >> expm(S)
  14. ans =
  15. 1.0000 0 0
  16. 0 0.9553 -0.2955
  17. 0 0.2955 0.9553
  18. >> R = rotx(0.3);
  19. >> R = expm( skew([1 0 0]) * 0.3 ); %与rotx(0.3)等价

,其中θ是转角,ω是平行于转轴的单位向量

注:三维斜对称矩阵:

3.6 四元数

四元数的可视化_哔哩哔哩_bilibili

Visualizing quaternions, an explorable video series

  1. >> q = UnitQuaternion( rpy2tr(0.1, 0.2, 0.3) ) %构造函数将传递的参数转换为四元数
  2. q =
  3. 0.98335 < 0.034271, 0.10602, 0.14357 >
  4. >> q.norm %四元数的大小
  5. ans =
  6. 1
  7. >> q = q * q; %四元数的乘法通过重载乘法运算符调用
  8. >> inv(q) %求四元数的共轭
  9. >> q*inv(q)
  10. >> q/q %四元数乘以它的倒数得到单位四元数
  11. ans =
  12. 1 < 0, 0, 0 >
  13. >> q.R %四元数转化为一个正交旋转矩阵
  14. >> q.plot() %绘制一个四元数所指的方向
  15. >> q*[1 0 0]' %一个向量可以被一个四元数旋转

3.7 4*4齐次变换

  1. %变换的合成
  2. >> T = transl(1, 0, 0) * trotx(pi/2) * transl(0, 1, 0)
  3. %提取旋转部分
  4. >> t2r(T)
  5. %提取平移部分
  6. >> transl(T)'
  7. %规范化
  8. >> R = trnorm(R);

区别:3*3标准正交与4*4齐次变换

3.8 Twists

  1. >> tw = Twist('R', [1 0 0], [0 0 0]) %单旋转,ω为1
  2. tw =
  3. ( 0 0 0; 1 0 0 )
  4. >> tw.T(0.3)
  5. ans =
  6. 1.0000 0 0 0
  7. 0 0.9553 -0.2955 0
  8. 0 0.2955 0.9553 0
  9. 0 0 0 1.0000
  10. >> tw = Twist('T', [0 1 0]) %单平移,ω为0,v为1
  11. tw =
  12. ( 0 1 0; 0 0 0 )
  13. >> tw.T(2)
  14. ans =
  15. 1 0 0 0
  16. 0 1 0 2
  17. 0 0 1 0
  18. 0 0 0 1
  19. >> X = transl(3, 4, -4);
  20. >> angles = [0:0.3:15];
  21. >> tw = Twist('R', [0 0 1], [2 3 2], 0.5);
  22. >> tranimate( @(theta) tw.T(theta) * X, angles, ...
  23. 'length', 0.5, 'retain', 'rgb', 'notext');
  24. >> T = transl(1, 2, 3) * eul2tr(0.3, 0.4, 0.5);
  25. >> tw = Twist(T)
  26. tw =
  27. ( 1.1204 1.6446 3.1778; 0.041006 0.4087 0.78907 )
  28. >> tw.pitch
  29. ans =
  30. 3.2256
  31. >> tw.theta
  32. ans =
  33. 0.8896
  34. >> tw.pole'
  35. ans =
  36. 0.0011 0.8473 -0.4389
  1. 总结

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/96764
推荐阅读
相关标签
  

闽ICP备14008679号