@@ -1505,7 +1505,7 @@ void ZEDWrapperNodelet::publishPose(ros::Time t) {
15051505 }
15061506
15071507 std_msgs::Header header;
1508- header.stamp = mFrameTimestamp ;
1508+ header.stamp = t ;
15091509 header.frame_id = mMapFrameId ;
15101510 geometry_msgs::Pose pose;
15111511
@@ -1813,7 +1813,7 @@ void ZEDWrapperNodelet::pubFusedPointCloudCallback(const ros::TimerEvent& e) {
18131813 return ;
18141814 }
18151815
1816- pointcloudFusedMsg->header .stamp = mFrameTimestamp ;
1816+ // pointcloudFusedMsg->header.stamp = t ;
18171817 mZed .requestSpatialMapAsync ();
18181818
18191819 while (mZed .getSpatialMapRequestStatusAsync () == sl::ERROR_CODE::FAILURE) {
@@ -1833,7 +1833,7 @@ void ZEDWrapperNodelet::pubFusedPointCloudCallback(const ros::TimerEvent& e) {
18331833
18341834 if (pointcloudFusedMsg->width != ptsCount || pointcloudFusedMsg->height != 1 ) {
18351835 // Initialize Point Cloud message
1836- // https://github.com/ros/common_msgs/blob/jade-devel/sensor_msgs/include/sensor_msgs/point_cloud2_iterator.h
1836+ // https://github.com/ros/common_msgs/blob/jade-devel/sensor_msgs/include/sensor_msgs/point_cloud2_iterator.h
18371837 pointcloudFusedMsg->header .frame_id = mMapFrameId ; // Set the header values of the ROS message
18381838 pointcloudFusedMsg->is_bigendian = false ;
18391839 pointcloudFusedMsg->is_dense = false ;
@@ -1854,12 +1854,15 @@ void ZEDWrapperNodelet::pubFusedPointCloudCallback(const ros::TimerEvent& e) {
18541854
18551855 // NODELET_INFO_STREAM("Chunks: " << mFusedPC.chunks.size());
18561856
1857+
1858+
18571859 int index = 0 ;
18581860 float * ptCloudPtr = (float *)(&pointcloudFusedMsg->data [0 ]);
18591861 int updated = 0 ;
18601862
18611863 for (int c = 0 ; c < mFusedPC .chunks .size (); c++) {
18621864 if (mFusedPC .chunks [c].has_been_updated || resized) {
1865+
18631866 updated++;
18641867
18651868 size_t chunkSize = mFusedPC .chunks [c].vertices .size ();
@@ -1871,6 +1874,8 @@ void ZEDWrapperNodelet::pubFusedPointCloudCallback(const ros::TimerEvent& e) {
18711874 memcpy (ptCloudPtr, cloud_pts, 4 * chunkSize * sizeof (float ));
18721875
18731876 ptCloudPtr += 4 * chunkSize;
1877+
1878+ pointcloudFusedMsg->header .stamp = sl_tools::slTime2Ros (mFusedPC .chunks [c].timestamp );
18741879 }
18751880
18761881 } else {
@@ -1971,6 +1976,7 @@ void ZEDWrapperNodelet::fillCamInfo(sl::Camera& zed, sensor_msgs::CameraInfoPtr
19711976#else
19721977 if (rawParam) {
19731978 if (mUseOldExtrinsic ) { // Camera frame (Z forward, Y down, X right)
1979+
19741980 std::vector<float > R_ = sl_tools::convertRodrigues (zedParam.R );
19751981 float * p = R_.data ();
19761982
@@ -2245,7 +2251,7 @@ void ZEDWrapperNodelet::dynamicReconfCallback(zed_nodelets::ZedConfig& config, u
22452251}
22462252
22472253void ZEDWrapperNodelet::pubVideoDepthCallback (const ros::TimerEvent& e) {
2248- static sl::Timestamp lastTs = 0 ;
2254+ static sl::Timestamp lastZedTs = 0 ; // Used to calculate stable publish frequency
22492255
22502256 uint32_t rgbSubnumber = mPubRgb .getNumSubscribers ();
22512257 uint32_t rgbRawSubnumber = mPubRawRgb .getNumSubscribers ();
@@ -2275,7 +2281,7 @@ void ZEDWrapperNodelet::pubVideoDepthCallback(const ros::TimerEvent& e) {
22752281 stereoSubNumber+stereoRawSubNumber == 0 ) {
22762282
22772283 mPublishingData = false ;
2278- lastTs = 0 ;
2284+ lastZedTs = 0 ;
22792285 return ;
22802286 }
22812287
@@ -2284,35 +2290,36 @@ void ZEDWrapperNodelet::pubVideoDepthCallback(const ros::TimerEvent& e) {
22842290 sl::Mat leftZEDMat, rightZEDMat, leftGrayZEDMat, rightGrayZEDMat,
22852291 depthZEDMat, disparityZEDMat, confMapZEDMat;
22862292
2287-
2288-
22892293 // Retrieve RGBA Left image and use Timestamp to check if image is new
22902294 mZed .retrieveImage (leftZEDMat, sl::VIEW::LEFT, sl::MEM::CPU, mMatResolVideo );
2291- if (leftZEDMat.timestamp ==lastTs ) {
2295+ if (leftZEDMat.timestamp ==lastZedTs ) {
22922296 return ; // No new image!
22932297 }
2294- if (lastTs .data_ns !=0 ) {
2295- double period_sec = static_cast <double >(leftZEDMat.timestamp .data_ns - lastTs .data_ns )/1e9 ;
2298+ if (lastZedTs .data_ns !=0 ) {
2299+ double period_sec = static_cast <double >(leftZEDMat.timestamp .data_ns - lastZedTs .data_ns )/1e9 ;
22962300 // NODELET_DEBUG_STREAM( "PUBLISHING PERIOD: " << period_sec << " sec @" << 1./period_sec << " Hz") ;
22972301
22982302 mVideoDepthPeriodMean_sec ->addValue (period_sec);
22992303 // NODELET_DEBUG_STREAM( "MEAN PUBLISHING PERIOD: " << mVideoDepthPeriodMean_sec->getMean() << " sec @" << 1./mVideoDepthPeriodMean_sec->getMean() << " Hz") ;
23002304 }
2301- lastTs = leftZEDMat.timestamp ;
2305+ lastZedTs = leftZEDMat.timestamp ;
2306+
2307+ // Timestamp to be used for topics headers
2308+ ros::Time stamp = mFrameTimestamp ;
23022309
23032310 // Publish the left == rgb image if someone has subscribed to
23042311 if (leftSubnumber > 0 || rgbSubnumber > 0 ) {
23052312 if (leftSubnumber > 0 ) {
23062313 sensor_msgs::ImagePtr leftImgMsg = boost::make_shared<sensor_msgs::Image>();
23072314
2308- publishImage (leftImgMsg, leftZEDMat, mPubLeft , mLeftCamInfoMsg , mLeftCamOptFrameId , mFrameTimestamp );
2315+ publishImage (leftImgMsg, leftZEDMat, mPubLeft , mLeftCamInfoMsg , mLeftCamOptFrameId , stamp );
23092316 }
23102317
23112318 if (rgbSubnumber > 0 ) {
23122319 sensor_msgs::ImagePtr rgbImgMsg = boost::make_shared<sensor_msgs::Image>();
23132320
23142321 // rgb is the left image
2315- publishImage (rgbImgMsg, leftZEDMat, mPubRgb , mRgbCamInfoMsg , mDepthOptFrameId , mFrameTimestamp );
2322+ publishImage (rgbImgMsg, leftZEDMat, mPubRgb , mRgbCamInfoMsg , mDepthOptFrameId , stamp );
23162323
23172324 }
23182325 }
@@ -2327,14 +2334,14 @@ void ZEDWrapperNodelet::pubVideoDepthCallback(const ros::TimerEvent& e) {
23272334 sensor_msgs::ImagePtr leftGrayImgMsg = boost::make_shared<sensor_msgs::Image>();
23282335
23292336 publishImage (leftGrayImgMsg, leftGrayZEDMat, mPubLeftGray , mLeftCamInfoMsg , mLeftCamOptFrameId ,
2330- mFrameTimestamp );
2337+ stamp );
23312338 }
23322339
23332340 if (rgbGraySubnumber > 0 ) {
23342341 sensor_msgs::ImagePtr rgbGrayImgMsg = boost::make_shared<sensor_msgs::Image>();
23352342
23362343 publishImage (rgbGrayImgMsg, leftGrayZEDMat, mPubRgbGray , mRgbCamInfoMsg , mDepthOptFrameId ,
2337- mFrameTimestamp ); // rgb is the left image
2344+ stamp ); // rgb is the left image
23382345 }
23392346 }
23402347
@@ -2348,14 +2355,14 @@ void ZEDWrapperNodelet::pubVideoDepthCallback(const ros::TimerEvent& e) {
23482355 sensor_msgs::ImagePtr rawLeftImgMsg = boost::make_shared<sensor_msgs::Image>();
23492356
23502357 publishImage (rawLeftImgMsg, leftZEDMat, mPubRawLeft , mLeftCamInfoRawMsg , mLeftCamOptFrameId ,
2351- mFrameTimestamp );
2358+ stamp );
23522359 }
23532360
23542361 if (rgbRawSubnumber > 0 ) {
23552362 sensor_msgs::ImagePtr rawRgbImgMsg = boost::make_shared<sensor_msgs::Image>();
23562363
23572364 publishImage (rawRgbImgMsg, leftZEDMat, mPubRawRgb , mRgbCamInfoRawMsg , mDepthOptFrameId ,
2358- mFrameTimestamp );
2365+ stamp );
23592366 }
23602367 }
23612368
@@ -2369,14 +2376,14 @@ void ZEDWrapperNodelet::pubVideoDepthCallback(const ros::TimerEvent& e) {
23692376 sensor_msgs::ImagePtr rawLeftGrayImgMsg = boost::make_shared<sensor_msgs::Image>();
23702377
23712378 publishImage (rawLeftGrayImgMsg, leftGrayZEDMat, mPubRawLeftGray , mLeftCamInfoRawMsg , mLeftCamOptFrameId ,
2372- mFrameTimestamp );
2379+ stamp );
23732380 }
23742381
23752382 if (rgbGrayRawSubnumber > 0 ) {
23762383 sensor_msgs::ImagePtr rawRgbGrayImgMsg = boost::make_shared<sensor_msgs::Image>();
23772384
23782385 publishImage (rawRgbGrayImgMsg, leftGrayZEDMat, mPubRawRgbGray , mRgbCamInfoRawMsg , mDepthOptFrameId ,
2379- mFrameTimestamp );
2386+ stamp );
23802387 }
23812388 }
23822389
@@ -2388,7 +2395,7 @@ void ZEDWrapperNodelet::pubVideoDepthCallback(const ros::TimerEvent& e) {
23882395
23892396 sensor_msgs::ImagePtr rightImgMsg = boost::make_shared<sensor_msgs::Image>();
23902397
2391- publishImage (rightImgMsg, rightZEDMat, mPubRight , mRightCamInfoMsg , mRightCamOptFrameId , mFrameTimestamp );
2398+ publishImage (rightImgMsg, rightZEDMat, mPubRight , mRightCamInfoMsg , mRightCamOptFrameId , stamp );
23922399 }
23932400
23942401 // Publish the right image GRAY if someone has subscribed to
@@ -2398,7 +2405,7 @@ void ZEDWrapperNodelet::pubVideoDepthCallback(const ros::TimerEvent& e) {
23982405 mZed .retrieveImage (rightGrayZEDMat, sl::VIEW::RIGHT_GRAY, sl::MEM::CPU, mMatResolVideo );
23992406 sensor_msgs::ImagePtr rightGrayImgMsg = boost::make_shared<sensor_msgs::Image>();
24002407
2401- publishImage (rightGrayImgMsg, rightGrayZEDMat, mPubRightGray , mRightCamInfoMsg , mRightCamOptFrameId , mFrameTimestamp );
2408+ publishImage (rightGrayImgMsg, rightGrayZEDMat, mPubRightGray , mRightCamInfoMsg , mRightCamOptFrameId , stamp );
24022409 }
24032410
24042411 // Publish the right raw image if someone has subscribed to
@@ -2409,7 +2416,7 @@ void ZEDWrapperNodelet::pubVideoDepthCallback(const ros::TimerEvent& e) {
24092416
24102417 sensor_msgs::ImagePtr rawRightImgMsg = boost::make_shared<sensor_msgs::Image>();
24112418
2412- publishImage (rawRightImgMsg, rightZEDMat, mPubRawRight , mRightCamInfoRawMsg , mRightCamOptFrameId , mFrameTimestamp );
2419+ publishImage (rawRightImgMsg, rightZEDMat, mPubRawRight , mRightCamInfoRawMsg , mRightCamOptFrameId , stamp );
24132420 }
24142421
24152422 // Publish the right raw image GRAY if someone has subscribed to
@@ -2419,7 +2426,7 @@ void ZEDWrapperNodelet::pubVideoDepthCallback(const ros::TimerEvent& e) {
24192426
24202427 sensor_msgs::ImagePtr rawRightGrayImgMsg = boost::make_shared<sensor_msgs::Image>();
24212428
2422- publishImage (rawRightGrayImgMsg, rightGrayZEDMat, mPubRawRightGray , mRightCamInfoRawMsg , mRightCamOptFrameId , mFrameTimestamp );
2429+ publishImage (rawRightGrayImgMsg, rightGrayZEDMat, mPubRawRightGray , mRightCamInfoRawMsg , mRightCamOptFrameId , stamp );
24232430 }
24242431
24252432 // Stereo couple side-by-side
@@ -2431,7 +2438,7 @@ void ZEDWrapperNodelet::pubVideoDepthCallback(const ros::TimerEvent& e) {
24312438
24322439 sensor_msgs::ImagePtr stereoImgMsg = boost::make_shared<sensor_msgs::Image>();
24332440
2434- sl_tools::imagesToROSmsg (stereoImgMsg, leftZEDMat, rightZEDMat, mCameraFrameId , mFrameTimestamp );
2441+ sl_tools::imagesToROSmsg (stereoImgMsg, leftZEDMat, rightZEDMat, mCameraFrameId , stamp );
24352442
24362443 mPubStereo .publish (stereoImgMsg);
24372444 }
@@ -2445,7 +2452,7 @@ void ZEDWrapperNodelet::pubVideoDepthCallback(const ros::TimerEvent& e) {
24452452
24462453 sensor_msgs::ImagePtr rawStereoImgMsg = boost::make_shared<sensor_msgs::Image>();
24472454
2448- sl_tools::imagesToROSmsg (rawStereoImgMsg, leftZEDMat, rightZEDMat, mCameraFrameId , mFrameTimestamp );
2455+ sl_tools::imagesToROSmsg (rawStereoImgMsg, leftZEDMat, rightZEDMat, mCameraFrameId , stamp );
24492456
24502457 mPubRawStereo .publish (rawStereoImgMsg);
24512458 }
@@ -2457,14 +2464,14 @@ void ZEDWrapperNodelet::pubVideoDepthCallback(const ros::TimerEvent& e) {
24572464
24582465 sensor_msgs::ImagePtr depthImgMsg = boost::make_shared<sensor_msgs::Image>();
24592466
2460- publishDepth (depthImgMsg, depthZEDMat, mFrameTimestamp ); // in meters
2467+ publishDepth (depthImgMsg, depthZEDMat, stamp ); // in meters
24612468 }
24622469
24632470 // Publish the disparity image if someone has subscribed to
24642471 if (disparitySubnumber > 0 ) {
24652472
24662473 mZed .retrieveMeasure (disparityZEDMat, sl::MEASURE::DISPARITY, sl::MEM::CPU, mMatResolDepth );
2467- publishDisparity (disparityZEDMat, mFrameTimestamp );
2474+ publishDisparity (disparityZEDMat, stamp );
24682475 }
24692476
24702477 // Publish the confidence map if someone has subscribed to
@@ -2474,7 +2481,7 @@ void ZEDWrapperNodelet::pubVideoDepthCallback(const ros::TimerEvent& e) {
24742481
24752482 sensor_msgs::ImagePtr confMapMsg = boost::make_shared<sensor_msgs::Image>();
24762483
2477- sl_tools::imageToROSmsg (confMapMsg, confMapZEDMat, mConfidenceOptFrameId , mFrameTimestamp );
2484+ sl_tools::imageToROSmsg (confMapMsg, confMapZEDMat, mConfidenceOptFrameId , stamp );
24782485
24792486 mPubConfMap .publish (confMapMsg);
24802487 }
@@ -2813,7 +2820,7 @@ void ZEDWrapperNodelet::pubSensCallback(const ros::TimerEvent& e) {
28132820 if (imu_RawSubNumber > 0 ) {
28142821 sensor_msgs::ImuPtr imuRawMsg = boost::make_shared<sensor_msgs::Imu>();
28152822
2816- imuRawMsg->header .stamp = ts_imu; // t;
2823+ imuRawMsg->header .stamp = ts_imu;
28172824 imuRawMsg->header .frame_id = mImuFrameId ;
28182825 imuRawMsg->angular_velocity .x = sens_data.imu .angular_velocity [0 ] * DEG2RAD;
28192826 imuRawMsg->angular_velocity .y = sens_data.imu .angular_velocity [1 ] * DEG2RAD;
@@ -3038,7 +3045,11 @@ void ZEDWrapperNodelet::device_poll_thread_func() {
30383045
30393046 if (mComputeDepth ) {
30403047 runParams.confidence_threshold = mCamDepthConfidence ;
3048+ #if ZED_SDK_MAJOR_VERSION==3 && ZED_SDK_MINOR_VERSION<2
30413049 runParams.textureness_confidence_threshold = mCamDepthTextureConf ;
3050+ #else
3051+ runParams.texture_confidence_threshold = mCamDepthTextureConf ;
3052+ #endif
30423053 runParams.enable_depth = true ; // Ask to compute the depth
30433054 } else {
30443055 runParams.enable_depth = false ; // Ask to not compute the depth
@@ -3148,6 +3159,8 @@ void ZEDWrapperNodelet::device_poll_thread_func() {
31483159 mFrameTimestamp = sl_tools::slTime2Ros (mZed .getTimestamp (sl::TIME_REFERENCE::IMAGE));
31493160 }
31503161
3162+ ros::Time stamp = mFrameTimestamp ; // Timestamp
3163+
31513164 // ----> Camera Settings
31523165 if ( !mSvoMode && mFrameCount %5 == 0 ) {
31533166 // NODELET_DEBUG_STREAM( "[" << mFrameCount << "] device_poll_thread_func MUTEX LOCK");
@@ -3255,7 +3268,7 @@ void ZEDWrapperNodelet::device_poll_thread_func() {
32553268 mZed .retrieveMeasure (mCloud , sl::MEASURE::XYZBGRA, sl::MEM::CPU, mMatResolDepth );
32563269
32573270 mPointCloudFrameId = mDepthFrameId ;
3258- mPointCloudTime = mFrameTimestamp ;
3271+ mPointCloudTime = stamp ;
32593272
32603273 // Signal Pointcloud thread that a new pointcloud is ready
32613274 mPcDataReadyCondVar .notify_one ();
@@ -3270,7 +3283,7 @@ void ZEDWrapperNodelet::device_poll_thread_func() {
32703283 mObjDetMutex .lock ();
32713284 if (mObjDetRunning ) {
32723285 std::chrono::steady_clock::time_point start = std::chrono::steady_clock::now ();
3273- detectObjects (objDetSubnumber > 0 , objDetVizSubnumber > 0 );
3286+ detectObjects (objDetSubnumber > 0 , objDetVizSubnumber > 0 , stamp );
32743287 std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now ();
32753288
32763289 double elapsed_msec = std::chrono::duration_cast<std::chrono::milliseconds>(now - start).count ();
@@ -3355,7 +3368,7 @@ void ZEDWrapperNodelet::device_poll_thread_func() {
33553368
33563369 // Publish odometry message
33573370 if (odomSubnumber > 0 ) {
3358- publishOdom (mOdom2BaseTransf , deltaOdom, mFrameTimestamp );
3371+ publishOdom (mOdom2BaseTransf , deltaOdom, stamp );
33593372 }
33603373
33613374 mTrackingReady = true ;
@@ -3469,7 +3482,7 @@ void ZEDWrapperNodelet::device_poll_thread_func() {
34693482
34703483 // Publish Pose message
34713484 if ((poseSubnumber + poseCovSubnumber) > 0 ) {
3472- publishPose (mFrameTimestamp );
3485+ publishPose (stamp );
34733486 }
34743487
34753488 mTrackingReady = true ;
@@ -3482,12 +3495,12 @@ void ZEDWrapperNodelet::device_poll_thread_func() {
34823495 if (mPublishTf ) {
34833496 // Note, the frame is published, but its values will only change if
34843497 // someone has subscribed to odom
3485- publishOdomFrame (mOdom2BaseTransf , mFrameTimestamp ); // publish the base Frame in odometry frame
3498+ publishOdomFrame (mOdom2BaseTransf , stamp ); // publish the base Frame in odometry frame
34863499
34873500 if (mPublishMapTf ) {
34883501 // Note, the frame is published, but its values will only change if
34893502 // someone has subscribed to map
3490- publishPoseFrame (mMap2OdomTransf , mFrameTimestamp ); // publish the odometry Frame in map frame
3503+ publishPoseFrame (mMap2OdomTransf , stamp ); // publish the odometry Frame in map frame
34913504 }
34923505 }
34933506
@@ -3982,7 +3995,7 @@ bool ZEDWrapperNodelet::on_stop_object_detection(zed_interfaces::stop_object_det
39823995 return res.done ;
39833996}
39843997
3985- void ZEDWrapperNodelet::detectObjects (bool publishObj, bool publishViz) {
3998+ void ZEDWrapperNodelet::detectObjects (bool publishObj, bool publishViz, ros::Time t ) {
39863999
39874000 sl::ObjectDetectionRuntimeParameters objectTracker_parameters_rt;
39884001 objectTracker_parameters_rt.detection_confidence_threshold = mObjDetConfidence ;
@@ -4007,8 +4020,7 @@ void ZEDWrapperNodelet::detectObjects(bool publishObj, bool publishViz) {
40074020 objMsg.objects .resize (objCount);
40084021
40094022 std_msgs::Header header;
4010- header.stamp = mFrameTimestamp ;
4011- // header.frame_id = mCameraFrameId;
4023+ header.stamp = t;
40124024 header.frame_id = mLeftCamFrameId ;
40134025
40144026 visualization_msgs::MarkerArray objMarkersMsg;
0 commit comments