Phương pháp lập trình robot Python: Hành vi tránh chướng ngại vật
Phương pháp lập trình robot Python: Hành vi tránh chướng ngại vật
Đi về phía mục tiêu khi có chướng ngại vật ở hướng đó là một trường hợp điển hình. Thay vì lao đầu vào những thứ theo cách của chúng ta, chúng ta hãy cố gắng lập trình một luật điều khiển để khiến robot tránh chúng.
Để đơn giản hóa kịch bản, bây giờ chúng ta hãy quên hoàn toàn điểm mục tiêu và chỉ thực hiện mục tiêu sau: Khi không có chướng ngại vật phía trước, hãy tiến về phía trước. Khi gặp chướng ngại vật, hãy quay lưng lại với nó cho đến khi nó không còn ở trước mặt chúng ta nữa.
Theo đó, khi không có chướng ngại vật phía trước, chúng ta muốn vectơ tham chiếu của chúng ta chỉ đơn giản hướng về phía trước. Khi đó ω sẽ bằng 0 và v sẽ là tốc độ cực đại. Tuy nhiên, ngay sau khi chúng tôi phát hiện chướng ngại vật bằng cảm biến khoảng cách của mình, chúng tôi muốn vectơ tham chiếu chỉ theo bất kỳ hướng nào cách xa chướng ngại vật. Điều này sẽ làm cho ω bắn lên để quay chúng ta khỏi chướng ngại vật và làm cho v giảm xuống để đảm bảo rằng chúng ta không vô tình đụng phải chướng ngại vật trong quá trình này.
Một cách đơn giản để tạo vectơ tham chiếu mong muốn của chúng tôi là chuyển chín giá trị đọc gần nhau thành vectơ và lấy tổng có trọng số. Khi không có chướng ngại vật nào được phát hiện, các vectơ sẽ tổng đối xứng, dẫn đến một vectơ tham chiếu hướng thẳng về phía trước như mong muốn. Nhưng nếu một cảm biến trên, chẳng hạn, bên phải chọn một chướng ngại vật, nó sẽ đóng góp một vectơ nhỏ hơn vào tổng và kết quả sẽ là một vectơ tham chiếu bị dịch chuyển về phía bên trái.
Đối với rô bốt thông thường có vị trí đặt cảm biến khác, ý tưởng tương tự có thể được áp dụng nhưng có thể yêu cầu thay đổi về trọng lượng và / hoặc sự cẩn thận bổ sung khi các cảm biến đối xứng ở phía trước và phía sau của rô bốt, vì tổng trọng số có thể bằng không .
Đây là mã thực hiện điều này trong
avoid_obstacles_controller.py
:# sensor gains (weights)
self.sensor_gains = [ 1.0+( (0.4*abs(p.theta)) / pi )
for p in supervisor.proximity_sensor_placements() ]
# ...
# return an obstacle avoidance vector in the robot's reference frame
# also returns vectors to detected obstacles in the robot's reference frame
def calculate_ao_heading_vector( self ):
# initialize vector
obstacle_vectors = [ [ 0.0, 0.0 ] ] * len( self.proximity_sensor_placements )
ao_heading_vector = [ 0.0, 0.0 ]
# get the distances indicated by the robot's sensor readings
sensor_distances = self.supervisor.proximity_sensor_distances()
# calculate the position of detected obstacles and find an avoidance vector
robot_pos, robot_theta = self.supervisor.estimated_pose().vector_unpack()
for i in range( len( sensor_distances ) ):
# calculate the position of the obstacle
sensor_pos, sensor_theta = self.proximity_sensor_placements[i].vector_unpack()
vector = [ sensor_distances[i], 0.0 ]
vector = linalg.rotate_and_translate_vector( vector, sensor_theta, sensor_pos )
obstacle_vectors[i] = vector # store the obstacle vectors in the robot's reference frame
# accumulate the heading vector within the robot's reference frame
ao_heading_vector = linalg.add( ao_heading_vector,
linalg.scale( vector, self.sensor_gains[i] ) )
return ao_heading_vector, obstacle_vectors
Sử dụng kết quả
ao_heading_vector
làm tài liệu tham khảo của chúng tôi để robot thử đối sánh, đây là kết quả của việc chạy phần mềm robot trong mô phỏng chỉ sử dụng bộ điều khiển tránh chướng ngại vật, hoàn toàn bỏ qua điểm mục tiêu. Robot bay xung quanh không mục đích, nhưng nó không bao giờ va chạm với chướng ngại vật và thậm chí còn xoay sở để điều hướng một số không gian rất chật hẹp:
Không có nhận xét nào