
本章作为“AGVs静态交通管制”的知识补充,用于讲解AGV在线段上行驶时车体的角度计算,以使用该角度在线段(曲线直线)上生成AGV占用矩形。

所以在发布静态交通管制专题之前先对本章中的算法进行讲解。更多精彩内容请前往AGV调度管理系统技术中心。

本章目录
1问题引出
2路径规划中的图论
3AGV车体的几何描述
4曲线上车体角度的计算
5直线上(曲线的下一段)车体角度的计算
6核心算法代码
6.1曲线上计算车体角度算法代码
6.2直线上计算车体角度算法代码
问题引出
车前进的时候,前轮转过的角度和车体本身转过的角度有什么关系?
AGV路径规划中会考虑上面的问题,它的结果将用于AGV占用矩形的方向计算。
我们先把问题引出来:

我们从上面的图形可以看出,当AGV前轮从B点行驶到N点时车身并没有从0度转到270度(-90度)。这意味着车前轮转过的角度与车体转过的角度不同,那在AGV占用矩形计算中,应该如何获得前轮在曲线上走过的每个点的车体角度呢?
另外一个潜藏问题(本章不做详细讲解):是否存在一种配置,使得AGV在结束曲线驱动时将车身旋转到和曲线结束点的切线角度(270°)一致呢? 答案是肯定的,就像下图一样,不过今天我们讲解的不是下面这个图的车体角度计算,而是上面问题中这种驱动形式的车体角度计算。

在讲解这部分内容之前先让我们了解一个重要的数学学科分支,因为他在AGV路径规划中起到了举足轻重的作用---图论。
AGV路径规划中的图论
图论是数学学科的一个重要学科,当然,图也是最复杂的数据类型,在AGV路径规划中图论作为不可或缺的知识补充起到了至关重要的作用。
其实在之前的最短路径规划专题中我们已经用到图论的知识,只是我们并没有提出图论的概念,因为在那个专题中我们举得例子是一个远离图论概念的更容易理解的例子,而图论对最短路径的描述将变得冗长、复杂和难以理解。比如,基于图论对A算法的描述:
我个人认为A*算法是目前在二维(平面)地图中用到的最优秀的最短路径算法,它利用了启发搜索函数,该函数在搜索下一个节点时会对之前的那些节点的权重做一个评估,并以此作为节点处于最优路径中的判断依据,进而优先搜索权重较小的节点的下一节点直到找到目标节点,这种方式可以大大减少遍历的节点的数量,提高cpu的效率和算法执行时间,但就跟我们前面提到的一样,它仅仅适用于二维(平面)地图,对具有凹凸性的地图而言,该算法的结果并不一定是最优解。
除了在最短路径中会用到图论内容,在之前我们稍微提到的关于生成AGV占用矩形时采用的Tree也属于图论中的内容。
AGV部分属性的几何描述
OK我们言归正传,在讲解上面的问题之前,我们应该引起另外一个问题,路线上的点对应AGV上的哪个具体位置呢?用一句话概括---agv上导航点的位置对应路径线段上的节点,即agv上的导航点的运动轨迹和路径规划中的路径重合,这和AGV的几何表述有关。
AGV车体的几何描述。
那新的问题又来了---agv上的哪个位置是导航点呢?这个导航点会变吗?
以上两个答案的回答:导航点可能位于AGV上的任何位置,所以导航点位置不确定,且会发生变化。
通常AGV前进时,使用前驱动轮所在的位置作为前导航点,如果AGV后退时且是双驱动双转向的AGV,使用后舵轮所在的位置作为后退导航点(其实在agv后退时,后舵轮就相当于前舵轮了)。如果是单舵轮驱动AGV(类如叉车agv),后导航点通常位于支撑腿上的支持轮距离叉尖方向300的位置。
上面我们可以看出,导航点会根据AGV行驶方向的变化而变化,即AGV从前进改为后退时,导航点也从前导航点改为后导航点。下面是一个叉车式AGV的几何描述概览:

属性栏中的内容将在我们程序执行时调用这些参数。值得注意的一个参数是轮距L,在车体角度计算时会用到,这里的轮距代表支撑轮和驱动轮之间的距离,上面的虚拟原点坐标就是支撑轮子所在的位置。还有一个参数---旋转点,旋转点的用处我们后面会讲,这里只是提一下。
曲线上车体角度的计算
OK,我们现在可是求车体的角度。
首先我们先画一个草图:
橙色线路是AGV前舵轮将要行驶过的路径,沿着红色箭头行驶,其他线全部都是计算用的辅助线。

之后我们将局部放大,并做一些辅助线:

我们对以上辅助线做详细介绍:
E、S两点为弧线上任意两点,代表agv前舵轮沿ES弧线从E点行驶到S点并走过蓝色的弧长d。
灰色箭头为标准坐标系X轴,角度为0°。
γ角是AGV驱动ES弧线之前舵轮在E点的车体位置,这意味着O点为旋转点,旋转点---当agv沿曲线行驶一个很小很小。。。的弧线时,AGV本体上保持不变的一个点(即旋转点),在该例中旋转点为支撑轮的位置。
θ角是agv从E点沿蓝弧线行驶到S点车体扫过的角度—扫角。
TS是S点在弧线上的切线,这意味着∠HST=90°。
当AGV前舵轮行驶到S点时,车体的角度=θ+γ。
假如,我们已知γ(实际现在我们并不知道,没关系,等我们求出θ之后再去求γ)。
θ=arctan(US/OU)=arctan((TS*sinα)/(OE+EU))。
OK,为什么之前我们莫名其妙的提到了图论?就在这儿等着呢,图论是数学的一个分支,或者说是离散数学的一个分支,离散数学最大的一个功用就是极值的讨论。所以现在我们要用到极值思想来把上面的公式转变为我们已知的一些参数。

