论文:轨迹路线生成算法

559 阅读8分钟

作者A:XOSG jimmy.blog.csdn.net/

作者B:旺仔好喝QQ:565848342 qq交流群:76052408

1df60200fb618bb099d1d1a475aba8d8.png

轨迹路线生成算法

考虑到论文要转为英文,故图片使用了中英文两种版本

计算机矢量图形学

计算机矢量图形学是计算机图形学(CG)的分支,和流行的三角网(mesh)和体素化(voxel)不同,矢量图形主要利用最基础的,用数学方程定义的二三维简单图元来绘制万物,如B-样条、螺旋曲线、贝塞尔曲线、线段与弧线等。矢量几何轨线拥有体积小、不失真、易扩展等特点。

贝塞尔曲线(Bézier Curve)

贝塞尔曲线是最常见的曲线方程之一,在各行各业都有应用,也是矢量图形学的基本图元,贝塞尔曲线的优势是能够利用最少的节点绘制出平滑的曲线,因此只需要存储曲线上的几个“锚点”,便可以通过非线性插值方法得到曲线上所有的点,大大地优化了存储空间。原理上,通过在每个线段上各取一个等比例的运动点P,P点相连使得线段数减一,得以递归直到剩下最后一条线段,P点的公式遂得出。例如三次贝塞尔曲线如下:

af97f3ca90bb6c7804886da4f4a4772a.png

三次贝塞尔曲线有4个初始定点,因此需要经过3次演推,方可得到关于P1、P2、P3、P4和T的三次多项公式:

/* 第 1 次递归 */

P5 = P1 + (P2 - P1)T

P6 = P2 + (P3 - P2)T

P7 = P3 + (P4 - P3)T

*

/* 第 2 次递归 */

P8 = P5 + (P6 - P5)T

P9 = P6 + (P7 - P6)T

*

/* 第 3 次递归 */

P = P8 + (P9 - P8)T

  = P1(1 - T)^3 + 3P2T(1 - T)^2 + 3P3(1 - T)T^2 + P4T^3

合理设置初始定点的数量和位置(平面或立体),就可以实现各种各样的形状。

虚幻引擎:样条线子系统

虚幻引擎4(Unreal Engine 4)是开源的 3D 渲染引擎,实现了计算机图形学常用的算法,该引擎提供了样条线子系统(spline),让用户能够可视化地编辑贝塞尔曲线,在场景中实时渲染,因此我们选择利用该系统来生成非线性的空间轨迹。

动态生成空间轨迹路线

生成一条从初始状态到目标状态的运动轨迹是自主导航行为的基础。近几年来,关于该问题已有了大量的研究,主要研究内容是如何通过给定的空间坐标(如经纬度海拔或者东北天坐标)生成一条轨迹。T. Howard, A. Kelly研究了全轮转向机器人的轨迹样条生成算法【见引用】,陈洋,张道辉等人对自主学习框架的无人机三维路径规划进行了研究【见引用】,Jolly K G等基于三阶贝塞尔曲线,对多机器人的轨迹规划问题和运动学约束进行了研究【见引用】。本文提出了在运行时从任意点动态生成样条曲线,以及在曲线轨道上添加流动材质的可行性与稳定性。

4d8af086f692cf22b3f53ae6b75cb0b1.png

图1 动态生成轨迹路线流程图

第一步 从外部获取点的信息

JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。任何支持的类型都可以通过 JSON 来表示,例如布尔值、字符串、数字、对象、数组、Null等。

UE4中使用VARest插件可以很方便的对JSON进行解析。以点位信息数据为例,建立数据格式:

创建路径type表明这条信息的用处
pointInfo用数组的形式传输点位信息

表1 创建路径信息的Json表

创建路径信息的JSON数据:{"type":"CreateRoute","pointInfo":["0,0,0","100,100,0","300,200,0"]}

a573347add11dba642a8244dffcc4dfd.png

英文

26e267b896a80948fb372f8afc5728c1.png

图2 从像素流中获取Json数据

740326446e8fa14fd3c36a90fdadb467.png

英文

dd4e8b2f8925769d110281ed48a98428.png

图3 从Json数据中解析出点位坐标

第二步 根据点生成样条线

UE4中蓝图样条组件只是用于定义和使用位置数据的一个路径。可使用它在世界场景中移动 Actors(或其他 组件),或沿样条放置一系列的 Actors(或其他 组件)。样条线是一种根据点位生成一条曲线/直线的组件。

创建轨迹路径Actor,在Actor中添加Spline组件,并添加一个点位数组变量,点位数据由外部传递来,Spline组件根据点位信息生成一条样条线。

85a3913b6727aebf633be0ec236245ec.png

英文

19444d2dff463a0b6911ba011991e8b1.png

图4 将获取的点位信息传递给路径Actor

45a7375290bf9b6770014bf7a6bb4510.png

英文

a84416edf2eb36c14b617f7837336040.png

图5 根据点生成样条线

f30fb51719ffc441ac0740a912dd6deb.png

图6 样条线与点位匹配

第三步 根据样条线添加曲面

不同大小的平面可以通过一个1m*1m的平面模型进行缩放旋转来获得。但是曲面无法直接获得。而且线段的旋转也各不相同,我们要使用UE4中自带的蓝图样条网格体组件对平面进行弯曲,进而得到曲面。蓝图样条网格体组件将使单个静态网格体沿一个两点样条变形。无法对蓝图样条网格体组件添加更多样条点,但可通过蓝图完全控制两点。

38c12c7715535db3d58a6242d6be7ddb.png

英文

9c414c5a8dccf0d2e57c0cef6d99b451.png

图7 线段生成曲面方案1

e17541c90b47e9e1139127d7e33fd25f.png

英文

3bdf427561695efc81e6a115bd1ca87c.png

图8 根据每段线段生成曲面

改进:上诉方案可以生产对应的曲面,但是每段曲面都不一样长。为了保持每段的曲线长度一致,于是增加一个Distance变量,保证每次生成的曲面都一样长,如:每隔100单位生成一段曲面,最后会剩下一段长度不足100的线段。

e90abcf4ed7b08571c7d84be98d2b08e.png

英文

c90e400639c9700b67747a69914f95c2.png

图9  根据线段长度进行分段

1a708f516187dfb9008290b518712ccf.png

英文:

2484d40225dd86b223d6b698b9b006e4.png

图10 根据固定长度生成曲面

第四步 给每个平面添加材质

纹理上准备带透明底的箭头图片

6e3269e0ffbcf2169581d94c8e4ca831.png 

图11 箭头纹理

将材质配置成镂空透明层,只保留箭头,可配置纹理的大小、流动速度、参考如下:

1.先纹理缩放通过将默认UV的(1,1)*(ScaleX,ScaleY)进行缩放。

2.再将缩放后的UV增加纹理扰动量(SpeedX,SpeedY)。

3.扰动后的UV再加上纹理的偏移量(OffsetX,OffsetY)。

4.将最终的计算完成的UV给予箭头,让箭头实时流动。

9e8207d5d54d6b64aa01c4cc59e02da4.png

英文

271837e63ff0611b7d44648a702b164b.png

图12 材质节点

给曲面添加动态材质,并修改缩放、流速、颜色等参数。

假设我们设定的缩放值SizeX为1,速度Speed也设置为1,每段曲线长度Distance设置:100(长度越短越吻合样条线)

1.计算出我们需要的给予材质的缩放值、流速值

ScaleX =  (Distance / 200) / SizeX * 0.5 -1;

SpeedX = Speed * (-1) / SizeX;

7ecebab5fff5b1b603c81ba5c4439304.png

英文:

aba731a13a1e6e2ed02687bee291ad54.png

图13 计算需要给予材质的缩放值和速度值

2.给曲面设置材质

先创建设置材质参数的函数:功能是修改材质纹理的缩放、速度、偏移量。

速度已在前面算出为:SpeedX;

缩放值与该线段的长度有关:ScaleX = (Length / Distance) * (b+1)  - 1;

偏移量根据线段所在段数而确定:OffsetX = ScaleX * 第几段线段;

设置材质参数

d249283d2e9c069c3619d16faf5b31b0.png

英文

7b27f73c18d1655c98dad946a32ff525.png

图14 蓝图中设置材质的参数

在第二步生成曲面之后,增加设置材质的功能

7954855c1790e804fa8386d92535cd4c.png

英文

8d661ae33d91d36e2b6a4b8b388f22d8.png

图15 生成曲面后赋予动态材质并修改材质参数

结果:

一个根据点位动态生成的流动路径就有了。

e13ea77109322d2f7d3cb4750bd2635c.png

图16 动态生成的曲线路径

引用

1.W. E. Ellis. 1989. Postscript, Bezier curves, and chinese characters. In Proceedings of the 17th conference on ACM Annual Computer Science Conference (CSC '89). Association for Computing Machinery, New York, NY, USA, 162–165. DOI: doi.org/10.1145/754…

2.Gaoqun Zheng, Shangbai Li, and Xiaohua Liu "Application studies on quadratic Bezier curves", Proc. SPIE 2644, Fourth International Conference on Computer-Aided Design and Computer Graphics, (22 March 1996); doi.org/10.1117/12.… 【CAD二次贝塞尔曲线的应用研究】

3.Duncan M. Applied Geometry for Computer Graphics and CAD. Springer, 2005.【详细的贝塞尔曲线资料】

4.Howard T M, Kelly A. Trajectory and spline generation for all-wheel steering mobile robots. In: Proceedings of the 2006 IEEE/RSJ International Conference on Intelligent Robots and Systems. Beijing, China: IEEE, 2006. 4827−4832【生成一条从初始状态到目标状态的轨迹、自主导航行为、样条线】

5.陈成, 何玉庆, 卜春光, 韩建达. 基于四阶贝塞尔曲线的无人车可行轨迹规划. 自动化学报, 2015, 41(3): 486−496 DOI 10.16383/j.aas.2015.c140295

6.Chen Yang, Zhang Dao-Hui, Zhao Xin-Gang, Han JianDa. UAV 3D path planning based on IHDR autonomous-learning-framework. Robot, 2012, 34(5): 513−518 (陈洋, 张道辉, 赵新刚, 韩建达. 基于 IHDR 自主学习框架的无人 机 3 维路径规划. 机器人, 2012, 34 (5): 513−518)

7.Jolly K G, Sreerama K R, Vijayakumar R. A bezier curve based path planning in a multi-agent robot soccer system without violating the acceleration limits. Robotics and Autonomous Systems, 2009, 57(1): 23−33

8.docs.unrealengine.com/4.27/zh-CN/… Blueprint Splines