파이썬 로봇 프로그래밍 - 차동 AGV 머신, 비전 기반 추적 및 예측 제어, 자동 운전 (2부)

I. 소개

최근 테스트를 바탕으로 대략적인 제어 알고리즘을 얻었습니다. 제어 효과는 단선 및 급회전에 적합합니다. 약간 개선 될 수 있으며 교차로와 같은 복잡한 궤적의 단안 시력 추적 작업에 적합하다고 생각합니다. 이 기사는 파이썬 로봇 프로그래밍의 미완성 부분 인 차동 로봇 자동차 제어, 제어 모델, 궤적 추적, 궤적 계획, 자동 주차(가운데)를 보완
여기에 이미지 설명 삽입
위의 그림과 같이 알고리즘은 360m/h의 속도로 대략 자동으로 90도 이상의 급회전을 할 수 있습니다. 선이 그다지 적절하지는 않지만 이 방법이 실제로 더 실현 가능하다고 생각합니다. 방법은 아래에 자세히 설명되어 있습니다.

2. 궤적과 노면 중심의 편차 오차를 기반으로 한 예측 자동 차동차 추종 제어 전략

이 방식에서도 차동 트롤리의 제어는 위에서 언급한 예측 제어 방식을 그대로 사용하고 있으며 프로그램은 단계 크기를 dt로 하여 수신된 영상에 따라 트롤리의 정방향과 역방향의 궤적을 연속적으로 예측하는 과정이다. , 경계조건에서 오차가 영상 획득 궤적에 가장 근접한 자동차의 좌우 바퀴에 해당하는 속도가 현재 단계의 최적 자동차 속도 설정값이다. 특정 알고리즘 흐름 의사 코드는 다음과 같습니다.

  1. 동안 참:
  2. 	记录预测间隔累计时间con_Hz=con_Hz+1
    
  3. 	读取摄像头图像,并进行处理(具体方法见第三节)获得路径的重心图像坐标cu、cv
    
  4. 	 if 当时间间隔到达预测控制的步长时con_Hz=300毫秒:
    
  5. 			con_Hz=0
    
  6. 			进入预测控制模块best_move(处理过的轨迹,当前的速度状态clv,重心坐标):			
    
  7. 					定义最佳速度设定值bestv=clv
    
  8. 					定义预测的微增速度dv=0.001
    
  9. 					定义预测的边界范围vmax=10
    
  10.    				for i in vmax:#速度增加的方向预测vmax个dv
    
  11.    						左轮的速度sl_n=当前速度+i*dv
    
  12.    						根据恒定速度计算右轮速度
    
  13.    						计算当前速度下未来2.5秒后(可以调整)的轨迹线存在pv、pu的list中
    
  14.    						将当前预测轨迹按照摄像头内参转化到图像坐标
    
  15.    						计算预测轨迹的重心图像坐标(cpu、cpv)
    
  16.    						计算重心距离dei=sqrt((cpu-cu)**2+(cpv-cv)**2)
    
  17.    						if dei<de:
    
  18.    								更新误差de=dei
    
  19.    								更新bestv=sl_n
    
  20.    				for i in vmax:#速度减小的方向预测vmax个dv
    
  21.    						左轮的速度sl_n=当前速度-i*dv
    
  22.    						根据恒定速度计算右轮速度
    
  23.    						计算当前速度下未来2.5秒后(可以调整)的轨迹线存在pv、pu的list中
    
  24.    						将当前预测轨迹按照摄像头内参转化到图像坐标
    
  25.    						计算预测轨迹的重心图像坐标(cpu、cpv)
    
  26.    						计算重心距离dei=sqrt((cpu-cu)**2+(cpv-cv)**2)
    
  27.    						if dei<de:
    
  28.    								更新误差de=dei
    
  29.    								更新bestv=sl_n
    
  30.    			reurn  bestv#返回最优控制速度设定值
    
  31.    	将当前最优控制速度值下发至小车
    
  32.    	进入下一个循环。
    

위는 주요 알고리즘 설명입니다.
여기에 이미지 설명 삽입
이 알고리즘에 따르면 시뮬레이션 환경에서 장시간 실행한 후에도 트랙에서 큰 편차가 없습니다. 위 그림과 같이 중앙의 검은색 그림에서 노란색 선은 가공된 경로, 파란색 점은 경로의 무게 중심 위치, 빨간색 선은 해당 경로에서의 예상 미래 주행 궤적입니다. 현재 경계 아래의 최고 속도 설정 값 궤적은 파란색 무게 중심에 가장 가깝고 자동차는 항상 이 전략 아래에서 달립니다.

3. 궤적 이미지 처리의 주요 포인트

획득한 궤적 이미지 처리를 위한 주요 프로세스는 다음과 같습니다.

  1. 카메라의 현재 이미지 이미지 가져오기
  2. 색상 선택 알고리즘에 따라 노란색 트랙 부분 정보 이미지 bimg가 남습니다.
  3. 트랙의 픽셀을 1로 두고 bimg 이미지를 이진화하고 이미지 이진수를 얻습니다.
  4. 바이너리의 작은 자동차 부분(이미지의 작은 아래쪽 절반)의 픽셀을 제거하여 새로운 바이너리를 얻습니다.
  5. 예측 제어 모듈에 입력할 현재 궤적의 무게 중심점 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. 결론

후속 조치에서는 복잡한 궤적의 처리를 개선해야 합니다. 이 기사의 시뮬레이션 환경과 소스 코드가 필요한 경우 공식 계정에 가입하거나 비공개 메시지를 남길 수 있습니다.
여기에 이미지 설명 삽입
다른 경로를 변경하면 이 방법의 견고성이 여전히 양호함을 알 수 있습니다.노면이 손상되는 한 균일한 경향이 있는 한 자동 운전도 잘 수행됩니다.
여기에 이미지 설명 삽입

추천

출처blog.csdn.net/kanbide/article/details/131329963