开启生长之旅!这是我参加「日新方案 12 月更文挑战」的第26天,点击检查活动详情

前面介绍了直线途径的构建,本文将重点解说转弯途径的完成思路。

转弯途径构建

前面介绍了转弯途径一共有三种类型:梨形弯、圆形弯、弓形弯。也解说了各自的适用条件规模。

在实践工程运用中,用梨形弯的状况不是特别多,应用效果也不是特别好。只有在两条直线途径的转弯时,不得不必梨形弯的时分才会用它。梨形弯走的途径相对较杂乱,不利于拖拉机的运动操控。他一般用于相邻行的间隔小于2倍转弯半径。

运用较多的则是圆形弯和弓形弯,这两者实践上很类似。这两种转弯办法较简略,操控相对较容易。

转弯途径策略

在文献《无人驾驶拖拉机途径规划办法研究_程啸宇》中,作者分析了不同转向的转弯办法,区别办法主要是依据直线途径与地块鸿沟的角度值,大于90度和小于90度的状况。分析的过程相当杂乱,个人理解,能够有相对较简略的办法来完成。

拖拉机路径规划(4)

拖拉机路径规划(4)

我的理解事,不需要考虑角度问题。直接将转弯途径沿着直线途径向内缩N米,然后再做转弯途径。在这里需要额外的过程是,需要判别转弯途径是否超越地块鸿沟,假如超出地块鸿沟坐标,则仍需要沿着直线向内缩进。

直线途径点的内缩办法

拖拉机路径规划(4)

沿着线段BA将B点内缩至C点,内缩间隔假设为t\Delta t米。

dAB=(x1−x2)2+(y1−y2)2dAB = \sqrt{(x1-x2)^2+(y1-y2)^2}

依据类似三角形能够得到:

x2−x3x2−x1=tdAB\frac{x2-x3}{x2-x1} = \frac{\Delta t}{dAB}

可得 x3=x2+t(x1−x2)/dABx3 = x2+\Delta t(x1-x2)/dAB

y2−y3y2−y1=tdAB\frac{y2-y3}{y2-y1} = \frac{\Delta t}{dAB}

可得 y3=y2+t(y1−y2)/dABy3 = y2+\Delta t(y1-y2)/dAB

同理可得:若求沿着线段AB向外延伸 t\Delta t米,则公式中的 t\Delta t 变成 −t-\Delta t

判别点在多边形内

判别点是否在多边形内部的办法有许多,这里选用射线法,从点动身向右侧水平做出一条射线,假如跟多边形交点个数为奇数,则点在多边形内,否则在多边形外。

import matplotlib.pyplot as plt
def is_in_poly(p, poly):
    px, py = p
    is_in = False
    for i, corner in enumerate(poly):
        next_i = i + 1 if i + 1 < len(poly) else 0
        x1, y1 = corner
        x2, y2 = poly[next_i]
        if (x1 == px and y1 == py) or (x2 == px and y2 == py):  # if point is on vertex
            is_in = True
            break
        if min(y1, y2) < py <= max(y1, y2):     # find horizontal edges of polygon
            x = x1 + (py - y1) * (x2 - x1) / (y2 - y1)
            if x == px:     # if point is on edge
                is_in = True
                break
            elif x > px:  # if point is on left-side of line
                is_in = not is_in
    return is_in
def draw_poly(point,poly):
    x_list = []
    y_list = []
    for i in range(len(poly)):
        x_list.append(poly[i][0])
        y_list.append(poly[i][1])
    plt.scatter(point[0],point[1],color='r',s=100)
    plt.plot(x_list,y_list,color='b')
    plt.show()
if __name__ == '__main__':
    point = [100,100]
    poly = [[64,244],[298,203],[347,105],[242,30],[74,12],[9,110],[64,244]]
    print(is_in_poly(point, poly))
    draw_poly(point,poly)

拖拉机路径规划(4)