精华内容
下载资源
问答
  • 地图轨迹平滑算法

    万次阅读 2016-08-04 00:21:34
    地图轨迹平滑算法,Savitzky-Golay 滤波器

    地图轨迹平滑算法

    引子:

    之前看到网上有大神写过一个demo:
    http://blog.csdn.net/zhoumushui/article/details/41751259
    这里写图片描述
    但是提供的代码不全,一直没有明白这个算法是怎么做的:
    这里写图片描述
    这里写图片描述

    算法说明:

    后来一次偶然的机会,看到这篇文章(注意,这篇文章里的代码,部分算法的参数是错的):
    http://blog.csdn.net/liyuanbhu/article/details/11119081
    这里写图片描述
    其中的5点平滑代码恰恰和之前描述的一样,原来之前的文章只给出了边缘4个点(最前面2个点、最后面2个点),恰恰漏掉了最关键的中间所有点、虽然只是简单的5点平均

    这个算法是Savitzky-Golay 滤波器的“5点1阶”算法。那么,怎么推导出“n点k阶”的系数呢?笔者没有时间去仔细研究算法本身,只想找到最快的方法解决问题,最后发现可以通过MatLab直接的得到这些参数,比如:
    这里写图片描述
    这个矩阵前2行对应前两个点的系数,后2行对应后两个点的系数,中间行对应中间所有点的系数。

    结论:这样就完成了,用MatLab 根据需要得到矩阵,然后就可以编程了!

    展开全文
  • 轨迹平滑和纠偏纠偏通过gps获取坐标点时 因为gps信号不稳定等原因 出现坐标点异常 不符合实际 进行异常点的处理 来对轨迹纠正轨迹偏移不正常取得轨迹坐标集合 对此段轨迹设置起点和终点 取得相邻两坐标点 计算出两点...

    轨迹平滑和纠偏

    纠偏

    通过gps获取坐标点时 因为gps信号不稳定等原因 出现坐标点异常 不符合实际 进行异常点的处理 来对轨迹纠正

    轨迹偏移不正常

    7333180474e341fcc76b727a34e23e03.png

    取得轨迹坐标集合 对此段轨迹设置起点和终点 取得相邻两坐标点 计算出两点之间距离 对比获取坐标点的时间 判断坐标时速异常 对坐标点移除处理

    代码逻辑

    6305520b19ee88ae1f3bc9f3cc4ecbbd.png

    e41428466869c158ddc4895888c450bb.png

    异常点去除之后轨迹

    e43b0520ba4f55947b4ff80a5e3ded9e.png

    轨迹平滑处理

    实现思路方法

    1.百度地图鹰眼服务:

    源码主要实现思路:计算相邻坐标点之间距离 通过时间判断速度 挑出 异常点 绑定道路的实现方式

    2.数据库坐标去重过滤:

    高斯滤波:.

    百度鹰眼服务

    文档地址:http://lbsyun.baidu.com/index.php?title=yingyan/api/v3/trackupload

    上传轨迹 —轨迹处理—返回轨迹

    请求方式 http://yingyan.baidu.com/api/v3/track/addpoint //POST请求

    参数

    核心参数

    ak 用户授权标识

    Service_id 鹰眼服务标识

    entity_name 轨迹所属实例

    Longitude 经度

    Latitude 纬度

    loc_time 获取坐标点时间

    coord_type_input 坐标类型

    wgs84:GPS 坐标

    gcj02:国测局加密坐标

    bd09ll:百度经纬度坐标

    7eb27aa0593e4f05c42a25771919e7fa.png

    返回值参数

    6f1d750f3db338d80d8305975652c585.png

    多轨迹上传

    可上传多个实例的多个轨迹 核心方法 addpoins

    http://yingyan.baidu.com/api/v3/track/addpoints //POST请求

    所需参数如下

    5ea188ddbeb3e6f4be0160ade6d7db2c.png

    Point_list 为多个实例和轨迹的集合格式如下 返回值如下

    25adffc422e96c5a82065e9dc6d30cc3.png

    10c328c18e6dd69887c3cb2a4eb7d472.png这是entity实例 可单个上传或批量

    a7370494070dc3975407d91c2d7b73d2.png

    这是属于entity的轨迹addpionts 可批量上传 单独上传 进行轨迹处理

    可有去噪 抽稀 绑路 终端补偿等 在传递参数时设置 返回纠正后集合

    纠正之后

    3a85c4b2ea4d10a068fbe5766c3cd8d9.png

    数据库坐标去重过滤

    以下方案摘取:https://www.jianshu.com/p/1c71d10e18bf

    将取到的若干坐标点存入到数据库 核心字段 id 经纬度 时间

    434bd80fac397776ccf93e659f7a4c52.png

    将数据库坐标点去重

    e5fe137b4549df4fb7d5fa7d5bd765b4.png

    数据平滑采用高斯滤波进行平滑处理

    94dd8a9c186f2d9d3d8150ace8d0832e.png

    将处理后的坐标点铺到地图上

    5f668c1de58d8c1cead1c691e14b0fe0.png

    坐标匹配到道路上去,但是由于精度不是那么可靠,切在转弯处的数据匹配也是明显的错误,但是目前没找到好的解决方案

    总结:

    无论纠偏、异常点处理、轨迹平滑 其根本都是对坐标点的处理 核心参数是经纬度以及经纬度对应的时间 进行处理 在坐标点做够多的情况下 gps不稳定获取的坐标点不够精确导致的问题

    展开全文
  • 针对这些问题,提出了一种新的基于小波降噪载体位置平滑算法。算法对基于伪码测距和载波多普勒平滑伪距的解算结果进行差分,并根据差分值的频谱特征,选择合适的尺度进行小波降噪处理后,与基于载波多普勒平滑伪距的...
  • 使用场景出行、运动等类别的app中常常会需要展示车辆或用户的行程轨迹、实时移动轨迹等数据,相应效果需要车辆在地图上平滑移动。该demo展示了如何实现该效果。用到产品核心类/接口类接口说明版本MAMapview- (void)...

    使用场景

    出行、运动等类别的app中常常会需要展示车辆或用户的行程轨迹、实时移动轨迹等数据,相应效果需要车辆在地图上平滑移动。该demo展示了如何实现该效果。

    用到产品

    核心类/接口

    类接口说明版本

    MAMapview- (void)addOverlay:(id )overlay;添加轨迹线V4.0.0起

    MAMapview- (void)addAnnotation:(id )annotation;添加汽车V4.0.0起

    MovingAnnotationView- (void)addTrackingAnimationForPoints:(NSArray *)points duration:(CFTimeInterval)duration;添加动画----

    CACoordLayer- (void)display;显示当前帧----

    核心难点

    1、MovingAnnotationView 自定义annotationview,其layer是自定义的CACoordLayer

    /**

    动画AnnotationView,只试用于高德3D地图SDK。

    */

    @interface MovingAnnotationView : MAAnnotationView

    /*!

    @brief 添加动画

    @param points 轨迹点串,每个轨迹点为TracingPoint类型

    @param duration 动画时长,包括从上一个动画的终止点过渡到新增动画起始点的时间

    */

    - (void)addTrackingAnimationForPoints:(NSArray *)points duration:(CFTimeInterval)duration;

    @end

    + (Class)layerClass

    {

    return [CACoordLayer class];

    }

    func initRoute() {

    let count: Int = s_coords.count

    self.fullTraceLine = MAPolyline(coordinates: &s_coords, count: UInt(count))

    self.mapView.add(self.fullTraceLine)

    var routeAnno = [Any]()

    for i in 0..

    let a = MAPointAnnotation()

    a.coordinate = s_coords[i]

    a.title = "route"

    routeAnno.append(a)

    }

    self.mapView.addAnnotations(routeAnno)

    self.mapView.showAnnotations(routeAnno, animated: false)

    self.car1 = MAAnimatedAnnotation()

    self.car1.title = "Car1"

    self.mapView.addAnnotation(self.car1)

    weak var weakSelf = self

    self.car2 = CustomMovingAnnotation()

    self.car2.stepCallback = {() -> Void in

    weakSelf?.updatePassedTrace()

    }

    self.car2.title = "Car2"

    self.mapView.addAnnotation(self.car2)

    self.car1.coordinate = s_coords[0]

    self.car2.coordinate = s_coords[0]

    }

    2、CACoordLayer,每次显示时根据mapPoint计算屏幕坐标

    - (void)display

    {

    CACoordLayer * layer = [self presentationLayer];

    MAMapPoint mappoint = MAMapPointMake(layer.mapx, layer.mapy);

    CGPoint center = [self.mapView pointForMapPoint:mappoint];

    center.x += self.centerOffset.x;

    center.y += self.centerOffset.y;

    self.position = center;

    }

    func mov() {

    let speed_car1: Double = 120.0 / 3.6

    //80 km/h

    let count: Int = s_coords.count

    self.car1.coordinate = s_coords[0]

    let duration = self.sumDistance / speed_car1;

    self.car1.addMoveAnimation(withKeyCoordinates: &s_coords, count: UInt(count), withDuration: CGFloat(duration), withName: nil, completeCallback: {(_ isFinished: Bool) -> Void in

    })

    //小车2走过的轨迹置灰色, 采用添加多个动画方法

    let speed_car2: Double = 100.0 / 3.6

    //60 km/h

    weak var weakSelf = self

    self.car2.coordinate = s_coords[0]

    self.passedTraceCoordIndex = 0

    for i in 1..

    let num = self.distanceArray[i - 1]

    let tempDuration = num / speed_car2

    self.car2.addMoveAnimation(withKeyCoordinates: &(s_coords[i]), count: 1, withDuration: CGFloat(tempDuration), withName: nil, completeCallback: {(_ isFinished: Bool) -> Void in

    weakSelf?.passedTraceCoordIndex = i

    })

    }

    }

    展开全文
  • 一种比较容易做出的是对鼠标移动轨迹画点,再将两点之间以直线相连,最后再进行平滑处理,这种方案不需要什么算法支持,但同样,它面对一个性能和美观的抉择,打的点多,密集,性能相对较低,但更加美观,视觉上更...

    signature_pad一个基于Canvas的平滑手写画板工具

    介绍

    实现手写有多种方式。

    一种比较容易做出的是对鼠标移动轨迹画点,再将两点之间以直线相连,最后再进行平滑处理,这种方案不需要什么算法支持,但同样,它面对一个性能和美观的抉择,打的点多,密集,性能相对较低,但更加美观,视觉上更平滑;

    此处用的另一种方案,画贝塞尔曲线。

    由于canvas没有默认的画出贝塞尔曲线方法(感谢@madRain评论中更正)由于canvas并没有提供根据初始和结束点计算出贝塞尔曲线控制点的API,因此这里使用了贝塞尔曲线的一系列算法,包括求控制点,求长度,计算当前点的大小,最后用canvas画出每一个确定位置的点。

    补充:个人认为,之所以不使用canvas提供的贝塞尔曲线API,是因为可以实时控制线条粗细(点的大小),在斜街的时候达到平滑的效果。

    参数及配置介绍

    提供的可配置参数如下

    export interface IOptions {

    // 点的大小(不是线条)

    dotSize?: number | (() => number);

    // 最粗的线条宽度

    minWidth?: number;

    // 最细的线条宽度

    maxWidth?: number;

    // 最小间隔距离(这个距离用贝塞尔曲线填充)

    minDistance?: number;

    // 背景色

    backgroundColor?: string;

    // 笔颜色

    penColor?: string;

    // 节流的间隔

    throttle?: number;

    // 当前画笔速度的计算率,默认0.7,意思就是 当前速度=当前实际速度*0.7+上一次速度*0.3

    velocityFilterWeight?: number;

    // 初始回调

    onBegin?: (event: MouseEvent | Touch) => void;

    // 结束回调

    onEnd?: (event: MouseEvent | Touch) => void;

    }

    这里要注意的是并没有线条粗细这个选项,因为这里面的粗细不等线条都是通过一个个大小不同的点构造而成;

    throttle这个配置可以参考loadsh或者underscore的_.throttle,功能一致,就是为了提高性能。

    注册事件

    在constructor内部,除了配置传入的参数外,就是注册事件。

    这里优先使用了PointerEvent触点事件,PointerEvent可以说是触摸以及点击事件的统一,如果设备支持,不需要再分别为mouse和touch写两套事件了。

    状态数据储存

    状态开关:

    this._mouseButtonDown

    当执行move事件时,会检查此状态,只有在true的情况下才会执行。

    数据储存分为2种格式:

    pointGroup

    这是当前笔画的点的一个集合,内部储存了当前笔画的颜色color和所有的点points。

    this._data

    这是一个储存所有笔画的栈,格式为[pointGroup, pointGroup, ..., pointGroup],当需要执行undo的时候,只需要删除this._data中的最后一条数据。

    事件流程及方法

    mouseDown事件

    当鼠标(触点)按下时,改变状态this._mouseButtonDown = true,调用onBegin回调,创建当前笔画的一个新的集合,然后对当前点执行更新。

    mouseMove事件

    首先检查this._mouseButtonDown状态,对当前点执行更新。

    mouseUp事件

    改变状态this._mouseButtonDown = false;,调用onEnd回调,对当前点执行更新。

    可以看到,上面的每一个事件内部都调用对当前点执行更新的方法。

    _strokeUpdate——点的更新方法

    private _strokeUpdate(event: MouseEvent | Touch): void {

    // 获取当前触点的位置

    const x = event.clientX;

    const y = event.clientY;

    // 创建点

    const point = this._createPoint(x, y);

    // 调出最后一个点集

    const lastPointGroup = this._data[this._data.length - 1];

    // 获取最后一个点集的点的数组

    const lastPoints = lastPointGroup.points;

    // 如果存在上一个点,获取上一个点

    const lastPoint =

    lastPoints.length > 0 && lastPoints[lastPoints.length - 1];

    // 判断上一个点到当前点是否太近(也就是小于配置的最小间隔距离)

    const isLastPointTooClose = lastPoint

    ? point.distanceTo(lastPoint) <= this.minDistance

    : false;

    // 调出点集的颜色

    const color = lastPointGroup.color;

    // Skip this point if it's too close to the previous one

    // 存在上一个点但是太近,跳过,其余的执行

    if (!lastPoint || !(lastPoint && isLastPointTooClose)) {

    // 向上一次的点数组中添加当前点,并且生成一个新的贝塞尔曲线实例

    // 包括4个点 (初始点,2个控制点,结束点)

    // 初始宽度,最终宽度

    const curve = this._addPoint(point);

    // 如果不存在lastPoint,即当前点是第一个点

    if (!lastPoint) {

    // 画一个点

    this._drawDot({ color, point });

    // 如果存在lastPoint 并且能形成一个贝塞尔曲线实例(3个点以上)

    } else if (curve) {

    // 画出参数中curve实例中两点之间的曲线

    this._drawCurve({ color, curve });

    }

    // 添加到当前笔画的点数组

    lastPoints.push({

    time: point.time,

    x: point.x,

    y: point.y,

    });

    }

    }

    这个方法前面就是一系列判断

    判断是否是第一个点

    判断是否能加入点的集合(满足点的最小间隔)

    判断是否能画出贝塞尔曲线(满足至少3个点)

    对于能画出贝塞尔曲线的点,执行算法,求出Besier实例,包括4个点初始点,结束点,控制点1,控制点2以及当前曲线中线条的的初始宽度和结束宽度。

    具体如何算的,请参考源码src/bezier.ts和这篇文章。

    对于能画出贝塞尔曲线的,对已经求出的Bezier实例,执行this._drawCurve,否则执行this._drawDot

    this._drawDot——画点的方法

    获取配置中的dotSize,执行canvas画点。

    this.__drawCurve——画线的方法

    求出当前Bezier实例初始点和结束点之间的距离,这个距离不是直线距离,而是贝塞尔曲线距离。

    对这个距离进行扩展,例如,计算得到距离为50,那就扩展为100个点,即我需要在50这个距离内画出100个点;

    这么做可以保证在正常或者稍微快速的书写中,不出现断层。

    接着又是算法,目的是求出这个距离内的每一个点的大小,这是一个变化值,是的粗细变化更加平滑。

    最后同样是canvas画点。

    以上就是整个基本流程。

    总结

    阅读一遍后,这个库说白就是基础的事件操作+贝塞尔曲线算法,但是,它内部的代码格式非常清晰,细粒度+代码复用使得维护起来非常方便。

    同时可以对贝塞尔曲线有一个更深层的了解(算法还是没法手撕囧),但起码有一个比较完整的思路;

    一些可以借鉴的东西:

    canvas+贝塞尔曲线

    节流throttle的写法(参考源码src/throttle.ts)

    导图

    7f4ded8d09c6e867c92dfa2c478ed2cb.png

    贝塞尔曲线算法资料:

    源码阅读专栏对一些中小型热门项目进行源码阅读和分析,对其整体做出导图,以便快速了解内部关系及执行顺序。

    当前源码(带注释),以及更多源码阅读内容:https://github.com/stonehank/sourcecode-analysis,欢迎fork,求

    展开全文
  • 1.背景最近项目需求,对轨迹的纠正、信息挖掘、展示等做了一系列的探索性研究。在前面的博客中,写到了基于中值滤波的轨迹纠正...这里我要和大家一起探讨的是在前端如何对轨迹进行平滑的...
  • 用于一维、二维、三维轨迹平滑(对需要平滑的轴使用该函数即可) 公式 以5点MA平滑为例: ys(i)=12N+1(y(i+N)+y(i+N−1)+…+y(i−N))ys(1)=y(1)ys(2)=(y(1)+y(2)+y(3))/3ys(3)=(y(1)+y(2)+y(3)+y(4)+y(5))/5ys(4)=(y...
  • 为了解决传统的点位控制算法在加工复杂轨迹时速度频繁变化造成的机床抖动、加工效率低等问题,提出连续轨迹平滑过渡算法。文中首先指出插补离散化导致连续轨迹需要跨段过渡,然后提出两种连续轨迹单周期过渡方案并...
  • 简单轨迹跟踪 平滑的机器人轨迹跟踪算法算法 来源:' : ' 结果 依存关系 使用以下命令安装依赖项: pip3 install -r requirements.txt 按照->' '上的说明安装mujoco-py 接触 电子邮件:
  • 基于轨迹平滑的室内移动目标定位算法
  • 本代码用于平滑轨迹,方法是每进入5个点,就对五个点进行处理,让其符合一段平滑曲线。前一个第五点后面新进的第一个点的链接方法是直接连线(暂未想到更好的方法,如果有就再次更新),里面有注释可以慢慢看。
  • 基于时间平滑度的运动轨迹轨迹聚类新算法
  • SG平滑轨迹算法的原理和实现

    千次阅读 2020-03-19 18:40:51
    SG平滑算法是由Savizkg和Golag提出来的。基于最小二乘原理的多项式平滑算法,也称卷积平滑。为啥叫多项式平滑呢?且看下去。  下面使用五点平滑算法来说明平滑过程  原理很简单如图: 假设窗口大小为5,即每次取5...
  • dijkstra算法轨迹平滑,传感器融合标定算法,另外还包含了自动驾驶学习资料 涵盖感知,规划和控制,ADAS,传感器; 1. apollo相关的技术教程和文档; 2.adas(高级辅助驾驶)算法设计(例如AEB,ACC,LKA等) 3.自动...
  • 第二类是基于采样的搜索方法,如 Dijkstra算法、A*算法、人工势场法等方法解决轨迹规划问题。第一类基于曲线插值的方法:直线和圆弧段实现起来简单、低计算量,但曲率不连续、节点片段连接;多项式曲线具有低计算量...
  • 在现代战争中,随着精确制导武器的广泛使用,飞行控制技术的研究已日趋深入和...这里论述了某无动力弹的飞行控制系统中解算控制率的方法,以及对其弹道临界点的平滑处理,并用数字信号处理器对其算法进行了工程实现。
  • 参考文章:... python实现代码:以下为7点2次MA算法 实验结果: from matplotlib import pyplot as plt import numpy as np x = np.linspace(1, 30, 30) # X轴数据 # 原始数据 a = ...
  • 仿真试验结果表 明,在该策略驱动控制 下液压 四足机器人行走过 程连 续平稳 ,样机足端 轨迹较为平滑 , 躯干起伏较 小,证 明了该足端轨迹规划方法用于 四足机器人 步态设计 的合理性和有 效性 。
  • 受此启发,将这一思想拓展到UAV或者是任何背景的三维或者是二维轨迹规划问题,即可得到本文所讲述的流体扰动原理规划算法。 这一算法实际上属于人工势场算法的一种变形,在没有障碍物的前提下,三维空间中存在一个...
  • 算法根据加工轨迹的几何特征、误差、加减速要求,计算出连续轨迹各段之间衔接处的最大允许速度,实现连续轨迹平滑过渡。在基于ARM + DSP + FPGA多核架构的独立式控制器中对所提算法进行了实现和验证。结果表明...
  • 1.背景 最近项目需求,对轨迹的纠正、信息挖掘、展示...在前面的博客中,写到了基于中值滤波的轨迹纠正(http://www.cnblogs.com/naaoveGIS/p/6492889.html),实际运用中,我们是把卡尔曼滤波算法与实际场景结合(...
  • 任务空间多路径段平滑过渡可提高...在6自由度工业机器人实时控制系统平台上进行实验验证,结果表明,与传统加减速控制算法相比,该前瞻算法的作业执行效率可提高22.03%以上,并可实现多路径段间速度的平滑过渡和轨迹的修形.
  • 文章目录简介1、为什么需要光滑轨迹?2、光滑轨迹生成一、光滑轨迹的生成二、使用步骤1....平滑度的标准 通常是转化为最小化“输入”的变化率 一、光滑轨迹的生成 二、使用步骤 1.引入库 代码如下(示例)
  • 针对机械手时间最优、能量最优、平滑性最优等多目标下的轨迹优化问题,设计新的多目标轨迹优化方法.采用高次8样条曲线插值方法,构造机械手高阶连续且起始和终止的运动参数均可指定的关节轨迹,保证了机械手运动...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 140
精华内容 56
关键字:

轨迹平滑算法