11 ifstream file(dump_img_.c_str());
13 if (
remove(dump_img_.c_str()) != 0)
28 system_->ReleaseInstance();
30 delete dynamicReCfgServer_;
33 pubThread_->interrupt();
66 ifstream usb_mem(
"/sys/module/usbcore/parameters/usbfs_memory_mb");
72 ROS_FATAL_STREAM(
" USB memory on system too low ("<<mem<<
" MB)! Must be at least 1000 MB. Run: \nsudo sh -c \"echo 1000 > /sys/module/usbcore/parameters/usbfs_memory_mb\"\n Terminating...");
105 #ifdef trigger_msgs_FOUND 108 prev_imu_trigger_count_ = 0;
109 latest_imu_trigger_count_ = 0;
142 ROS_INFO_STREAM(
"spinnaker_sdk_camera_driver package version: " << spinnaker_sdk_camera_driver_VERSION);
143 system_ = System::GetInstance();
145 const LibraryVersion spinnakerLibraryVersion =
system_->GetLibraryVersion();
147 << spinnakerLibraryVersion.major <<
"." 148 << spinnakerLibraryVersion.minor <<
"." 149 << spinnakerLibraryVersion.type <<
"." 150 << spinnakerLibraryVersion.build);
157 #ifdef trigger_msgs_FOUND 160 timeStamp_sub =
nh_.
subscribe(
"/imu/sync_trigger", 1000, &acquisition::Capture::assignTimeStampCallback,
this);
163 std::queue<SyncInfo_> sync_message_queue;
164 sync_message_queue_vector_.push_back(sync_message_queue);
172 dynamic_reconfigure::Server<spinnaker_sdk_camera_driver::spinnaker_camConfig>::CallbackType dynamicReCfgServerCB_t;
192 <<
" "<< cam.getTLNodeStringValue(
"DeviceModelName")
193 <<
" "<< cam.getTLNodeStringValue(
"DeviceVersion") );
196 bool master_set =
false;
199 for (
int j=0; j<
cam_ids_.size(); j++) {
200 bool current_cam_found=
false;
208 if (cam.get_id().compare(
cam_ids_[j]) == 0) {
209 current_cam_found=
true;
228 img_msgs.push_back(sensor_msgs::ImagePtr());
230 sensor_msgs::CameraInfoPtr ci_msg(
new sensor_msgs::CameraInfo());
240 std::string distortion_model =
"";
244 ci_msg->distortion_model = distortion_model;
250 ci_msg->roi.do_rectify =
true;
275 proj_coeff_vec_[j][2], proj_coeff_vec_[j][3],
276 proj_coeff_vec_[j][4], proj_coeff_vec_[j][5],
277 proj_coeff_vec_[j][6], proj_coeff_vec_[j][7],
278 proj_coeff_vec_[j][8], proj_coeff_vec_[j][9],
279 proj_coeff_vec_[j][10], proj_coeff_vec_[j][11]};
286 intrinsic_coeff_vec_[j][2], 0,
287 intrinsic_coeff_vec_[j][3], intrinsic_coeff_vec_[j][4],
288 intrinsic_coeff_vec_[j][5], 0,
289 intrinsic_coeff_vec_[j][6], intrinsic_coeff_vec_[j][7],
290 intrinsic_coeff_vec_[j][8], 0};
309 ROS_ASSERT_MSG(master_set,
"The camera supposed to be the master isn't connected!");
318 if(
path_.front() ==
'~'){
320 if ((homedir = getenv(
"HOME")) == NULL)
321 homedir = getpwuid(getuid())->pw_dir;
322 std::string hd(homedir);
323 path_.replace(0,1,hd);
328 boost::filesystem::path canonicalPath = boost::filesystem::canonical(
".", boost::filesystem::current_path());
329 path_ = canonicalPath.string();
334 if (
path_.back() !=
'/')
338 ROS_ASSERT_MSG(stat(
path_.c_str(), &sb) == 0 && S_ISDIR(sb.st_mode),
"Specified Path Doesn't Exist!!!");
342 std::vector<int> cam_id_vec;
343 ROS_ASSERT_MSG(
nh_pvt_.
getParam(
"cam_ids", cam_id_vec),
"If cam_aliases are provided, they should be the same number as cam_ids and should correspond in order!");
344 int num_ids = cam_id_vec.size();
345 for (
int i=0; i < num_ids; i++){
346 cam_ids_.push_back(to_string(cam_id_vec[i]));
350 std::vector<string> cam_alias_vec;
353 ROS_ASSERT_MSG(num_ids ==
cam_names_.size(),
"If cam_aliases are provided, they should be the same number as cam_ids and should correspond in order!");
358 ROS_INFO_STREAM(
" No camera aliases provided. Camera IDs will be used as names.");
359 for (
int i=0; i<
cam_ids_.size(); i++)
366 else ROS_WARN(
" 'external_trigger' Parameter not set, using default behavior external_trigger=%s",
EXTERNAL_TRIGGER_?
"true":
"false");
368 #ifndef trigger_msgs_FOUND 370 ROS_WARN(
" Using 'external_trigger'. Trigger msgs package not found, will use machine timestamps");
383 for (
int i=0; i<
cam_ids_.size(); i++) {
384 if (master_cam_id_.compare(
cam_ids_[i]) == 0)
387 ROS_ASSERT_MSG(found,
"Specified master cam is not in the cam_ids list!");
397 ROS_INFO(
" color set to: %s",
color_?
"true":
"false");
398 else ROS_WARN(
" 'color' Parameter not set, using default behavior color=%s",
color_?
"true":
"false");
401 ROS_ASSERT_MSG(num_ids ==
flip_horizontal_vec_.size(),
"If flip_horizontal flags are provided, they should be the same number as cam_ids and should correspond in order!");
407 ROS_WARN_STREAM(
" flip_horizontal flags are not provided. default behavior is false ");
408 for (
int i=0; i<
cam_ids_.size(); i++){
415 ROS_ASSERT_MSG(num_ids ==
flip_vertical_vec_.size(),
"If flip_vertical flags are provided, they should be the same number as cam_ids and should correspond in order!");
421 ROS_WARN_STREAM(
" flip_vertical flags are not provided. default behavior is false ");
422 for (
int i=0; i<
cam_ids_.size(); i++){
429 ROS_INFO(
" Exporting images to ROS: %s",
EXPORT_TO_ROS_?
"true":
"false");
430 else ROS_WARN(
" 'to_ros' Parameter not set, using default behavior to_ros=%s",
EXPORT_TO_ROS_?
"true":
"false");
433 ROS_INFO(
" Showing live images setting: %s",
LIVE_?
"true":
"false");
434 else ROS_WARN(
" 'live' Parameter not set, using default behavior live=%s",
LIVE_?
"true":
"false");
438 ROS_INFO(
" Showing grid-style live images setting: %s",
GRID_VIEW_?
"true":
"false");
439 }
else ROS_WARN(
" 'live_grid' Parameter not set, using default behavior live_grid=%s",
GRID_VIEW_?
"true":
"false");
442 ROS_INFO(
" Max Rate Save Mode: %s",
MAX_RATE_SAVE_?
"true":
"false");
443 else ROS_WARN(
" 'max_rate_save' Parameter not set, using default behavior max_rate_save=%s",
MAX_RATE_SAVE_?
"true":
"false");
446 ROS_INFO(
" Displaying timing details: %s",
TIME_BENCHMARK_?
"true":
"false");
453 ROS_WARN(
" Provided 'skip' is not valid, using default behavior, skip=%d",
skip_num_);
455 }
else ROS_WARN(
" 'skip' Parameter not set, using default behavior: skip=%d",
skip_num_);
463 }
else ROS_WARN(
" 'delay' Parameter not set, using default behavior: delay=%f",
init_delay_);
476 else ROS_INFO(
" 'exposure_time'=%0.f, Setting autoexposure",
exposure_time_);
477 }
else ROS_WARN(
" 'exposure_time' Parameter not set, using default behavior: Automatic Exposure ");
481 ROS_INFO(
"gain value set to:%.1f",
gain_);
483 else ROS_INFO(
" 'gain' Parameter was zero or negative, using Auto gain based on target grey value");
485 else ROS_WARN(
" 'gain' Parameter not set, using default behavior: Auto gain based on target grey value");
489 else ROS_INFO(
" 'target_grey_value'=%0.f, Setting AutoExposureTargetGreyValueAuto to Continuous/ auto",
target_grey_value_);}
490 else ROS_WARN(
" 'target_grey_value' Parameter not set, using default behavior: AutoExposureTargetGreyValueAuto to auto");
497 ROS_INFO(
" 'binning'=%d invalid, Using defauly binning=",
binning_);
499 }
else ROS_WARN(
" 'binning' Parameter not set, using default behavior: Binning = %d",
binning_);
504 ROS_INFO(
" Using Software rate control, rate set to: %d",
soft_framerate_);
506 else ROS_INFO(
" 'soft_framerate'=%d, software rate control set to off",
soft_framerate_);
508 else ROS_WARN(
" 'soft_framerate' Parameter not set, using default behavior: No Software Rate Control ");
511 ROS_INFO(
" Saving images set to: %d",
SAVE_);
512 else ROS_WARN(
" 'save' Parameter not set, using default behavior save=%d",
SAVE_);
519 }
else ROS_WARN(
" 'save_type' Parameter not set, using default behavior save=%d",
SAVE_);
526 ROS_INFO(
" Number of frames to be recorded: %d",
nframes_ );
527 }
else ROS_INFO(
" Frames will be recorded until user termination");
528 }
else ROS_WARN(
" 'frames' Parameter not set, using defult behavior, frames will be recorded until user termination");
535 else ROS_WARN(
" 'tf_prefix' Parameter not set, using default behavior tf_prefix=" " ");
553 ROS_INFO(
" Region of Interest set to width: %d\theight: %d\toffset_x: %d offset_y: %d",
555 }
else ROS_ERROR(
" 'region_of_interest' Parameter found but not configured correctly, NOT BEING USED");
556 }
else ROS_INFO_STREAM(
" 'region of interest' not set using full resolution");
558 bool intrinsics_list_provided =
false;
561 ROS_INFO(
" Camera Intrinsic Paramters:");
562 ROS_ASSERT_MSG(intrinsics_list.
size() == num_ids,
"If intrinsic_coeffs are provided, they should be the same number as cam_ids and should correspond in order!");
563 for (
int i=0; i<intrinsics_list.
size(); i++){
564 std::vector<double> intrinsics;
565 String intrinsics_str=
"";
566 for (
int j=0; j<intrinsics_list[i].
size(); j++){
568 intrinsics.push_back(static_cast<double>(intrinsics_list[i][j]));
569 intrinsics_str = intrinsics_str +to_string(intrinsics[j])+
" ";
574 intrinsics_list_provided=
true;
577 bool distort_list_provided =
false;
581 ROS_INFO(
" Camera Distortion Paramters:");
582 ROS_ASSERT_MSG(distort_list.
size() == num_ids,
"If intrinsic_coeffs are provided, they should be the same number as cam_ids and should correspond in order!");
583 for (
int i=0; i<distort_list.
size(); i++){
584 std::vector<double> distort;
585 String distort_str=
"";
586 for (
int j=0; j<distort_list[i].
size(); j++){
588 distort.push_back(static_cast<double>(distort_list[i][j]));
589 distort_str = distort_str +to_string(distort[j])+
" ";
593 distort_list_provided =
true;
600 ROS_INFO(
" Camera Rectification Paramters:");
601 ROS_ASSERT_MSG(rect_list.
size() == num_ids,
"If rectification_coeffs are provided, they should be the same number as cam_ids and should correspond in order!");
602 for (
int i=0; i<rect_list.
size(); i++){
603 std::vector<double> rect;
605 for (
int j=0; j<rect_list[i].
size(); j++){
607 rect.push_back(static_cast<double>(rect_list[i][j]));
608 rect_str = rect_str +to_string(rect[j])+
" ";
618 ROS_INFO(
" Camera Projection Paramters:");
619 ROS_ASSERT_MSG(proj_list.
size() == num_ids,
"If projection_coeffs are provided, they should be the same number as cam_ids and should correspond in order!");
620 for (
int i=0; i<proj_list.
size(); i++){
621 std::vector<double> proj;
623 for (
int j=0; j<proj_list[i].
size(); j++){
625 proj.push_back(static_cast<double>(proj_list[i][j]));
626 proj_str = proj_str +to_string(proj[j])+
" ";
635 ROS_INFO(
" Camera coeffs provided, camera info messges will be published.");
637 ROS_WARN(
" Camera coeffs not provided correctly, camera info messges intrinsics and distortion coeffs will be published with zeros.");
688 cams[i].setEnumValue(
"ExposureMode",
"Timed");
702 cams[i].setEnumValue(
"ExposureAuto",
"Off");
705 cams[i].setEnumValue(
"ExposureAuto",
"Continuous");
709 cams[i].setEnumValue(
"GainAuto",
"Off");
710 double max_gain_allowed =
cams[i].getFloatValueMax(
"Gain");
711 if (
gain_ <= max_gain_allowed)
714 cams[i].setFloatValue(
"Gain", max_gain_allowed);
715 ROS_WARN(
"Provided Gain value is higher than max allowed, setting gain to %f", max_gain_allowed);
719 cams[i].setEnumValue(
"GainAuto",
"Continuous");
723 cams[i].setEnumValue(
"AutoExposureTargetGreyValueAuto",
"Off");
726 cams[i].setEnumValue(
"AutoExposureTargetGreyValueAuto",
"Continuous");
734 cams[i].setEnumValue(
"PixelFormat",
"BGR8");
736 cams[i].setEnumValue(
"PixelFormat",
"Mono8");
737 cams[i].setEnumValue(
"AcquisitionMode",
"Continuous");
740 if (
cams[i].is_master()) {
742 cams[i].setEnumValue(
"LineSelector",
"Line2");
743 cams[i].setEnumValue(
"LineMode",
"Output");
744 cams[i].setBoolValue(
"AcquisitionFrameRateEnable",
false);
747 cams[i].setEnumValue(
"TriggerMode",
"On");
748 cams[i].setEnumValue(
"LineSelector",
"Line2");
749 cams[i].setEnumValue(
"LineMode",
"Output");
750 cams[i].setEnumValue(
"TriggerSource",
"Software");
758 cams[i].setEnumValue(
"TriggerMode",
"On");
759 cams[i].setEnumValue(
"LineSelector",
"Line3");
760 cams[i].setEnumValue(
"TriggerSource",
"Line3");
761 cams[i].setEnumValue(
"TriggerSelector",
"FrameStart");
762 cams[i].setEnumValue(
"LineMode",
"Input");
765 cams[i].setEnumValue(
"TriggerOverlap",
"ReadOut");
766 cams[i].setEnumValue(
"TriggerActivation",
"RisingEdge");
771 catch (Spinnaker::Exception &e) {
772 string error_msg = e.what();
774 if (error_msg.find(
"Unable to set PixelFormat to BGR8") >= 0)
775 ROS_WARN(
"Most likely cause for this error is if your camera can't support color and your are trying to set it to color mode");
786 cams[i].begin_acquisition();
823 if (mkdir(ss.str().c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) < 0) {
824 ROS_WARN_STREAM(
"Failed to create directory "<<ss.str()<<
"! Data will be written into pre existing directory if it exists...");
854 ostringstream filename;
858 mesg.name.push_back(filename.str());
859 imwrite(filename.str(),
frames_[i]);
871 std_msgs::Header img_msg_header;
873 #ifdef trigger_msgs_FOUND 875 if (latest_imu_trigger_count_ - prev_imu_trigger_count_ > 1 ){
876 ROS_WARN(
"Difference in trigger count more than 1, latest_count = %d and prev_count = %d",latest_imu_trigger_count_,prev_imu_trigger_count_);
879 else if (latest_imu_trigger_count_ - prev_imu_trigger_count_ == 0){
881 ROS_WARN(
"Difference in trigger count zero, latest_count = %d and prev_count = %d",latest_imu_trigger_count_,prev_imu_trigger_count_);
882 while(latest_imu_trigger_count_ - prev_imu_trigger_count_ == 0){
887 img_msg_header.stamp = latest_imu_trigger_time_;
888 prev_imu_trigger_count_ = latest_imu_trigger_count_;
891 img_msg_header.stamp =
mesg.header.stamp;
895 #ifndef trigger_msgs_FOUND 896 img_msg_header.stamp =
mesg.header.stamp;
899 string frame_id_prefix;
902 else frame_id_prefix=
"";
905 img_msg_header.frame_id = frame_id_prefix +
"cam_"+to_string(i)+
"_optical_frame";
939 ostringstream filename;
943 mesg.name.push_back(filename.str());
944 std::ofstream ofs(filename.str());
945 boost::archive::binary_oarchive oa(ofs);
966 int fid_mismatch = 0;
977 frameID =
cams[i].get_frame_id();
979 if (
cams[i].get_frame_id() != frameID)
982 if (i == numCameras_-1)
983 ss <<
cams[i].get_frame_id() <<
"]";
985 ss <<
cams[i].get_frame_id() <<
", ";
990 string message = ss.str();
1008 if (
LIVE_)namedWindow(
"Acquisition", CV_WINDOW_NORMAL | CV_WINDOW_KEEPRATIO);
1030 ROS_ASSERT_MSG(
cams[i].verifyBinning(
binning_),
" Failed to set Binning= %d, could be either due to Invalid binning value, try changing binning value or due to spinnaker api bug - failing to set lower binning than previously set value - solution: unplug usb camera and re-plug it back and run to node with desired valid binning",
binning_);
1048 imshow(
"Acquisition",
grid_);
1052 sprintf(title,
"cam # = %d, cam ID = %s, cam name = %s", CAM_,
cam_ids_[CAM_].c_str(),
cam_names_[CAM_].c_str());
1053 displayOverlay(
"Acquisition", title);
1057 int key = cvWaitKey(1);
1060 if ( (key & 255)!=255 ) {
1062 if ( (key & 255)==83 ) {
1065 }
else if( (key & 255)==81 ) {
1071 }
else if( (key & 255)==32 && !
SAVE_) {
1082 }
else if( (key & 255)==27 ) {
1084 cvDestroyAllWindows();
1113 cvDestroyAllWindows();
1128 "total time (ms): %.1f \tPossible FPS: %.1f\tActual FPS: %.1f",
1140 catch(
const std::exception &e){
1144 ROS_FATAL_STREAM(
"Some unknown exception occured. \v Exiting gracefully, \n possible reason could be Camera Disconnection...");
1152 std::ifstream file(
"/proc/meminfo");
1153 unsigned long int total, free;
1154 while (file >> token) {
1155 if (token ==
"MemTotal:")
1156 if (!(file >> total))
1158 if (token ==
"MemAvailable:")
1159 if (!(file >> free)) {
1164 file.ignore(std::numeric_limits<std::streamsize>::max(),
'\n');
1166 return 1-float(free)/float(total);
1176 grid_.create(height, width, CV_8UC3);
1178 grid_.create(height, width, CV_8U);
1183 for (
int i=0; i<
cams.size(); i++)
1191 ROS_DEBUG(
" Write Queue to Disk Thread Initiated for cam: %d", cam_no);
1198 while (imageCnt < k_numImages){
1201 #ifdef trigger_msgs_FOUND 1203 if(img_q->empty() || sync_message_queue_vector_.at(cam_no).empty()){
1204 boost::this_thread::sleep(boost::posix_time::milliseconds(5));
1209 #ifndef trigger_msgs_FOUND 1211 boost::this_thread::sleep(boost::posix_time::milliseconds(5));
1216 ROS_DEBUG_STREAM(
" Write Queue to Disk for cam: "<< cam_no <<
" size = "<<img_q->size());
1218 if (img_q->size()>100)
1221 #ifdef trigger_msgs_FOUND 1222 if (abs((
int)img_q->size() - (int)sync_message_queue_vector_.at(cam_no).size()) > 100){
1223 ROS_WARN_STREAM(
" The camera image queue size is increasing, the sync trigger messages are not coming at the desired rate");
1227 ImagePtr convertedImage = img_q->front();
1229 #ifdef trigger_msgs_FOUND 1232 SyncInfo_ sync_info = sync_message_queue_vector_.at(cam_no).front();
1233 sync_info.latest_imu_trigger_count_;
1234 timeStamp = sync_info.latest_imu_trigger_time_.
toSec() * 1e6;
1235 ROS_INFO(
"time Queue size for cam %d is = %d",cam_no,sync_message_queue_vector_.at(cam_no).size());
1236 sync_message_queue_vector_.at(cam_no).pop();
1239 timeStamp = convertedImage->GetTimeStamp() * 1e6;
1243 #ifndef trigger_msgs_FOUND 1244 uint64_t timeStamp = convertedImage->GetTimeStamp() * 1e6;
1248 ostringstream filename;
1251 << std::setw(6) << imageCnt<<
"_"<<timeStamp <<
ext_;
1255 convertedImage->Save(filename.str().c_str());
1257 convertedImage->Release();
1258 ROS_INFO(
"image Queue size for cam %d is = %zu",cam_no, img_q->size());
1271 ROS_DEBUG(
" Acquire Images to Queue Thread Initiated");
1273 ROS_DEBUG(
" Acquire Images to Queue Thread -> Acquisition Started");
1284 cams[i].grab_frame();
1291 for (
int imageCnt = 0; imageCnt < k_numImages; imageCnt++) {
1292 uint64_t timeStamp = 0;
1297 ImagePtr convertedImage =
cams[i].grab_frame();
1301 if(
cams[i].is_master()) {
1304 timeStamp = convertedImage->GetTimeStamp() * 1000;
1306 ostringstream filename;
1310 << std::setw(6) << imageCnt<<
"_"<<timeStamp <<
ext_;
1314 img_qs->at(i).push(convertedImage);
1322 catch (Spinnaker::Exception &e) {
1323 ROS_ERROR_STREAM(
" Exception in Acquire to queue thread" <<
"\nError: " << e.what());
1344 ROS_INFO(
"*** ACQUISITION MULTI-THREADED***");
1349 boost::thread_group threads;
1351 vector<std::queue<ImagePtr>> image_queue_vector;
1354 std::queue<ImagePtr> img_ptr_queue;
1355 image_queue_vector.push_back(img_ptr_queue);
1380 std::time_t t=std::time(NULL);
1381 std::strftime(out,
sizeof(out),
"%Y%m%d", std::localtime(&t));
1382 std::string td(out);
1389 if(level == 1 || level ==3){
1393 cams[i].setEnumValue(
"AutoExposureTargetGreyValueAuto",
"Off");
1394 cams[i].setFloatValue(
"AutoExposureTargetGreyValue", config.target_grey_value);
1397 if (level == 2 || level ==3){
1399 if(config.exposure_time > 0){
1402 cams[i].setEnumValue(
"ExposureAuto",
"Off");
1403 cams[i].setEnumValue(
"ExposureMode",
"Timed");
1404 cams[i].setFloatValue(
"ExposureTime", config.exposure_time);
1407 else if(config.exposure_time ==0){
1409 cams[i].setEnumValue(
"ExposureAuto",
"Continuous");
1410 cams[i].setEnumValue(
"ExposureMode",
"Timed");
1416 #ifdef trigger_msgs_FOUND 1417 void acquisition::Capture::assignTimeStampCallback(
const trigger_msgs::sync_trigger::ConstPtr& msg){
1420 SyncInfo_ sync_info;
1421 latest_imu_trigger_count_ = msg->count;
1422 latest_imu_trigger_time_ = msg->header.stamp;
1423 sync_info.latest_imu_trigger_count_ = latest_imu_trigger_count_;
1424 sync_info.latest_imu_trigger_time_ = latest_imu_trigger_time_;
1428 sync_message_queue_vector_.at(i).push(sync_info);
1429 ROS_DEBUG(
"Sync trigger added to cam: %d, length of queue: %d",i,sync_message_queue_vector_.at(i).size());
int region_of_interest_height_
bool first_image_received
void acquire_images_to_queue(vector< queue< ImagePtr >> *)
vector< vector< double > > distortion_coeff_vec_
double export_to_ROS_time_
void publish(const boost::shared_ptr< M > &message) const
int region_of_interest_width_
vector< string > cam_ids_
void write_queue_to_disk(queue< ImagePtr > *, int)
Subscriber subscribe(const std::string &topic, uint32_t queue_size, void(T::*fp)(M), T *obj, const TransportHints &transport_hints=TransportHints())
std::shared_ptr< boost::thread > pubThread_
void setGetNextImageTimeout(uint64_t get_next_image_timeout)
vector< string > cam_names_
std::string todays_date()
void init_variables_register_to_ros()
int region_of_interest_y_offset_
bool SOFT_FRAME_RATE_CTRL_
ros::NodeHandle & getPrivateNodeHandle() const
vector< vector< double > > intrinsic_coeff_vec_
#define ROS_FATAL_STREAM(args)
vector< bool > flip_vertical_vec_
bool param(const std::string ¶m_name, T ¶m_val, const T &default_val) const
#define ROS_ASSERT_MSG(cond,...)
vector< string > time_stamps_
void dynamicReconfigureCallback(spinnaker_sdk_camera_driver::spinnaker_camConfig &config, uint32_t level)
dynamic_reconfigure::Server< spinnaker_sdk_camera_driver::spinnaker_camConfig > * dynamicReCfgServer_
vector< bool > flip_horizontal_vec_
Publisher advertise(const std::string &topic, uint32_t queue_size, bool latch=false)
ros::NodeHandle & getNodeHandle() const
vector< sensor_msgs::ImagePtr > img_msgs
#define ROS_WARN_STREAM(args)
#define ROS_DEBUG_STREAM(args)
spinnaker_sdk_camera_driver::SpinnakerImageNames mesg
void save_mat_frames(int)
#define NODELET_INFO(...)
std::shared_ptr< image_transport::ImageTransport > it_
#define ROS_INFO_STREAM(args)
vector< vector< double > > rect_coeff_vec_
bool getParam(const std::string &key, std::string &s) const
boost::mutex queue_mutex_
#define ROS_INFO_COND(cond,...)
double target_grey_value_
vector< sensor_msgs::CameraInfoPtr > cam_info_msgs
ROSCPP_DECL void shutdown()
bool region_of_interest_set_
void create_cam_directories()
bool hasParam(const std::string &key) const
#define ROS_ERROR_STREAM(args)
vector< acquisition::Camera > cams
vector< ImagePtr > pResultImages_
vector< string > imageNames
vector< image_transport::CameraPublisher > camera_image_pubs
#define PLUGINLIB_EXPORT_CLASS(class_type, base_class_type)
void save_binary_frames(int)
bool MASTER_TIMESTAMP_FOR_ALL_
int region_of_interest_x_offset_
sensor_msgs::ImagePtr toImageMsg() const
vector< vector< double > > proj_coeff_vec_
uint64_t SPINNAKER_GET_NEXT_IMAGE_TIMEOUT_
ros::Publisher acquisition_pub