Найдите фактическое расстояние между двумя маркерами aruco в метрах - PullRequest
1 голос
/ 17 июня 2020

Контекст: у меня есть большая арена 2 м x 2 м, на которой напечатаны 4 маркера aruco, их положение из угла арены известно и фиксировано. Теперь у меня есть еще один маркер aruco на роботе, движущемся по этой арене. PS известная позиция находится в 2d.

Проблема: я хочу найти положение робота на арене (относительно известного угла арены). Я использую python для того же, сначала обнаруживая маркеры с изображения с помощью DetectMarker (), а затем оценивают положение маркеров. Значения tve c, возвращаемые функцией оценки позы, дают положение маркера относительно системы координат камеры, что отлично работает, если камера перпендикулярна арене, но когда камера удерживается под углом, возникает большая ошибка в позиции.

Правильно ли мой подход? Считайте, что камера откалибрована хорошо, что является источником ошибки?

rvec, tvec, _ = aruco.estimatePoseSingleMarkers(corners, actual_size, mtx, dist)
cv2.imshow('img',img) 
index = np.where(ids==0) # getting the known aruco marker


rotation_matrix[:3, :3], _ = cv2.Rodrigues(rvec[index]) # Computing Rotational Matrix 
for i in range(3):
   rotation_matrix[i][3]= tvec[index][0][i]  # Adding Translation Values to it
   inverse_rot = np.linalg.inv(rotation_matrix)  # Inversing the matrix
   for i,j,k in zip(ids,tvec,rvec):
        print(i,'POS:',j)   # prints id and tvec values
        pt[:3] = j.reshape(3,1)  
        rot_point = np.dot(inverse_rot,pt)  # Homogeneous matrix . tvec values
        print(rot_point[:3])  # The new position
        print(np.sqrt(rot_point[0]**2 + rot_point[1]**2 ))  # Distance

rotational_matrix - это матрица 4x4, содержащая вращение, перемещение, которая используется для переноса системы координат ) в один из маркеров (известный маркер на арене , поэтому этот маркер становится исходной точкой) и преобразование других точек (tvecs в системе камеры) в систему маркеров.

Однородное преобразование координат

Arena

...