当前位置:   article > 正文

【机器人学】5-3.六自由度机器人轨迹规划-笛卡尔空间- 直线与圆弧规划【附MATLAB代码】

【机器人学】5-3.六自由度机器人轨迹规划-笛卡尔空间- 直线与圆弧规划【附MATLAB代码】

        空间机器人笛卡尔空间路径规划按照路径的性质可以分为笛卡尔点到点的路径规划以及笛卡尔连续路径规划。即通过事先给定空间机器人的目标点或者目标路径,通过运动学的计算得到空间机器人关节层轨迹,进而实现期望路径的跟踪。

        笛卡尔空间的路径规划与其说是一个运动学问题,倒不如说是一个几何问题。比如笛卡尔空间的直线规划,给定起点A和终点B,连接AB两点的向量,然后将这个向量离散化为N个点,对每个点求解逆运动学,即可实现机器人末端TCP完成一段直线轨迹。

               MATLAB代码

                直线规划

  1. function point = my_Linetraj(points, step)
  2. %直线规划
  3. q = zeros(step, 5); %角度
  4. point = zeros(step, 3);
  5. % 角度变化
  6. point(:, 1) = reshape(linspace(points(1, 1), points(2, 1), step), step, 1); %px
  7. point(:, 2) = reshape(linspace(points(1, 2), points(2, 2), step), step, 1); %py
  8. point(:, 3) = reshape(linspace(points(1, 3), points(2, 3), step), step, 1); %pz

                圆弧规划

  1. function pointT = my_Arctraj(points, step)
  2. %圆弧规划
  3. q = zeros(2 * step, 5); %角度
  4. t = zeros(2 * step, 1); %时间
  5. % 求圆心和半径
  6. syms x0 y0 z0
  7. p1 = points(1, :);
  8. p2 = points(2, :);
  9. p3 = points(3, :);
  10. x1 = p1(1); y1 = p1(2); z1 = p1(3);
  11. x2 = p2(1); y2 = p2(2); z2 = p2(3);
  12. x3 = p3(1); y3 = p3(2); z3 = p3(3);
  13. a = (y2 - y1) * (z3 - z1) - (y3 - y1) * (z2 - z1);
  14. b = (x3 - x1) * (z2 - z1) - (x2 - x1) * (z3 - z1);
  15. c = (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1);
  16. d = a * x1 + b * y1 + c * z1;
  17. eq(1) = a * x0 + b * y0 + c * z0 == d;
  18. eq(2) = (x0 - 0.5 * (x1 + x2)) * (x2 - x1) + (y0 - 0.5 * (y1 + y2)) * (y2 - y1) + (z0 - 0.5 * (z1 + z2)) * (z2 - z1) == 0;
  19. eq(3) = (x0 - 0.5 * (x2 + x3)) * (x3 - x2) + (y0 - 0.5 * (y2 + y3)) * (y3 - y2) + (z0 - 0.5 * (z2 + z3)) * (z3 - z2) == 0;
  20. [x0, y0, z0] = solve(eq, x0, y0, z0);
  21. p0 = double([x0, y0, z0]);
  22. R = double(sqrt((x1 - x0).^2 + (y1 - y0).^2 + (z1 - z0).^2));
  23. %求齐次变换矩阵
  24. W = [a, b, c] / sqrt(a^2 + b^2 + c^2);
  25. U = (p1 - p0) / R;
  26. V = cross(W, U);
  27. transT = [U', V', W', p0'; 0, 0, 0, 1];
  28. %计算轨迹并转换
  29. point1 = inv(transT) * [p1, 1]';
  30. point2 = inv(transT) * [p2, 1]';
  31. point3 = inv(transT) * [p3, 1]';
  32. %求圆心角
  33. if point3(2) < 0
  34. theta13 = atan2(point3(2), point3(1)) + 2 * pi;
  35. else
  36. theta13 = atan2(point3(2), point3(1));
  37. end
  38. %转换到空间圆弧
  39. j = 1;
  40. for i = 0:theta13 / (2 * step - 1):theta13
  41. pointT(j, :) = transT * [R * cos(i), R * sin(i), 0, 1]';
  42. j = j + 1;
  43. end

                测试代码

  1. clc;
  2. clear;
  3. p_start = [200, 60,320]; %圆弧轨迹起始点
  4. p_mid = [0, 0,0]; %圆弧轨迹中间点
  5. p_final = [230,200,510]; %圆弧轨迹终止点
  6. step = 50; %步数
  7. pointC = my_Arctraj([p_start;p_mid;p_final],step);
  8. pointL=my_Linetraj([p_start;p_mid],step);
  9. figure(1);
  10. plot3(pointC(:,1),pointC(:,2),pointC(:,3));
  11. %plot3(pointL(:,1),pointL(:,2),pointL(:,3));

        仿真验证

                        

                ​​​​​​​        

下一章:【机器人学】6-1.六自由度机器人-运动学参数辨识-辨识数学模型的建立​​​​​​​

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

闽ICP备14008679号