#python-2.7 #camera #usb #ros #basler
#python-2.7 #камера #usb #розенкранц #basler
Вопрос:
У меня есть исследовательский проект, в котором используются 2 камеры Basler (обе a2A1920-16ucPRO) для создания карты несоответствий. Я извлекаю изображения через ROS. Для этого я подписался на 2 Темы, где я регулярно получаю изображения с частотой 2 герца. Проблема в том, что эти 2 изображения имеют разницу во времени в 5-10 миллисекунд, но мне нужно получить синхронно 2 изображения. Камеры подключены к моему компьютеру через USB. Есть ли способ установить что-то в ROS, чтобы я получал 2 изображения одновременно? Или есть другое решение? Вот мой код:
import rospy from sensor_msgs.msg import Image from cv_bridge import CvBridge, CvBridgeError import cv2 import time import message_filters Instantiate CvBridge bridge = CvBridge() def callback1(b1, b2): print("Aufruf beide Kameras!") try: cv2_img1 = bridge.imgmsg_to_cv2(b1, "bgr8") cv2_img2 = bridge.imgmsg_to_cv2(b2, "bgr8") except CvBridgeError, e: print(e) else: img_gray_left=cv2.cvtColor(cv2_img1, cv2.COLOR_BGR2GRAY) img_gray_right=cv2.cvtColor(cv2_img2, cv2.COLOR_BGR2GRAY) dimension=(1024,440) resized1=cv2.resize(img_gray_left, dimension, interpolation=cv2.INTER_AREA) resized2=cv2.resize(img_gray_right, dimension, interpolation=cv2.INTER_AREA) cv2.imwrite('multilayer-stixel-world/build/myimages_ros/camera_image_left.pgm', resized1) cv2.imwrite('multilayer-stixel-world/build/myimages_ros/camera_image_right.pgm', resized2) def main(): rospy.init_node('image_listener', anonymous=True) image_topic1 = message_filters.Subscriber('/ace_RGB_Left/pylon_camera_node/image_raw', Image) image_topic2 = message_filters.Subscriber('/ace_RGB_Right/pylon_camera_node/image_raw',Image) ts = message_filters.ApproximateTimeSynchronizer([image_topic1, image_topic2],2, 0.005) ts.registerCallback(callback1) rospy.spin() if _name_ == '_main_': main()
Функция сообщения «TimeSynchronizer» не работает, потому что метки времени не подходят идеально. Поэтому я использую функцию «Approximatimesynchronizer» с допуском 5 миллисекунд. Но этого недостаточно.
Комментарии:
1. Поскольку это Python, вы не сможете получить оба изображения одновременно; на самом деле это было бы верно для любого языка. Почему вам нужно, чтобы дельта была меньше, чем
2. Я выбрал дельту меньше 5, потому что хотел посмотреть, сколько сообщений пройдет. Я выяснил, что на каждые два сообщения приходится примерно одно сообщение. Таким образом, с помощью Python невозможно синхронизировать эти 2 сообщения?
3. Я думаю, что все еще остается вопрос, почему вы хотите, чтобы они были идеально синхронизированы. Метки времени msg будут созданы, когда фактическое изображение попадет в ROS. Также невозможно полностью гарантировать, что метки времени на 100% синхронизированы ни в Python, ни в c . Тем не менее, в зависимости от вашего приложения может быть другой приемлемый подход.
4. Мне нужны синхронные изображения, потому что я создаю изображение несоответствия из этих двух в машине во время вождения. И если вы едете, например, со скоростью 100 км/ч, разница составляет около 13 сантиметров, и это искажает изображение несоответствия.