开启生长之旅!这是我参加「日新方案 12 月更文挑战」的第26天,点击检查活动详情
前面介绍了直线途径的构建,本文将重点解说转弯途径的完成思路。
转弯途径构建
前面介绍了转弯途径一共有三种类型:梨形弯、圆形弯、弓形弯。也解说了各自的适用条件规模。
在实践工程运用中,用梨形弯的状况不是特别多,应用效果也不是特别好。只有在两条直线途径的转弯时,不得不必梨形弯的时分才会用它。梨形弯走的途径相对较杂乱,不利于拖拉机的运动操控。他一般用于相邻行的间隔小于2倍转弯半径。
运用较多的则是圆形弯和弓形弯,这两者实践上很类似。这两种转弯办法较简略,操控相对较容易。
转弯途径策略
在文献《无人驾驶拖拉机途径规划办法研究_程啸宇》中,作者分析了不同转向的转弯办法,区别办法主要是依据直线途径与地块鸿沟的角度值,大于90度和小于90度的状况。分析的过程相当杂乱,个人理解,能够有相对较简略的办法来完成。
我的理解事,不需要考虑角度问题。直接将转弯途径沿着直线途径向内缩N米,然后再做转弯途径。在这里需要额外的过程是,需要判别转弯途径是否超越地块鸿沟,假如超出地块鸿沟坐标,则仍需要沿着直线向内缩进。
直线途径点的内缩办法
沿着线段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)