• matlab练习程序(离散点平滑算法)


    路径平滑方法有很多。

    如果有预测量可以使用卡尔曼滤波。

    如果只是单纯的离散点也可以用多项式拟合、样条插值、回旋曲线或者均值滤波来平滑。

    这里这个算法是Apollo里面的算法,单独拿出来看一下吧。

    首先算法是利用最优化的方法来求解的,待优化参数就是所有的离散点(xk,yk),如下图:

    设定损失函数为 cost = cost_smooth + cost_length + cost_deviation。

    其中cost_smooth为平滑度代价,函数定义为:

     

    其中cost_length为长度代价,函数定义为:

     

    其中cost_deviation为偏离原始点代价,函数定义为: 
     

    最后迭代优化参数(xk,yk),最终使其cost最小即可。

    下面没有再自己写优化方法了,用的matlab中lsqnonlin方法,其实还是LM优化方法。

    matlab代码如下:

    clear all;close all;clc;
    
    x = 0.1:0.1:2*pi;
    y = sin(x)+log(x).*cos(x) + rand(length(x),1)'*0.5;
    x = x + rand(length(x),1)'*0.2;
    plot(x,y,'r-o');
    axis equal;
    
    Ref = [x' y'];
    par = [x' y'];              %待优化参数
    
    options.Algorithm = 'levenberg-marquardt';
    f = @(par) func(par,Ref);
    lb = [];
    ub = [];
    [par,res]= lsqnonlin(f,par,lb,ub,options);
    
    hold on;
    plot(par(:,1),par(:,2),'g-o');
    
    function re = func(par,Ref)     %构建优化模型,re为损失误差
    
    cost_s = 0;
    cost_l = 0;
    cost_d = 0;
    for i = 2:length(par)-1
        cost_s = cost_s + norm(2 * par(i,:) - par(i-1,:) - par(i+1,:));
        cost_l = cost_l + norm(par(i+1,:) - par(i,:));
        cost_d = cost_d + norm(par(i,:) - Ref(i,:));
    end
    
    re = cost_s+cost_l+cost_d;
    
    end

    结果如下:

    参考:离散点曲线平滑原理

  • 相关阅读:
    Centos7 安装python3 pip3
    VMW14.x虚拟机安装Mac10.13系统教程
    ADB命令大全
    appium服务器参数
    虚拟机VM14.X安装Mac10.12启动出现问题的解决方法
    Centos7安装vscode
    jmeter接口测试多数据组合登陆场景
    appium环境安装
    mysql命令大全
    jmeter录制请求
  • 原文地址:https://www.cnblogs.com/tiandsp/p/16210375.html
Copyright © 2020-2023  润新知