(一) 與usb相機的交互
? ? ? ? ?第一個鏈接是 先從usb中拿到圖像,然后再發布和訂閱
? ? ? ? 【C++】ROS:cv_bridge包使用與圖像轉換示例_cvbridge-CSDN博客
? ? ? ? 第二個鏈接是使用方法
? ? ? ? ROS學習筆記--cv_bridge_cvbridge-CSDN博客
? ? ? ? 第三個鏈接是,包含了話題自定義
? ? ? ? ROS教程(五):OpenCV調用USB攝像頭并發布topic(詳細圖文)-騰訊云開發者社區-騰訊云 (tencent.com)
? ? ? ? 主要包含了兩個內容:
? ? ? ? ? ? ? ?1)將ros圖像轉換成opencv圖像
? ? ? ? ? ? ? ?2)將opencv圖像轉換成ros圖像
(二) 與工業相機的交互
? ? ? ? ? ?ros系統與海康相機的交互,參照網址:https://gitcode.com/luckyluckydadada/HIKROBOT-MVS-CAMERA-ROS/overview?utm_source=csdn_github_accelerator&isLogin=1??????
程序中,相機的參數設置為硬觸發,幀率為10幀。
? ? ? ? node.param("FrameRate", FrameRate, 10);? // 幀率設置為10幀
? ? ? ? node.param("ExposureTime", ExposureTime, 50000); // 曝光時間設置為50ms
? ? ? ? node.param("TriggerMode", TriggerMode, 1); ?// 控制相機是否開啟硬觸發
? ? ? ? node.param("TriggerSource", TriggerSource, 2); ?// 觸發源 也就是選擇線 line0, line2等線
? ? ? ? node.param("LineSelector", LineSelector, 2); ?// 這個表示IO的線選擇的是哪一個
在圖像的獲取過程中,并沒有用到回調函數,而是直接去獲取幀:
? ? ? ? ? ? nRet = MV_CC_GetOneFrameTimeout(p_handle, m_pBufForDriver, MAX_IMAGE_DATA_SIZE, &stImageInfo, 15);? //? 不知道會不會獲得重復幀
在拿到幀之后,使用了互斥量來防止 圖像在被read的時候修改。
在ros發布過程中,就是先readimage,然后構建cv_bridge::CvImagePtr 。 并轉化成?sensor_msgs::Image 和?sensor_msgs::CameraInfo 兩個消息, 然后直接發布消息。
整個程序中,使用硬觸發,應該是和其他硬件相連,其他硬件可以提供一個電平觸發信號。感覺缺點是 用一個回調函數來接收圖像會比較好。在獲得圖像后,直接就pub圖像。
整個過程仍然是,從相機中使用函數或者回調函數抓取圖像,然后把圖像pub出去。兩者可以分開來寫程序。
(三)與激光雷達的交互
(四)與IMU的交互
(五)與RTK/GNSS硬件的交互
ROS實現串口解析GPS協議,并發布到話題_gpfpd-CSDN博客
理解了 ros和硬件交互的原理,第一步就是通過硬件的SDK或者串口程序,獲取到硬件的數據,然后使用ros進行發布。在硬件層面上去保證硬件是同步的。
(六)與小車的交互
(七)與無人機的交互