2016-07-20 39 views
2

我已經在ros論壇上發佈了這個問題,但爲了覆蓋更大的用戶,我想再次發佈。如何知道/設置圖像拍攝的頻率(抓取)?

的問題是,我發現了頻率,我從兩個連續的回調之間,並且使用rostopic赫茲,是完全不同的時間計算......

隨着rostopic hz /pg_15508342/image_raw我得到:

average rate: 99.681 
    min: 0.003s max: 0.017s std dev: 0.00093s window: 797 
average rate: 99.683 
    min: 0.003s max: 0.017s std dev: 0.00098s window: 896 
average rate: 99.682 
    min: 0.003s max: 0.017s std dev: 0.00100s window: 997 
average rate: 99.682 
    min: 0.003s max: 0.017s std dev: 0.00098s window: 1097 
average rate: 99.684 
    min: 0.002s max: 0.018s std dev: 0.00102s window: 1196 
average rate: 99.681 
    min: 0.002s max: 0.018s std dev: 0.00106s window: 1296 
average rate: 99.676 

然而,從這個很短的代碼,其計算在其中同一主題的回調被調用的頻率,

#include <ros/ros.h> 
#include <image_transport/image_transport.h> 
#include <cv_bridge/cv_bridge.h> 
#include <sensor_msgs/image_encodings.h> 
#include <opencv2/imgproc/imgproc.hpp> 
#include <opencv2/highgui/highgui.hpp> 

#include <time.h> 
#include <boost/timer.hpp> 
#include <boost/thread.hpp> 
#include <boost/thread/thread.hpp> 
#include <boost/version.hpp> 
#include "boost/bind.hpp" 
#include "boost/bind.hpp" 
#include <iostream> 

using namespace std; 

boost::posix_time::ptime time1; 
boost::posix_time::time_duration timeloop; 
double timeloop_sc; 

int image_itr(0); 

void imageCallback(const sensor_msgs::ImageConstPtr& msg) 
{ 
    //--- 
     if(image_itr == 0) 
     time1 = boost::posix_time::microsec_clock::local_time(); 

     timeloop = boost::posix_time::microsec_clock::local_time() - time1; 
    time1 = boost::posix_time::microsec_clock::local_time(); 
    timeloop_sc = 1e-3* (double)timeloop.total_milliseconds(); 
    cout << "itr " << image_itr++ << " fps: " << 1.0/timeloop_sc << endl; 

} 

int main(int argc, char **argv) 
{ 
    ros::init(argc, argv, "image_listener"); 
    ros::NodeHandle nh; 

    cv::namedWindow("view"); 
    cv::startWindowThread(); 
    image_transport::ImageTransport it(nh); 
    image_transport::Subscriber sub = it.subscribe("/pg_15508342/image_raw", 1, imageCallback); 
    ros::spin(); 
    cv::destroyWindow("view"); 
} 

我GE t這個不一致的結果

itr 2198 fps: 100 
itr 2199 fps: 111.111 
itr 2200 fps: 90.9091 
itr 2201 fps: 111.111 
itr 2202 fps: 111.111 
itr 2203 fps: 111.111 
itr 2204 fps: 100 
itr 2205 fps: 111.111 
itr 2206 fps: 100 
itr 2207 fps: 100 
itr 2208 fps: 90.9091 
itr 2209 fps: 125 
itr 2210 fps: 100. 

爲什麼這種差異的價值?另外,如果我從另一臺主機運行相同的代碼,但只添加cv::imshowfrom,我甚至會得到一個完全不同的值。爲了更清楚,假設我正在使用local機器,而我的ros節點是在onboard機器上實現和編譯的。是從local這樣做:

ssh [email protected] 
rosrun package node 

也許這是cv::imshowfrom消耗大量帶寬的....但代碼應該onboard機器上沒有local的機器上運行,從而計算時間應該是相同的。

有關信息,我正在使用Point Gray相機Chameleon 3.至於驅動程序,我使用的是Kumar機器人驅動程序https://github.com/KumarRobotics/flea3的ROS flea3節點。我在ubuntu 16,4.6.4-040604-lowlatency內核上運行這個。

+0

這些標籤與您的問題有什麼關係?這不是一個C++問題。這不是一個ssh問題... –

+0

@AndersLindén我更新了我的問題 – Courier

回答

0

那麼,我認爲你對回調電話的估計時間並不完全是rostopic hz正在做的。爲了更接近一個,請嘗試計算回調調用之間的延遲,而不進行任何進一步處理。這將避免額外的計算時間。

void imageCallback(const sensor_msgs::ImageConstPtr& msg) 
{ 
if(image_itr == 0) 
     time1 = boost::posix_time::microsec_clock::local_time(); 

    timeloop = boost::posix_time::microsec_clock::local_time() - time1; 
    time1 = boost::posix_time::microsec_clock::local_time(); 
    timeloop_sc = 1e-3* (double)timeloop.total_milliseconds(); 
    cout << "itr " << image_itr++ << " fps: " << 1.0/timeloop_sc << endl; 
} 

另外,將回調隊列大小設置爲更高的值,從而避免由於小隊列大小而導致丟棄圖像。

image_transport::Subscriber sub = it.subscribe("/pg_15508342/image_raw", 1000, imageCallback); 

而且,我認爲,如果你提到的相機類型和驅動程序正在使用ROS下會有所幫助。

希望有幫助!

+0

我發現我犯了一個愚蠢的錯誤。事實上,這些30 fps是由於命令'waitKey(30)'。我現在完全刪除那部分....但我仍然有不一致的問題。正在更新我的問題 – Courier

相關問題