轨迹系列3——通过时间及距离维度进行轨迹聚类平滑的一种方案

文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

1.背景

最近项目需求,对轨迹的纠正、信息挖掘、展示等做了一系列的探索性研究。在前面的博客中,写到了基于中值滤波的轨迹纠正(http://www.cnblogs.com/naaoveGIS/p/6492889.html),实际运用中,我们是把卡尔曼滤波算法与实际场景结合(加上一些性能和各细节优化)来进行的轨迹纠正,在以后的博客中我将和大家一起分享。这里我要和大家一起探讨的是在前端如何对轨迹进行平滑的展示。

以下是未经处理过的原始轨迹:

 

明显可以看到,当人员在某个地方来回走动时,纠缠在一起的轨迹线会特别的多。普通的轨迹平滑,是指将直线连接以bezel曲线进行平滑,但是对于这种打结的现象,则无法单纯以曲线拟合来解决。这里,我们讨论一种以聚类算法来让局部打结点整合成一个点从而实现平滑的方案。

2.思路详解

2.1一般聚类方法

 

普通聚类一般有网格聚类法、K中值聚类法等,这些聚类方法一般是仅从地理维度出发来进行聚类,但是在我们轨迹的实际情况中我们必须将时间这个维度考虑进去才是更合理的,否则整个轨迹图很容易丢失一些重要的节点信息。所以,这里我们以距离、时间两个维度来进行聚类。

2.2加入时间维度的聚类方法

这里我们必须考虑这样几个影响因子:

GPS是很容易漂移的,如果某几个点出现畸变,它同样应该归纳为聚类点中。

时间维度和空间维度的结合,可以解释为在某个时间段内,连续移动的空间位置与聚类点之间的聚类均没有超过阈值,则归纳为同一点。

于是我们这个聚类方法可以描述为:在规定时间及以上,某物体连续移动的距离没有超过聚类点的距离阈值,期间允许出现某几次阈值距离外的畸变点,那么这样的一些点统一可以聚类为一个点。

具体聚类步骤为:

 

 

3.结果展示

3.1原始数据聚类展示

 

3.2.加上卡尔曼滤波后的结果展示

 

可以看见,卡尔滤波对轨迹的平滑效果很明显。

3.3进一步优化后的展示

              

图中因为有部分轨迹数据有明显信号丢失,导致轨迹的连线出现了穿墙的问题,这里对轨迹信号丢失处进行打断处理,如图:

 

4.优缺点讨论

优点:将没有太大意义的轨迹点聚类成一个点,可以实现很好的平滑效果,并且可以突出逗留位置。

缺点:参数设置的不同会严重影响展示结果,并且可能会导致某些特征点的丢失。

5.进一步设想

在通过大量轨迹数据实现路网自建后,结合自建路网进行轨迹纠正应该效果会更加逼真。

 

                               

                                                                    -----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

                                                                           如果您觉得本文确实帮助了您,可以微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^

                                                                                                            

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的根据距离平滑速度的 C 代码示例: ```c #include <math.h> void smooth_velocity(double distance, double max_speed, double max_acc, double *velocities) { double time_to_max_speed = max_speed / max_acc; double distance_to_max_speed = 0.5 * max_acc * pow(time_to_max_speed, 2); if (distance > 2 * distance_to_max_speed) { double t1 = time_to_max_speed; double t2 = (distance - 2 * distance_to_max_speed) / max_speed; double t3 = time_to_max_speed; double v1 = max_acc * t1; double v2 = max_speed; double v3 = max_acc * t3; velocities[0] = v1; velocities[1] = v2; velocities[2] = v3; velocities[3] = t1; velocities[4] = t2; velocities[5] = t3; } else { double v1 = sqrt(distance * max_acc / 2); double t1 = v1 / max_acc; double t2 = t1; double v2 = v1; double v3 = 0; velocities[0] = v1; velocities[1] = v2; velocities[2] = v3; velocities[3] = t1; velocities[4] = t2; velocities[5] = t1; } } ``` 在上面的代码中,`smooth_velocity` 函数接受四个参数: - `distance`:机器人当前位置与目标点之间的距离; - `max_speed`:机器人可以达到的最大速度; - `max_acc`:机器人可以施加的最大加速度; - `velocities`:一个长度为 6 的数组,用于存储计算出的平滑速度信息。 函数首先计算机器人加速到最大速度所需的时间 `time_to_max_speed`,然后计算机器人在这段时间内可以行驶的距离 `distance_to_max_speed`。如果目标点与当前位置之间的距离大于两倍的 `distance_to_max_speed`,说明机器人需要进行三段平滑加减速运动: - 第一段:机器人加速到最大速度; - 第二段:机器人以最大速度匀速行驶; - 第三段:机器人减速到目标点。 在每一段运动中,函数计算机器人的速度 `v1`、`v2` 和 `v3`,以及加速和减速的时间 `t1` 和 `t3`。在第二段运动中,机器人的速度始终等于最大速度 `max_speed`。最后,函数将计算出的速度和时间信息存储到 `velocities` 数组中。如果目标点与当前位置之间的距离小于等于两倍的 `distance_to_max_speed`,则表示机器人只需要进行一次平滑加减速运动。 你可以根据实际情况调整 `max_speed` 和 `max_acc` 的值,以达到最佳的控制效果。同时,你还需要将 `smooth_velocity` 函数集成到机器人的控制逻辑中,以实现根据距离平滑速度的策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值