当前位置:   article > 正文

B样条曲线_原理 &用于路径规划的matlab代码_b样条曲线的优缺点

b样条曲线的优缺点

B样条曲线在贝塞尔曲线的基础上有了更进一步的提高。


一 由于贝塞尔曲线存在以下不足:

1 )缺乏局部修改性,即改变某一控制点对整个曲线都有影响。

2 )n 较大时,特征多边形的边数较多,对曲线的控制减弱。

3 )幂次过高难于修改。(而在外形设计中,局部修改是随时要进行的)。

二 所以提出了B样条曲线,B样条曲线有以下优点:

1 )逼近特征多边形的精度更高。

2 )多边形的边数与基函数的次数无关。

  3 )具有局部修改性。
B样条曲线的原理学习可参考下边链接,内容丰富,步骤精细。

https://www.cnblogs.com/icmzn/p/5100761.html

用于路径规划的matlab代码:

1.B_spline_curve.m 主函数

  1. %% 三次B样条曲线
  2. clc;
  3. clear;
  4. close all;
  5. %% 数据定义
  6. road_width=3.5;
  7. % 6个控制点
  8. P=[0 10 25 25 40 50;
  9. -road_width/2 -road_width/2 -road_width/2+0.5 road_width/2-0.5 road_width/2 road_width/2];
  10. % 从0开始算 6个控制点 n=5
  11. n=size(P,2)-1;
  12. % K阶 也就是K-1次B样条
  13. k=4;
  14. path=[];
  15. Bik=zeros(n+1,1);
  16. flag=2;
  17. %% 准均匀B样条
  18. if flag==2
  19. NodeVector=unEven(n,k-1);
  20. for u=0:0.005:1-0.005
  21. for i=0:1:n
  22. Bik(i+1,1)=BaseFunction(i,k-1,u,NodeVector);
  23. end
  24. p_u=P*Bik;
  25. path=[path;[p_u(1,1),p_u(2,1)]];
  26. end
  27. elseif flag==1
  28. %% 均匀B样条
  29. NodeVector=linspace(0,1,n+k+1);
  30. for u=(k-1)/(n+k+1):0.001:(n+2)/(n+k+1)
  31. for i=0:1:n
  32. Bik(i+1,1)=BaseFunction(i,k-1,u,NodeVector);
  33. end
  34. p_u=P*Bik;
  35. path=[path;[p_u(1,1),p_u(2,1)]];
  36. end
  37. end
  38. %% 绘图
  39. % 车宽 车长 路长
  40. car_width=1.8;
  41. car_length=4.5;
  42. road_length=50;
  43. %灰色路面区域设置 填充 车辆位置填充
  44. Road_zone=[-5 -road_width-0.5;
  45. -5 road_width+0.5;
  46. road_length road_width+0.5;
  47. road_length -road_width-0.5];
  48. fill(Road_zone(:,1),Road_zone(:,2),[0.5 0.5 0.5]);
  49. hold on
  50. fill([0 0 -car_length -car_length],...
  51. [-road_width/2-car_width/2 -road_width/2+car_width/2 ...
  52. -road_width/2+car_width/2 -road_width/2-car_width/2],'b')
  53. % 绘制道路中间虚线 两侧实线
  54. plot([-5 road_length],[0 0],'w--','linewidth',2);
  55. plot([-5 road_length],[road_width,road_width],'w','linewidth',2);
  56. plot([-5 road_length],[-road_width,-road_width],'w','linewidth',2);
  57. % 横纵坐标长度设置
  58. axis equal
  59. set(gca,'XLim',[-5,road_length]);
  60. set(gca,'YLim',[-road_width-0.5,road_width+0.5]);
  61. scatter(path(:,1),path(:,2),'.b');%绘制路径散点
  62. scatter(P(1,:),P(2,:),'g');
  63. plot(P(1,:),P(2,:),'r');

2.BaseFunction.m 基函数的递归运算.

  1. function Bik_u = BaseFunction(i,k,u,NodeVector)
  2. %基函数 Bik
  3. if k==0
  4. if u>= NodeVector(i+1) && u<NodeVector(i+2)
  5. Bik_u = 1;
  6. else
  7. Bik_u = 0;
  8. end
  9. else
  10. Length1=NodeVector(i+k+1)-NodeVector(i+1);
  11. Length2=NodeVector(i+k+2)-NodeVector(i+2);
  12. if Length1 == 0
  13. Length1=1;
  14. end
  15. if Length2 == 0
  16. Length2 = 1;
  17. end
  18. % 递归 Bik_u=(u-u_i)/(u_i+k-u_i)*B_i_k-1_u
  19. % +(u_i+k+1-u)/(u_i+k+1-u_i+1)* B_i+1_k-1_u
  20. Bik_u=(u-NodeVector(i+1))/Length1 * BaseFunction(i,k-1,u,NodeVector)...
  21. +(NodeVector(i+k+2)-u)/Length2 * BaseFunction(i+1,k-1,u,NodeVector);
  22. end

3.unEven.m 准均匀B样条的节点向量生成

                              节点向量前面和后面各有k+1个重复值 前面是K个0 后面是K个1

  1. function NodeVector = unEven(n,k)
  2. %% 准均匀B样条曲线节点向量计算。传入的n从0开始,所以共n+1个控制顶点。k阶曲线为k-1次。节点向量个数为n+1+k+1=n+k+2
  3. NodeVector=zeros(1,n+k+2);
  4. piecewise=n-k+1; %曲线段数
  5. if piecewise == 1 %只有一条曲线时 n=k
  6. for i=k+2 : n+k+2
  7. NodeVector(1,i)=1;
  8. end
  9. else %不止一条曲线
  10. flag=1;
  11. while flag ~= piecewise
  12. NodeVector(1,k+flag+1) = NodeVector(1,k+flag) + 1 /piecewise;
  13. flag=flag+1;
  14. end
  15. NodeVector(1,n+2:n+k+2)=1; %节点向量前面和后面各有k+1个重复值 前面是K个0 后面是K个1
  16. end

准均匀的B样条效果图

 

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

闽ICP备14008679号