44 dc1394_capture_stop(t_dc1394.camera);
46 ROS_WARN(
"stopping camera capture\n");
48 dc1394_video_set_transmission(t_dc1394.camera, DC1394_OFF );
50 dc1394_camera_free( t_dc1394.camera );
66 signal(SIGSEGV, SIG_DFL);
68 ROS_WARN(
"System segfaulted");
77 ROS_WARN(
"Ctrl-c pressed");
98 dc1394camera_list_t * list;
105 err = dc1394_camera_enumerate (d, &list);
107 if ( err != DC1394_SUCCESS )
109 fprintf( stderr,
"Unable to look for cameras\n\n"
111 " - if the kernel modules `ieee1394',`raw1394' and `ohci1394' are loaded \n"
112 " - if you have read/write access to /dev/raw1394\n\n");
119 fprintf( stderr,
"No cameras found!\n");
clean_dc1394();
122 printf(
"There were %d camera(s) found attached to your PC\n", list->num );
125 for ( nThisCam = 0; nThisCam < list->num; nThisCam++ )
127 *camera = dc1394_camera_new(d, list->ids[nThisCam].guid);
131 printf(
"Failed to initialize camera with guid %llx", list->ids[nThisCam].guid);
135 printf(
"Camera %d model = '%s'\n", nThisCam, (*camera)->model );
140 printf(
"Using this camera\n" );
144 dc1394_camera_free(*camera);
147 if ( nThisCam == list->num )
149 printf(
"No stereo cameras were detected\n" );
156 if ( err != DC1394_SUCCESS )
158 fprintf( stderr,
"Cannot query all information from camera\n" );
164 fprintf( stderr,
"Stereo camera found was not a BB XB3\n" );
171 stereoCamera->
nRows = 960;
172 stereoCamera->
nCols = 1280;
175 printf(
"Setting stereo video capture mode\n" );
179 if ( err != DC1394_SUCCESS )
181 fprintf( stderr,
"Could not set up video capture mode\n" );
186 printf(
"Start transmission\n" );
188 if ( err != DC1394_SUCCESS )
190 fprintf( stderr,
"Unable to start camera iso transmission\n" );
206 unsigned char* ptr_left_buffers = Buffer;
207 unsigned char* ptr_center_buffer = Buffer + 3 * 1280*960;
208 unsigned char* ptr_right_buffers = Buffer + 6 * 1280*960;
211 unsigned char* ptr_left_cvMat = left.ptr<
unsigned char>(0);
212 unsigned char* ptr_center_cvMat = center.ptr<
unsigned char>(0);
213 unsigned char* ptr_right_cvMat = right.ptr<
unsigned char>(0);
217 for(
int c=0; c<1280;c++)
218 for (
int l=0; l<960; l++)
221 ptr_left_cvMat[count] = ptr_left_buffers[count+2];
222 ptr_left_cvMat[count+1] = ptr_left_buffers[count+1];
223 ptr_left_cvMat[count+2] = ptr_left_buffers[count];
225 ptr_center_cvMat[count] = ptr_center_buffer[count+2];
226 ptr_center_cvMat[count+1] = ptr_center_buffer[count+1];
227 ptr_center_cvMat[count+2] = ptr_center_buffer[count];
229 ptr_right_cvMat[count] = ptr_right_buffers[count+2];
230 ptr_right_cvMat[count+1] = ptr_right_buffers[count+1];
231 ptr_right_cvMat[count+2] = ptr_right_buffers[count];
248 msg->height = height;
250 msg->encoding = sensor_msgs::image_encodings::RGB8;
251 msg->is_bigendian = 0;
253 msg->data.resize(width*height*3);
254 msg->header.frame_id = frame_id;
267 info->height = height;
269 info->header.frame_id = frame_id;
270 info->roi.do_rectify =
true;
283 for(
int i=0; i<size; i+=3)
290 image->data[i] = in[i+2];
291 image->data[i+1] = in[i+1];
292 image->data[i+2] = in[i];
304 ROS_INFO(
"dynamic reconfigure1n");
309 int main(
int argc,
char **argv)
313 t_buffers.pucLeftRGB=NULL;
314 t_buffers.pucCenterRGB=NULL;
315 t_buffers.pucRightRGB=NULL;
318 ros::init(argc, argv,
"xb3", ros::init_options::NoSigintHandler | ros::init_options::AnonymousName);
328 if (nh.hasParam(
"width"))
330 nh.getParam(
"width", width);
334 ROS_ERROR(
"Set properly an image width value. (param= 'width') ");
339 if (nh.hasParam(
"height"))
341 nh.getParam(
"height", height);
345 ROS_ERROR(
"Set properly an image height value. (param= 'height') ");
350 set_fixed_camera_info(&t_msgs.short_left_info, height,width, (
char*)(ros::names::remap(
"/xb3_optical_frame")).c_str());
351 set_fixed_camera_info(&t_msgs.short_right_info, height,width, (
char*)(ros::names::remap(
"/xb3_optical_frame")).c_str());
352 set_fixed_camera_info(&t_msgs.wide_left_info, height,width, (
char*)(ros::names::remap(
"/xb3_optical_frame")).c_str());
353 set_fixed_camera_info(&t_msgs.wide_right_info, height,width, (
char*)(ros::names::remap(
"/xb3_optical_frame")).c_str());
356 set_fixed_fields_image_msg(&t_msgs.short_left, height,width, (
char*)
"RGB8", 0, (
char*)(ros::names::remap(
"/xb3_optical_frame")).c_str());
357 set_fixed_fields_image_msg(&t_msgs.short_right, height,width, (
char*)
"RGB8", 0, (
char*)(ros::names::remap(
"/xb3_optical_frame")).c_str());
358 set_fixed_fields_image_msg(&t_msgs.wide_left, height,width, (
char*)
"RGB8", 0, (
char*)(ros::names::remap(
"/xb3_optical_frame")).c_str());
359 set_fixed_fields_image_msg(&t_msgs.wide_right, height,width, (
char*)
"RGB8", 0, (
char*)(ros::names::remap(
"/xb3_optical_frame")).c_str());
362 image_transport::ImageTransport it(nh);
363 t_msgs.short_left_pub = it.advertiseCamera(
"short/left/image_raw", 1);
364 t_msgs.short_right_pub = it.advertiseCamera(
"short/right/image_raw", 1);
365 t_msgs.wide_left_pub = it.advertiseCamera(
"wide/left/image_raw", 1);
366 t_msgs.wide_right_pub = it.advertiseCamera(
"wide/right/image_raw", 1);
369 t_msgs.short_left_info_manager =
new camera_info_manager::CameraInfoManager(ros::NodeHandle(nh,
"short/left"),
"short/left",
"package://xb3/calibrations/short_left.yaml");
370 t_msgs.short_right_info_manager =
new camera_info_manager::CameraInfoManager(ros::NodeHandle(nh,
"short/right"),
"short/right",
"package://xb3/calibrations/short_right.yaml");
371 t_msgs.wide_left_info_manager =
new camera_info_manager::CameraInfoManager(ros::NodeHandle(nh,
"wide/left"),
"wide/left",
"package://xb3/calibrations/wide_left.yaml");
372 t_msgs.wide_right_info_manager =
new camera_info_manager::CameraInfoManager(ros::NodeHandle(nh,
"wide/right"),
"wide/right",
"package://xb3/calibrations/wide_right.yaml");
382 init_camera(t_dc1394.d, &t_dc1394.stereoCamera,&t_dc1394.camera, t_dc1394.nThisCam );
384 ROS_INFO(
"Connected to XB3 camera");
387 dc1394_feature_set_mode(t_dc1394.camera,DC1394_FEATURE_SHUTTER,DC1394_FEATURE_MODE_MANUAL);
388 dc1394_feature_set_value(t_dc1394.camera,DC1394_FEATURE_SHUTTER,100);
390 dc1394featureset_t features;
391 dc1394_feature_get_all(t_dc1394.camera,&features);
393 FILE *fd = fopen(
"/home/jorge/Desktop/conf.txt",
"w");
394 dc1394_feature_print_all(&features,fd);
399 t_buffers.nBufferSize = t_dc1394.stereoCamera.nRows * t_dc1394.stereoCamera.nCols * t_dc1394.stereoCamera.nBytesPerPixel;
400 t_buffers.pucDeInterlacedBuffer =
new unsigned char[ t_buffers.nBufferSize ];
401 t_buffers.pucRGBBuffer = NULL;
402 t_buffers.pucGreenBuffer = NULL;
404 t_imgs.left.create(cvSize(1280,960),CV_8UC3);
405 t_imgs.center.create(cvSize(1280,960),CV_8UC3);
406 t_imgs.right.create(cvSize(1280,960),CV_8UC3);
408 t_imgs.left_640_480.create(cvSize(width,height),CV_8UC3);
409 t_imgs.center_640_480.create(cvSize(width,height),CV_8UC3);
410 t_imgs.right_640_480.create(cvSize(width,height),CV_8UC3);
413 if ( t_dc1394.stereoCamera.bColor )
415 t_buffers.pucRGBBuffer =
new unsigned char[ 3 * t_buffers.nBufferSize ];
416 t_buffers.pucGreenBuffer =
new unsigned char[ t_buffers.nBufferSize ];
420 ROS_ERROR(
"This driver works only with color stereo cameras");
429 cvNamedWindow(
"left",CV_WINDOW_AUTOSIZE);
430 cvNamedWindow(
"center",CV_WINDOW_AUTOSIZE);
431 cvNamedWindow(
"right",CV_WINDOW_AUTOSIZE);
437 dynamic_reconfigure::Server<xb3::xb3Config> srv;
438 dynamic_reconfigure::Server<xb3::xb3Config>::CallbackType f;
442 static tf::TransformBroadcaster br;
443 tf::Transform transform;
444 transform.setOrigin( tf::Vector3(0,-1, 0.0) );
445 transform.setRotation( tf::Quaternion(0, 0, 0) );
447 cout<<
"tf broadcast"<<endl;
451 cout<<
"get images"<<endl;
453 extractImagesColorXB3( &t_dc1394.stereoCamera, DC1394_BAYER_METHOD_HQLINEAR, t_buffers.pucDeInterlacedBuffer, t_buffers.pucRGBBuffer, t_buffers.pucGreenBuffer, &t_buffers.pucRightRGB, &t_buffers.pucLeftRGB, &t_buffers.pucCenterRGB);
455 cout<<
"get current time"<<endl;
457 ros::Time stamp=ros::Time::now();
462 if (width==640 && height==480)
464 cv::pyrDown(t_imgs.left, t_imgs.left_640_480);
465 cv::pyrDown(t_imgs.right, t_imgs.right_640_480);
466 cv::pyrDown(t_imgs.center, t_imgs.center_640_480);
468 else if (width==1280 && height==960)
470 t_imgs.left_640_480=t_imgs.left;
471 t_imgs.right_640_480=t_imgs.right;
472 t_imgs.center_640_480=t_imgs.center;
475 cout<<
"copy and publish"<<endl;
493 t_msgs.short_left_info = t_msgs.short_left_info_manager->getCameraInfo();
494 t_msgs.short_right_info = t_msgs.short_right_info_manager->getCameraInfo();
496 t_msgs.wide_left_info = t_msgs.wide_left_info_manager->getCameraInfo();
497 t_msgs.wide_right_info = t_msgs.wide_right_info_manager->getCameraInfo();
499 t_msgs.short_left_info.header.frame_id = ros::names::remap(
"/xb3_optical_frame");
500 t_msgs.short_right_info.header.frame_id = ros::names::remap(
"/xb3_optical_frame");
501 t_msgs.wide_left_info.header.frame_id = ros::names::remap(
"/xb3_optical_frame");
502 t_msgs.wide_right_info.header.frame_id = ros::names::remap(
"/xb3_optical_frame");
504 t_msgs.short_left_pub.publish(t_msgs.short_left, t_msgs.short_left_info, stamp);
505 t_msgs.short_right_pub.publish(t_msgs.short_right, t_msgs.short_right_info, stamp);
506 t_msgs.wide_left_pub.publish(t_msgs.wide_left, t_msgs.wide_left_info, stamp);
507 t_msgs.wide_right_pub.publish(t_msgs.wide_right, t_msgs.wide_right_info, stamp);
509 cout<<
"published"<<endl;
512 cv::imshow(
"left",t_imgs.left_640_480);
513 cv::imshow(
"center",t_imgs.center_640_480);
514 cv::imshow(
"right",t_imgs.right_640_480);
523 char k=cvWaitKey(40);
bool isStereoCamera(dc1394camera_t *camera)
void copy_pixels_to_image_msg_data(unsigned char *in, sensor_msgs::Image *image, int size)
Copy image pixel data to ros sensor image message.
PGRStereoCameraModel_t model
void signal_handler(int sig)
signal handler function This handles with SIGINT and SIGSEGV signals
void reconfig(xb3::xb3Config &config, uint32_t level)
necessary function for dynamic_reconfigure (I guess :))
dc1394error_t startTransmission(PGRStereoCamera_t *stereoCamera)
int copy_img_buffer_to_cvMat(unsigned char *Buffer, cv::Mat left, cv::Mat center, cv::Mat right)
copy an unsigned char buffer to cv::Mat
int init_camera(dc1394_t *d, PGRStereoCamera_t *stereoCamera, dc1394camera_t **camera, unsigned int nThisCam)
initialize camera initializes camera with dc1394
dc1394error_t queryStereoCamera(dc1394camera_t *camera, PGRStereoCamera_t *stereoCamera)
Main header file for the xb3 module.
unsigned int nBytesPerPixel
void set_fixed_camera_info(sensor_msgs::CameraInfo *info, int height, int width, char *frame_id)
This function will set all the fixed parameters on image camera info messages.
void set_fixed_fields_image_msg(sensor_msgs::Image *msg, int height, int width, char *encoding, int is_bigendian, char *frame_id)
This function will set all the fixed parameters on image sensor messages.
void extractImagesColorXB3(PGRStereoCamera_t *stereoCamera, dc1394bayer_method_t bayerMethod, unsigned char *pucDeInterleaved, unsigned char *pucRGB, unsigned char *pucGreen, unsigned char **ppucRightRGB, unsigned char **ppucLeftRGB, unsigned char **ppucCenterRGB, TriclopsInput *pShortInput, TriclopsInput *pWideInput)
dc1394error_t setStereoVideoCapture(PGRStereoCamera_t *stereoCamera)
void clean_dc1394(void)
stop camera captur stops camera capture using dc1394
int main(int argc, char **argv)