Skip to content

Commit 302c8d4

Browse files
committed
fixed imagetransport, changed from imagetransport:;publisher to imagetransport::camerapublisher and made caminfo to caminfoptr
1 parent d9a0527 commit 302c8d4

File tree

9 files changed

+124
-38
lines changed

9 files changed

+124
-38
lines changed

CMakeLists.txt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ find_package(catkin REQUIRED COMPONENTS
2222
cv_bridge
2323
image_transport
2424
sensor_msgs
25+
dynamic_reconfigure
2526
)
2627

2728
#find_package(PCL REQUIRED)
@@ -46,6 +47,11 @@ add_message_files(
4647
SpinnakerImageNames.msg
4748
)
4849

50+
generate_dynamic_reconfigure_options(
51+
cfg/spinnaker_cam.cfg
52+
53+
)
54+
4955
generate_messages(
5056
DEPENDENCIES
5157
std_msgs
@@ -75,11 +81,11 @@ add_library (acquilib SHARED
7581
src/camera.cpp
7682
)
7783

78-
add_dependencies(acquilib ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
84+
add_dependencies(acquilib ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS} ${PROJECT_NAME}_gencfg)
7985
target_link_libraries(acquilib ${LIBS} ${catkin_LIBRARIES})
8086

8187
add_executable (acquisition_node src/acquisition_node.cpp)
82-
add_dependencies(acquisition_node acquilib ${catkin_EXPORTED_TARGETS})
88+
add_dependencies(acquisition_node acquilib ${catkin_EXPORTED_TARGETS} ${PROJECT_NAME}_gencfg)
8389
target_link_libraries (acquisition_node acquilib ${LIBS} ${catkin_LIBRARIES})
8490

8591
install(TARGETS acquilib acquisition_node

cfg/spinnaker_cam.cfg

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#!/usr/bin/env python
2+
PACKAGE = "spinnaker_sdk_camera_driver"
3+
4+
from dynamic_reconfigure.parameter_generator_catkin import *
5+
6+
gen = ParameterGenerator()
7+
8+
9+
gen.add("target_grey_val", double_t, 1, "Set Target Grey Value", 50, 4, 90)
10+
gen.add("exposure_time", int_t, 3, "Set Exposure time (0:auto)", 0, 0, 15000)
11+
12+
13+
exit(gen.generate(PACKAGE, "spinnaker_sdk_camera_driver", "spinnaker_cam"))

include/spinnaker_sdk_camera_driver/camera.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ namespace acquisition {
4545
void setResolutionPixels(int width, int height);
4646
void setBufferSize(int numBuf);
4747
void adcBitDepth(gcstring bitDep);
48+
void targetGreyValueTest();
4849

4950
// void set_acquisition_mode_continuous();
5051
// void set_frame_rate(float);

include/spinnaker_sdk_camera_driver/capture.h

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,17 @@
77

88
#include <boost/archive/binary_oarchive.hpp>
99
#include <boost/filesystem.hpp>
10-
10+
//ROS
11+
#include "std_msgs/Float64.h"
1112
#include "std_msgs/String.h"
13+
//Dynamic reconfigure
14+
#include <dynamic_reconfigure/server.h>
15+
#include <spinnaker_sdk_camera_driver/spinnaker_camConfig.h>
16+
1217
#include "spinnaker_sdk_camera_driver/SpinnakerImageNames.h"
1318

1419
#include <sstream>
20+
#include <image_transport/image_transport.h>
1521

1622
using namespace Spinnaker;
1723
using namespace Spinnaker::GenApi;
@@ -58,6 +64,7 @@ namespace acquisition {
5864
void get_mat_images();
5965
void update_grid();
6066
void export_to_ROS();
67+
void dynamicReconfigureCallback(spinnaker_sdk_camera_driver::spinnaker_camConfig &config, uint32_t level);
6168

6269
float mem_usage();
6370

@@ -121,13 +128,17 @@ namespace acquisition {
121128
// ros variables
122129
ros::NodeHandle nh_;
123130
ros::NodeHandle nh_pvt_;
131+
//image_transport::ImageTransport it_;
132+
image_transport::ImageTransport it_;
133+
dynamic_reconfigure::Server<spinnaker_sdk_camera_driver::spinnaker_camConfig> server;
124134

125135
ros::Publisher acquisition_pub;
126-
vector<ros::Publisher> camera_image_pubs;
127-
vector<ros::Publisher> camera_info_pubs;
136+
//vector<ros::Publisher> camera_image_pubs;
137+
vector<image_transport::CameraPublisher> camera_image_pubs;
138+
//vector<ros::Publisher> camera_info_pubs;
128139

129140
vector<sensor_msgs::ImagePtr> img_msgs;
130-
vector<sensor_msgs::CameraInfo> cam_info_msgs;
141+
vector<sensor_msgs::CameraInfoPtr> cam_info_msgs;
131142
spinnaker_sdk_camera_driver::SpinnakerImageNames mesg;
132143
boost::mutex queue_mutex_;
133144
};

launch/acquisition.launch

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<env name="ROSCONSOLE_CONFIG_FILE" value="$(find spinnaker_sdk_camera_driver)/cfg/std_console.conf"/>
44

55
<!-- acquisition.lauynch -->
6-
<arg name="binning" default="2" doc="Binning for cameras, when changing from 2 to 1 cameras need to be unplugged and replugged"/>
6+
<arg name="binning" default="1" doc="Binning for cameras, when changing from 2 to 1 cameras need to be unplugged and replugged"/>
77
<arg name="color" default="false" doc="Should color images be used (only works on models that support color images)"/>
88
<arg name="exp" default="0" doc="Exposure setting for cameras"/>
99
<arg name="frames" default="3400" doc="Numer of frames to save/view 0=ON"/>

params/test_params.yaml

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
cam_ids:
2-
- 17197555
2+
- 17197559
3+
- 17197547
34
cam_aliases:
45
- cam0
5-
master_cam: 17197555
6+
- cam1
7+
master_cam: 17197559
68
skip: 20
7-
delay: 0
9+
delay: 1.0
810

911
# Assign all the follwing via launch file to prevent confusion and conflict
1012

@@ -16,3 +18,13 @@ delay: 0
1618
#soft_framerate: 4 # this frame rate reflects to the software frame rate set using ros::rate
1719
#exp: 997
1820
#to_ros: true #When to_ros is not selected, but live is selected, pressing 'space' exports single image to ROS
21+
22+
#Camera info message details
23+
distortion_model: plumb_bob
24+
distortion_coeffs:
25+
- [-0.021141875266089592, -0.3733872931278025, 2.385982550579459, 3.2824571732099725]
26+
- [-0.021141875266089592, -0.3733872931278025, 2.385982550579459, 3.2824571732099725]
27+
#specified as [fx 0 cx 0 fy cy 0 0 1]
28+
intrinsic_coeffs:
29+
- [1886.9232141485886, 0.0, 604.7214878709341, 0.0, 1886.6668765711668, 493.47726714719823, 0.0, 0.0, 1.0]
30+
- [1886.9232141485886, 0.0, 604.7214878709341, 0.0, 1886.6668765711668, 493.47726714719823, 0.0, 0.0, 1.0]

src/acquisition_node.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@ int main(int argc, char** argv) {
1111

1212
// Initializing the ros node
1313
ros::init(argc, argv, "acquisition_node");
14-
14+
//spinners
15+
ros::AsyncSpinner spinner(0); // Use max cores possible for mt
16+
spinner.start();
17+
1518
acquisition::Capture cobj;
1619
cobj.init_array();
1720
cobj.run();

src/camera.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,19 @@ void acquisition::Camera::trigger() {
301301

302302
}
303303

304+
305+
void acquisition::Camera::targetGreyValueTest() {
306+
CFloatPtr ptrExpTest =pCam_->GetNodeMap().GetNode("AutoExposureTargetGreyValue");
307+
//CFloatPtr ptrExpTest=pCam_->GetNodeMap().GetNode("ExposureTime");
308+
if (!IsAvailable(ptrExpTest) || !IsReadable(ptrExpTest)){
309+
ROS_FATAL_STREAM("Unable to set exposure " << "). Aborting..." << endl << endl);
310+
return ;
311+
}
312+
ptrExpTest->SetValue(90.0);
313+
ROS_INFO_STREAM("target grey mode Time: "<<ptrExpTest->GetValue()<<endl);
314+
315+
}
316+
304317
void acquisition::Camera::exposureTest() {
305318
CFloatPtr ptrExpTest=pCam_->GetNodeMap().GetNode("ExposureTime");
306319
if (!IsAvailable(ptrExpTest) || !IsReadable(ptrExpTest)){

src/capture.cpp

Lines changed: 54 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ void handler(int i) {
3535

3636
}
3737

38-
acquisition::Capture::Capture():nh_(),nh_pvt_ ("~") {
38+
acquisition::Capture::Capture(): it_(nh_), nh_pvt_ ("~") {
3939

4040
// struct sigaction sigIntHandler;
4141

@@ -91,7 +91,7 @@ acquisition::Capture::Capture():nh_(),nh_pvt_ ("~") {
9191
achieved_time_ = 0;
9292

9393
// decimation_ = 1;
94-
94+
9595
CAM_ = 0;
9696

9797
// default flag values
@@ -113,6 +113,12 @@ acquisition::Capture::Capture():nh_(),nh_pvt_ ("~") {
113113

114114
//initializing the ros publisher
115115
acquisition_pub = nh_.advertise<spinnaker_sdk_camera_driver::SpinnakerImageNames>("camera", 1000);
116+
//dynamic reconfigure
117+
//dynamic_reconfigure::Server<spinnaker_sdk_camera_driver::spinnaker_camConfig> server;
118+
dynamic_reconfigure::Server<spinnaker_sdk_camera_driver::spinnaker_camConfig>::CallbackType f;
119+
120+
f = boost::bind(&acquisition::Capture::dynamicReconfigureCallback,this, _1, _2);
121+
server.setCallback(f);
116122
}
117123

118124
void acquisition::Capture::load_cameras() {
@@ -133,6 +139,8 @@ void acquisition::Capture::load_cameras() {
133139

134140
bool master_set = false;
135141
int cam_counter = 0;
142+
143+
136144
for (int j=0; j<cam_ids_.size(); j++) {
137145
bool current_cam_found=false;
138146
for (int i=0; i<numCameras_; i++) {
@@ -156,26 +164,24 @@ void acquisition::Capture::load_cameras() {
156164

157165
cams.push_back(cam);
158166

159-
camera_image_pubs.push_back(nh_.advertise<sensor_msgs::Image>("camera_array/"+cam_names_[j]+"/image_raw", 1));
160-
camera_info_pubs.push_back(nh_.advertise<sensor_msgs::CameraInfo>("camera_array/"+cam_names_[j]+"/camera_info", 1));
167+
camera_image_pubs.push_back(it_.advertiseCamera("camera_array/"+cam_names_[j]+"/image_raw", 1));
168+
//camera_info_pubs.push_back(nh_.advertise<sensor_msgs::CameraInfo>("camera_array/"+cam_names_[j]+"/camera_info", 1));
169+
161170
img_msgs.push_back(sensor_msgs::ImagePtr());
162-
163171
if (PUBLISH_CAM_INFO_){
164-
sensor_msgs::CameraInfo ci_msg;
165-
166-
ci_msg.height = 1024;
167-
ci_msg.width = 1280;
168-
ci_msg.distortion_model = "plumb_bob";
169-
ci_msg.D = distortion_coeff_vec_[j];
170-
ci_msg.binning_x = binning_;
171-
ci_msg.binning_y = binning_;
172+
sensor_msgs::CameraInfoPtr ci_msg(new sensor_msgs::CameraInfo());
173+
ci_msg->height = 1024;
174+
ci_msg->width = 1280;
175+
ci_msg->distortion_model = "plumb_bob";
176+
ci_msg->D = distortion_coeff_vec_[j];
177+
ci_msg->binning_x = binning_;
178+
ci_msg->binning_y = binning_;
172179
for (int count = 0; count<intrinsic_coeff_vec_[j].size();count++)
173-
ci_msg.K[count] = intrinsic_coeff_vec_[j][count];
174-
ci_msg.header.frame_id = "cam_"+to_string(j)+"_optical_frame";
175-
ci_msg.P = {intrinsic_coeff_vec_[j][0], intrinsic_coeff_vec_[j][1],intrinsic_coeff_vec_[j][2], 0,
176-
intrinsic_coeff_vec_[j][3],intrinsic_coeff_vec_[j][4],intrinsic_coeff_vec_[j][5],0,
177-
intrinsic_coeff_vec_[j][6],intrinsic_coeff_vec_[j][7],intrinsic_coeff_vec_[j][8],0};
178-
180+
ci_msg->K[count] = intrinsic_coeff_vec_[j][count];
181+
ci_msg->header.frame_id = "cam_"+to_string(j)+"_optical_frame";
182+
ci_msg->P = {intrinsic_coeff_vec_[j][0], intrinsic_coeff_vec_[j][1], intrinsic_coeff_vec_[j][2], 0,
183+
intrinsic_coeff_vec_[j][3], intrinsic_coeff_vec_[j][4], intrinsic_coeff_vec_[j][5], 0,
184+
intrinsic_coeff_vec_[j][6], intrinsic_coeff_vec_[j][7], intrinsic_coeff_vec_[j][8], 0};
179185
cam_info_msgs.push_back(ci_msg);
180186
}
181187
cam_counter++;
@@ -390,8 +396,8 @@ void acquisition::Capture::read_parameters() {
390396
PUBLISH_CAM_INFO_ = intrinsics_list_provided && distort_list_provided;
391397
if (PUBLISH_CAM_INFO_)
392398
ROS_INFO(" Camera coeffs provided, camera info messges will be published.");
393-
else
394-
ROS_INFO(" Camera coeffs not provided correctly, camera info messges will not be published.");
399+
else
400+
ROS_INFO(" Camera coeffs not provided correctly, camera info messges will not be published.");
395401

396402
// ROS_ASSERT_MSG(my_list.getType()
397403
// int num_ids = cam_id_vec.size();
@@ -599,15 +605,19 @@ void acquisition::Capture::export_to_ROS() {
599605

600606
if(color_)
601607
img_msgs[i]=cv_bridge::CvImage(img_msg_header, "bgr8", frames_[i]).toImageMsg();
602-
else
603-
img_msgs[i]=cv_bridge::CvImage(img_msg_header, "mono8", frames_[i]).toImageMsg();
604-
605-
camera_image_pubs[i].publish(img_msgs[i]);
608+
else
609+
img_msgs[i]=cv_bridge::CvImage(img_msg_header, "mono8", frames_[i]).toImageMsg();
606610

611+
if (PUBLISH_CAM_INFO_){
612+
cam_info_msgs[i]->header.stamp = mesg.header.stamp;
613+
}
614+
camera_image_pubs[i].publish(img_msgs[i],cam_info_msgs[i]);
615+
/*
607616
if (PUBLISH_CAM_INFO_){
608617
cam_info_msgs[i].header.stamp = mesg.header.stamp;
609618
camera_info_pubs[i].publish(cam_info_msgs[i]);
610619
}
620+
*/
611621
}
612622
export_to_ROS_time_ = ros::Time::now().toSec()-t;;
613623
}
@@ -767,7 +777,7 @@ void acquisition::Capture::run_soft_trig() {
767777
}
768778

769779
double disp_time_ = ros::Time::now().toSec() - t;
770-
780+
771781
// Call update functions
772782
if (!MANUAL_TRIGGER_) {
773783
cams[MASTER_CAM_].trigger();
@@ -792,7 +802,7 @@ void acquisition::Capture::run_soft_trig() {
792802
}
793803

794804
if (EXPORT_TO_ROS_) export_to_ROS();
795-
805+
//cams[MASTER_CAM_].targetGreyValueTest();
796806
// ros publishing messages
797807
acquisition_pub.publish(mesg);
798808

@@ -1008,3 +1018,20 @@ std::string acquisition::Capture::todays_date()
10081018
std::string td(out);
10091019
return td;
10101020
}
1021+
1022+
void acquisition::Capture::dynamicReconfigureCallback(spinnaker_sdk_camera_driver::spinnaker_camConfig &config, uint32_t level){
1023+
ROS_INFO_STREAM("Dynamic Reconfigure: Target grey value : " << config.target_grey_val <<"Exposure "<<config.exposure_time);
1024+
ROS_INFO_STREAM("Dynamic Reconfigure: Level : " << level);
1025+
1026+
if(level == 1){
1027+
cams[MASTER_CAM_].setEnumValue("AutoExposureTargetGreyValueAuto", "Off");
1028+
cams[MASTER_CAM_].setFloatValue("AutoExposureTargetGreyValue", config.target_grey_val);
1029+
}
1030+
else if (level == 3 && config.exposure_time > 0){
1031+
cams[MASTER_CAM_].setEnumValue("ExposureAuto", "Off");
1032+
cams[MASTER_CAM_].setEnumValue("ExposureMode", "Timed");
1033+
cams[MASTER_CAM_].setFloatValue("ExposureTime", config.exposure_time);
1034+
}
1035+
1036+
1037+
}

0 commit comments

Comments
 (0)