목차
I. 소개
최근 테스트를 바탕으로 대략적인 제어 알고리즘을 얻었습니다. 제어 효과는 단선 및 급회전에 적합합니다. 약간 개선 될 수 있으며 교차로와 같은 복잡한 궤적의 단안 시력 추적 작업에 적합하다고 생각합니다. 이 기사는 파이썬 로봇 프로그래밍의 미완성 부분 인 차동 로봇 자동차 제어, 제어 모델, 궤적 추적, 궤적 계획, 자동 주차(가운데)를 보완
위의 그림과 같이 알고리즘은 360m/h의 속도로 대략 자동으로 90도 이상의 급회전을 할 수 있습니다. 선이 그다지 적절하지는 않지만 이 방법이 실제로 더 실현 가능하다고 생각합니다. 방법은 아래에 자세히 설명되어 있습니다.
2. 궤적과 노면 중심의 편차 오차를 기반으로 한 예측 자동 차동차 추종 제어 전략
이 방식에서도 차동 트롤리의 제어는 위에서 언급한 예측 제어 방식을 그대로 사용하고 있으며 프로그램은 단계 크기를 dt로 하여 수신된 영상에 따라 트롤리의 정방향과 역방향의 궤적을 연속적으로 예측하는 과정이다. , 경계조건에서 오차가 영상 획득 궤적에 가장 근접한 자동차의 좌우 바퀴에 해당하는 속도가 현재 단계의 최적 자동차 속도 설정값이다. 특정 알고리즘 흐름 의사 코드는 다음과 같습니다.
- 동안 참:
-
记录预测间隔累计时间con_Hz=con_Hz+1
-
读取摄像头图像,并进行处理(具体方法见第三节)获得路径的重心图像坐标cu、cv
-
if 当时间间隔到达预测控制的步长时con_Hz=300毫秒:
-
con_Hz=0
-
进入预测控制模块best_move(处理过的轨迹,当前的速度状态clv,重心坐标):
-
定义最佳速度设定值bestv=clv
-
定义预测的微增速度dv=0.001
-
定义预测的边界范围vmax=10
-
for i in vmax:#速度增加的方向预测vmax个dv
-
左轮的速度sl_n=当前速度+i*dv
-
根据恒定速度计算右轮速度
-
计算当前速度下未来2.5秒后(可以调整)的轨迹线存在pv、pu的list中
-
将当前预测轨迹按照摄像头内参转化到图像坐标
-
计算预测轨迹的重心图像坐标(cpu、cpv)
-
计算重心距离dei=sqrt((cpu-cu)**2+(cpv-cv)**2)
-
if dei<de:
-
更新误差de=dei
-
更新bestv=sl_n
-
for i in vmax:#速度减小的方向预测vmax个dv
-
左轮的速度sl_n=当前速度-i*dv
-
根据恒定速度计算右轮速度
-
计算当前速度下未来2.5秒后(可以调整)的轨迹线存在pv、pu的list中
-
将当前预测轨迹按照摄像头内参转化到图像坐标
-
计算预测轨迹的重心图像坐标(cpu、cpv)
-
计算重心距离dei=sqrt((cpu-cu)**2+(cpv-cv)**2)
-
if dei<de:
-
更新误差de=dei
-
更新bestv=sl_n
-
reurn bestv#返回最优控制速度设定值
-
将当前最优控制速度值下发至小车
-
进入下一个循环。
위는 주요 알고리즘 설명입니다.
이 알고리즘에 따르면 시뮬레이션 환경에서 장시간 실행한 후에도 트랙에서 큰 편차가 없습니다. 위 그림과 같이 중앙의 검은색 그림에서 노란색 선은 가공된 경로, 파란색 점은 경로의 무게 중심 위치, 빨간색 선은 해당 경로에서의 예상 미래 주행 궤적입니다. 현재 경계 아래의 최고 속도 설정 값 궤적은 파란색 무게 중심에 가장 가깝고 자동차는 항상 이 전략 아래에서 달립니다.
3. 궤적 이미지 처리의 주요 포인트
획득한 궤적 이미지 처리를 위한 주요 프로세스는 다음과 같습니다.
- 카메라의 현재 이미지 이미지 가져오기
- 색상 선택 알고리즘에 따라 노란색 트랙 부분 정보 이미지 bimg가 남습니다.
- 트랙의 픽셀을 1로 두고 bimg 이미지를 이진화하고 이미지 이진수를 얻습니다.
- 바이너리의 작은 자동차 부분(이미지의 작은 아래쪽 절반)의 픽셀을 제거하여 새로운 바이너리를 얻습니다.
- 예측 제어 모듈에 입력할 현재 궤적의 무게 중심점 cu 및 cv를 계산합니다
이미지의 무게 중심 계산 코드 예제는 다음과 같습니다.
import cv2
import numpy as np
import matplotlib.pyplot as plt
# Load the binary image
img = cv2.imread('binary_image.png', 0)
# Calculate the moments of the image
M = cv2.moments(img)
# Calculate the centroid
cx = int(M['m10'] / M['m00'])
cy = int(M['m01'] / M['m00'])
# Print the centroid coordinates
print(f'Centroid: ({
cx}, {
cy})')
# Draw a circle at the centroid
img_with_centroid = cv2.circle(img.copy(), (cx, cy), 5, (255, 0, 0), -1)
# Display the image with the centroid
plt.imshow(img_with_centroid, cmap='gray')
plt.show()
4. 이 문서에서 핵심 제어 전략 Python 코드의 일부:
def best_move(sl,Pathimg,vc=0.1,dt=0.5,barycenter=(256,256)):
#控制增量
dvl=0.001
#要预测的控制量
sl_n=sl
#最优的控制量
best_sl=sl
mod="G"
#方差
de=500
dei=e+100
Gbest_sl=sl
for i in range(10):#逐次减小控制量
sl_n=sl_n-i*dvl
#待入预测函数获取预测序列
xx,yy,tt=predicate(0,0,math.pi/2,sl_n,step=5,dt=dt,vc=vc,dspeed=True)
#中心轨迹转化为车头轨迹
pv=[]
pu=[]
#将小车坐标转化到图像坐标
for i in range(len(xx)):
puv1=realxy2uv(xx[i],yy[i],Pathimg,xymax=0.5,zero="self_define",dzero=(256,286))
pu.append(puv1[0])
pv.append(puv1[1])
cpu=np.average(pu)
cpv=np.average(pv)
dei= np.sqrt((barycenter[0]-cpu)**2+(barycenter[1]-cpv)**2)
if dei<de:
de=dei
Gbest_sl=sl_n
sl_n=sl
for i in range(10):#逐次增大控制量
sl_n=sl_n+i*dvl
xx,yy,tt=predicate(0,0,math.pi/2,sl_n,step=5,dt=dt,vc=vc,dspeed=True)
#将小车坐标转化到图像坐标
pv=[]
pu=[]
for i in range(len(xx)):
puv1=realxy2uv(xx[i],yy[i],Pathimg,xymax=0.5,zero="self_define",dzero=(256,286))
pu.append(puv1[0])
pv.append(puv1[1])
cpu=np.average(pu)
cpv=np.average(pv)
dei= np.sqrt((barycenter[0]-cpu)**2+(barycenter[1]-cpv)**2)
if dei<de:
de=dei
Gbest_sl=sl_n
print("Gbest_sll:",best_sl)
#返回最优控制量
if mod=="G":
return Gbest_sl
else:
return best_sl,np
V. 결론
후속 조치에서는 복잡한 궤적의 처리를 개선해야 합니다. 이 기사의 시뮬레이션 환경과 소스 코드가 필요한 경우 공식 계정에 가입하거나 비공개 메시지를 남길 수 있습니다.
다른 경로를 변경하면 이 방법의 견고성이 여전히 양호함을 알 수 있습니다.노면이 손상되는 한 균일한 경향이 있는 한 자동 운전도 잘 수행됩니다.