virtual void onInit() { ros::NodeHandle& nh = getNodeHandle(); ros::NodeHandle& pnh = getPrivateNodeHandle(); ros::NodeHandle left_nh(nh, "left"); ros::NodeHandle right_nh(nh, "right"); ros::NodeHandle left_pnh(pnh, "left"); ros::NodeHandle right_pnh(pnh, "right"); image_transport::ImageTransport left_it(left_nh); image_transport::ImageTransport right_it(right_nh); image_transport::TransportHints hintsLeft("raw", ros::TransportHints(), left_pnh); image_transport::TransportHints hintsRight("raw", ros::TransportHints(), right_pnh); int queueSize = 5; bool approxSync = false; pnh.param("approx_sync", approxSync, approxSync); pnh.param("rate", max_update_rate_, max_update_rate_); pnh.param("queue_size", queueSize, queueSize); ROS_INFO("Approximate time sync = %s", approxSync?"true":"false"); if(max_update_rate_ == 0.0) { ROS_WARN("Parameter \"rate\" (Hz) is not set!"); } if(approxSync) { approxSync_ = new message_filters::Synchronizer<MyApproxSyncPolicy>(MyApproxSyncPolicy(queueSize), imageLeft_, imageRight_, cameraInfoLeft_, cameraInfoRight_); approxSync_->registerCallback(boost::bind(&StereoThrottleNodelet::callback, this, _1, _2, _3, _4)); } else { exactSync_ = new message_filters::Synchronizer<MyExactSyncPolicy>(MyExactSyncPolicy(queueSize), imageLeft_, imageRight_, cameraInfoLeft_, cameraInfoRight_); exactSync_->registerCallback(boost::bind(&StereoThrottleNodelet::callback, this, _1, _2, _3, _4)); } imageLeft_.subscribe(left_it, left_nh.resolveName("image"), 1, hintsLeft); imageRight_.subscribe(right_it, right_nh.resolveName("image"), 1, hintsRight); cameraInfoLeft_.subscribe(left_nh, "camera_info", 1); cameraInfoRight_.subscribe(right_nh, "camera_info", 1); imageLeftPub_ = left_it.advertise(left_nh.resolveName("image")+"_throttle", 1); imageRightPub_ = right_it.advertise(right_nh.resolveName("image")+"_throttle", 1); infoLeftPub_ = left_nh.advertise<sensor_msgs::CameraInfo>(left_nh.resolveName("camera_info")+"_throttle", 1); infoRightPub_ = right_nh.advertise<sensor_msgs::CameraInfo>(right_nh.resolveName("camera_info")+"_throttle", 1); };
int main(int argc, char** argv) { ULogger::setType(ULogger::kTypeConsole); ULogger::setLevel(ULogger::kInfo); ros::init(argc, argv, "uvc_stereo_camera"); ros::NodeHandle pnh("~"); double rate = 0.0; std::string id = "camera"; std::string frameId = "camera_link"; double scale = 1.0; pnh.param("rate", rate, rate); pnh.param("camera_id", id, id); pnh.param("frame_id", frameId, frameId); pnh.param("scale", scale, scale); rtabmap::CameraStereoVideo camera(0, false, rate); if(camera.init(UDirectory::homeDir() + "/.ros/camera_info", id)) { ros::NodeHandle nh; ros::NodeHandle left_nh(nh, "left"); ros::NodeHandle right_nh(nh, "right"); image_transport::ImageTransport left_it(left_nh); image_transport::ImageTransport right_it(right_nh); image_transport::Publisher imageLeftPub = left_it.advertise(left_nh.resolveName("image_raw"), 1); image_transport::Publisher imageRightPub = right_it.advertise(right_nh.resolveName("image_raw"), 1); ros::Publisher infoLeftPub = left_nh.advertise<sensor_msgs::CameraInfo>(left_nh.resolveName("camera_info"), 1); ros::Publisher infoRightPub = right_nh.advertise<sensor_msgs::CameraInfo>(right_nh.resolveName("camera_info"), 1); while(ros::ok()) { rtabmap::SensorData data = camera.takeImage(); ros::Time currentTime = ros::Time::now(); cv_bridge::CvImage imageLeft; imageLeft.header.frame_id = frameId; imageLeft.header.stamp = currentTime; imageLeft.encoding = "bgr8"; cv::resize(data.imageRaw(), imageLeft.image, cv::Size(0,0), scale, scale, CV_INTER_AREA); imageLeftPub.publish(imageLeft.toImageMsg()); cv_bridge::CvImage imageRight; imageRight.header = imageLeft.header; imageRight.encoding = "mono8"; cv::resize(data.rightRaw(), imageRight.image, cv::Size(0,0), scale, scale, CV_INTER_AREA); imageRightPub.publish(imageRight.toImageMsg()); sensor_msgs::CameraInfo infoLeft, infoRight; rtabmap_ros::cameraModelToROS(data.stereoCameraModel().left().scaled(scale), infoLeft); rtabmap_ros::cameraModelToROS(data.stereoCameraModel().right().scaled(scale), infoRight); infoLeft.header = imageLeft.header; infoRight.header = imageLeft.header; infoLeftPub.publish(infoLeft); infoRightPub.publish(infoRight); ros::spinOnce(); } } else { ROS_ERROR("Could not initialize the camera!"); } return 0; }