Понимание и использование aruco.estimatePoseSingleMarkers Rvec и Tvec

#python #opencv #image-processing #computer-vision #px4

Вопрос:

У меня возникли некоторые проблемы с пониманием того, как использовать aruco.estimatePoseSingleMarkers. В настоящее время у меня есть изображение или тег aruco, смоделированный, и моя камера, установленная на дроне в sim-карте, которая летит к тегу. Метка идентифицирована, и я оцениваю положение маркеров. Я предполагал,что происходит то,что TVecs возвращал X, Y, Z маркера относительно моей камеры. Исходя из этого, я правильно преобразую координатные рамки и использую их для управления своим дроном. Однако я обнаружил, что дрон, использующий ошибку, перемещается сам так, чтобы тег aruco находился на 0,0 изображения.

Я путаю функциональность функции estimatePoseSingleMarker? Что мне нужно было бы сделать, чтобы, возможно, это сработало?

Вот фрагмент кода, который я использую. Есть немного кода, чтобы взять координаты камеры и преобразовать их в смещение мировых координат от дрона на основе YPR дрона.

 (corners, ids, rejected) = cv2.aruco.detectMarkers(img, self.alg.ARUCO_DICT, parameters=self.alg.ARUCO_PARAMS)   if ids is not None:  for id in ids:  #Set the length of the ID detected.  if(id[0] == 20):  aruco_len = 0.25  #Get the rotation vec and translation vec of the camera to the aruco I believe. can use this to control the quad.  rvecs, tvecs = cv2.aruco.estimatePoseSingleMarkers(corners[0], aruco_len, self.alg.camera_matrix, self.alg.camera_dist)   print tvecs   cam_pts = np.array([[-tvecs[0][0][1]],   [tvecs[0][0][0]],  [tvecs[0][0][2]],  [1]])   print cam_pts   error = self.cam2Local(cam_pts)  def cam2Local(self, cam_pts):  #Here in the function build the Rot matrix of the quadcopter, take XYZ points from camera, [y x z 1] format. Rot_Mat * Cam_Pts will give Aruco wrld pts     roll = self.roll  pitch = self.pitch  yaw = self.yaw    #print str("Pitch: "   str(pitch)   " Roll: "   str(roll)   " Yaw: "   str(yaw))  rot_mat = np.array([[math.cos(roll)*math.cos(pitch), (math.cos(roll)*math.sin(pitch)*math.sin(yaw))-(math.sin(roll)*math.cos(yaw)), math.cos(roll)*math.sin(pitch)*math.cos(yaw) math.sin(roll)*math.sin(yaw), 0],  [math.sin(roll)*math.cos(pitch), (math.sin(roll)*math.sin(pitch)*math.sin(yaw)) (math.cos(pitch)*math.cos(yaw)), math.sin(roll)*math.sin(pitch)*math.cos(yaw)-math.cos(roll)*math.sin(yaw), 0],  [ -math.sin(pitch), math.cos(pitch)*math.sin(yaw), math.cos(pitch)*math.cos(yaw), 0],  [ 0, 0, 0, 1]])  Local_pts = np.matmul(rot_mat, cam_pts)   #print rot_mat   return Local_pts   

Комментарии:

1. вы tvec все правильно поняли… Я надеюсь. система координат правая, и x камеры правая, y вниз, z далеко. на маркере, x справа, у вдалеке, z вверху, центр начала координат. — Я не могу прокомментировать этот код, кроме как сказать, что нахожу его ужасным. особенно те матрицы, содержащие выражения, которые невозможно проверить. разбери его на части. напишите служебные функции, которые выполняют одну задачу, например, вращаются вокруг одной оси. составьте преобразования (умножьте матрицы). на самом деле, просто используйте cv.Rodrigues и некоторые numpy для преобразования rvec и tvec в матрицу поз 4×4.

2. Так что я ничего не путаю. Если мой маркер aruco установлен в середине кадра моей камеры, но на расстоянии 2 м. tvec должен выводить [0, 0, 2], правильно? Почему я в замешательстве, так это мои выходные данные tvec, которые я ожидал бы показать примерно [0,0,2] для моих tvec, поскольку камера находится на 2 м прямо под маркерами aruco. Но я получаю что-то вроде [0,5, 1,2]. Меня интересует не столько ориентация, сколько просто расположение XYZ относительно центра камеры. Что касается мата Rot, у меня есть сценарии в matlab, которые я использовал для проверки, и использовал те же входные данные, чтобы проверить это здесь, но да, я должен немного разделить его, спасибо.

3. да, [0,0,2], предполагая, что вы даете aruco размеры ваших маркеров в метрах (если в миллиметрах, то 2000). если вы получаете смещение, оно, вероятно, не центрировано на изображении или у вас плохая калибровка камеры. переопределите cx, cy с помощью (ширина-1)/2 и (высота-1)/2

4. Спасибо, сэр, я решил свою проблему. Оказывается, в настройках моей камеры для sim-карты ширина и высота были 320×240. Показатели Cx, Cy составили 320,5 и 240,5 соответственно. После замены Cx и Cy на W-1/2 и H-1/2 я знаю, что получаю ожидаемые значения. Я ценю, что вы нашли время, чтобы попытаться помочь и указать мне правильное направление, так как я и не думал туда заглядывать. Большое спасибо @ChristophRackwitz

5. пожалуйста, запомните этот опыт на следующий раз. не было никаких признаков того, что матрица камеры будет проблемой. Мне пришлось сделать дикое предположение, потому что не было никакой информации, в которой можно было бы обнаружить проблему. вы не должны держать все в секрете. изложите все конкретно, без подсказок. никакой прозы, проза не поддается отладке. у большинства людей есть какое-то принуждение оставаться расплывчатыми и абстрактными. это плохо. Я несчастен, потому что это постоянная проблема почти со всеми, и я продолжаю доказывать свою правоту.