老师参与

样条曲线MATLAB代码改用Python写出错

澄碧钓徒 发表于2019年08月08日
<p><code class="brush:python;toolbar:false" >from&nbsp;numpy&nbsp;import&nbsp;* from&nbsp;matplotlib.pyplot&nbsp;import&nbsp;* c&nbsp;=&nbsp;array([0,&nbsp;1,&nbsp;2,&nbsp;-2,&nbsp;-1,&nbsp;0,&nbsp;0,&nbsp;0.3,&nbsp;2.5,&nbsp;2.5,&nbsp;4.7,&nbsp;5]) v1&nbsp;=&nbsp;array([1,&nbsp;0]).T v2&nbsp;=&nbsp;array([1,&nbsp;0]).T l&nbsp;=&nbsp;0.254&nbsp;/&nbsp;2 nc&nbsp;=&nbsp;len(c) rc&nbsp;=&nbsp;array([c[:][0]&nbsp;-&nbsp;dot(v1,&nbsp;l),&nbsp;c[:][0]&nbsp;+&nbsp;dot(v1,&nbsp;l),&nbsp;\ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c[:][1:(nc&nbsp;-&nbsp;2)],&nbsp;c[:][nc&nbsp;-&nbsp;1]&nbsp;-&nbsp;dot(v2,&nbsp;l),&nbsp;\ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c[:][nc&nbsp;-&nbsp;1],&nbsp;&nbsp;c[:][nc&nbsp;-&nbsp;1]&nbsp;-&nbsp;dot(v2,&nbsp;l)]) n&nbsp;=&nbsp;len(rc) s&nbsp;=&nbsp;linspace(0,&nbsp;1,&nbsp;101) f1s&nbsp;=&nbsp;(1&nbsp;-&nbsp;s)&nbsp;**&nbsp;3&nbsp;/&nbsp;6 f2s&nbsp;=&nbsp;(3&nbsp;*&nbsp;s&nbsp;**&nbsp;3&nbsp;-&nbsp;6&nbsp;*&nbsp;s&nbsp;**&nbsp;2&nbsp;+&nbsp;4)&nbsp;/&nbsp;6 f3s&nbsp;=&nbsp;(3&nbsp;*&nbsp;s&nbsp;**&nbsp;3&nbsp;+&nbsp;3&nbsp;*&nbsp;s&nbsp;**&nbsp;2&nbsp;+&nbsp;3&nbsp;*&nbsp;s&nbsp;+&nbsp;1)&nbsp;/&nbsp;6 f4s&nbsp;=&nbsp;s&nbsp;**&nbsp;3&nbsp;/&nbsp;6 figure(1) mycolor&nbsp;=&nbsp;&quot;mbc&quot; plot(rc[0][:],&nbsp;rc[1][:],&nbsp;&quot;r*&quot;) show() for&nbsp;i&nbsp;in&nbsp;range(n&nbsp;-&nbsp;3): &nbsp;&nbsp;&nbsp;&nbsp;p&nbsp;=&nbsp;dot(rc[:][i],&nbsp;f1s)&nbsp;+&nbsp;dot(rc[:][i&nbsp;+&nbsp;1],&nbsp;f2s)&nbsp;+&nbsp;\ &nbsp;&nbsp;&nbsp;&nbsp;dot(rc[:][i&nbsp;+&nbsp;2],&nbsp;f3s)&nbsp;+&nbsp;dot(rc[:][i&nbsp;+&nbsp;3],&nbsp;f4s) &nbsp;&nbsp;&nbsp;&nbsp;plot(p[0][:],&nbsp;p[1][:],&nbsp;mycolor[i&nbsp;%&nbsp;3]) show()</code></p><p><img src="https://nos.netease.com/edu-image/1d62b404de724842ab4d0a0d9e6c23b3.PNG" /></p><p>用惯了Anaconda后MATLAB就不怎么用了,按说这个地方Python的matplotlib和numpy库用法跟MATLAB非常类似,Python数组下标从0开始索引肯定要减1,<strong>我估计问题会不会是出在f1s~f4s四个函数的幂运算上?PPT上MATLAB的是点幂,numpy.dot()方法对应MATLAB的矩阵相乘而乘号(*)相当于MATLAB的点乘,那么MATLAB的点除、点幂跟numpy库怎么对应啊?</strong><br /></p>
5 回复

    1楼

  • HuiminLu_NUDT 发表于2019年08月09日
    0 | 0 | 举报
    <p>这种问题,请您自己调试一下呀。</p>
    HuiminLu_NUDT 发表于2019年08月09日
    添加评论
  • 2楼

  • HuiminLu_NUDT 发表于2019年08月09日
    0 | 1 | 举报
    <p>%演示N个控制点的三次B样条曲线生成&nbsp; %N个控制点C=[C1 C2 C3 C4 ... CN]<br >C=[0 1 2 -2 -1 0<br >&nbsp;&nbsp; 0 0.3 2.5 2.5 4.7 5];<br >%小车的起点方向V1 %小车的终点方向V2<br >V1=[1;0];V2=[1;0];L=0.254/2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %L为小车长度的一半<br >NC=length(C);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %原始控制点数目<br >%增加控制点,保证过起点和终点,且起点的速度方向V1,终点速度方向为V2 <br >RC=[C(:,1)-V1*L,C(:,1),C(:,1)+V1*L,C(:,2:NC-1),C(:,NC)-V2*L,C(:,NC),C(:,NC)+V2*L];<br >N=length(RC);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %控制点扩充后的控制点数目<br >s=0:0.01:1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br >f1s=(1-s).^3/6;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %四个样条函数1<br >f2s=(3*s.^3-6*s.^2+4)/6;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %四个样条函数2<br >f3s=(-3*s.^3+3*s.^2+3*s+1)/6;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %四个样条函数3<br >f4s=s.^3/6;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %四个样条函数4<br >Ps=[]; figure(1);plot(RC(1,:),RC(2,:),'r*');hold on; mycolor='mbc' ;<br >for i=1:N-3<br >&nbsp;&nbsp;&nbsp; P=RC(:,i)*f1s+RC(:,i+1)*f2s+RC(:,i+2)*f3s+RC(:,i+3)*f4s;<br >&nbsp;&nbsp;&nbsp; Ps=[Ps P];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; %拼接N-3段样条曲线<br >&nbsp;&nbsp;&nbsp; plot(P(1,:),P(2,:),mycolor(mod(i,3)+1));<br >end<br >title('过起点和终点的B样条曲线');grid on;hold off;</p>
    HuiminLu_NUDT 发表于2019年08月09日
    • 澄碧钓徒 2019年08月09日
      0 | 举报
      <p>Python这些科学计算库的用法几乎都是在踩坑中摸索,报错很多时候都是因为凭感觉套用MATLAB的类似函数,之前用Python写加密算法就好几次都在numpy库上中招。。。</p>
      澄碧钓徒 发表于2019年08月09日
      0 | 举报
    添加评论
  • 3楼

  • HuiminLu_NUDT 发表于2019年08月09日
    0 | 0 | 举报
    <p>上面这个是Matlab源代码</p>
    HuiminLu_NUDT 发表于2019年08月09日
    添加评论
  • 4楼

  • HuiminLu_NUDT 发表于2019年08月09日
    0 | 0 | 举报
    <p>您好!机器人运动规划部分的Matlab代码已经上传至“3.4 机器人运动规划—B样条曲线的曲率”这一讲的富文本中。点击富文本中的下载附件。</p>
    HuiminLu_NUDT 发表于2019年08月09日
    添加评论
  • 5楼

  • HuiminLu_NUDT 发表于2019年08月15日
    0 | 0 | 举报
    <p>Car-Like小车运动规划与控制的Matlab/Simulink仿真教程,已经添加在“3.11 机器人运动控制总结”这一节的富文本中,请下载参考,按照里面的步骤自己实践一下呀。注意安装matlab2016b。</p>
    HuiminLu_NUDT 发表于2019年08月15日
    添加评论