Skip to content

Commit 636f019

Browse files
authored
Fix timestamp (#570)
* Fix IMU link * IMU link published even if `publish_tf` and `publish_map_tf` are set to `false` * Minor fix * Improve MR #557 about problems with timestamp coherency * Update changelog
1 parent 98702be commit 636f019

File tree

4 files changed

+56
-39
lines changed

4 files changed

+56
-39
lines changed

latest_changes.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
LATEST CHANGES
22
==============
33

4+
Timestamp fix (2020-06-03)
5+
--------------------------
6+
- Fix timestamp update coherency due to parallel threads. Thanks to @matlabbe
7+
48
IMU fix (2020-05-24)
59
--------------------
610
- Fix issue with IMU frame link when `publish_tf` and `publish_map_tf` are disabled

zed_nodelets/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ catkin_package(
7474
zed_interfaces
7575
)
7676

77+
7778
###############################################################################
7879
# SOURCES
7980

zed_nodelets/src/zed_nodelet/include/zed_wrapper_nodelet.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,7 @@ class ZEDWrapperNodelet : public nodelet::Nodelet {
367367

368368
/* \brief Perform object detection and publish result
369369
*/
370-
void detectObjects(bool publishObj, bool publishViz);
370+
void detectObjects(bool publishObj, bool publishViz, ros::Time t);
371371

372372
/* \brief Generates an univoque color for each object class ID
373373
*/

zed_nodelets/src/zed_nodelet/src/zed_wrapper_nodelet.cpp

Lines changed: 50 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -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

22472253
void 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

Comments
 (0)