Skip to content

Commit 2f039ea

Browse files
authored
Merge pull request #727 from stereolabs/dev_noetic
Dev noetic
2 parents 6c11b36 + 80f1c57 commit 2f039ea

File tree

11 files changed

+177
-41
lines changed

11 files changed

+177
-41
lines changed

README.md

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
![](./images/Picto+STEREOLABS_Black.jpg)
22

3-
# Stereolabs ZED Camera - ROS Integration
3+
# Stereolabs ZED Camera - ROS Noetic Ninjemis Integration
44

55
This package lets you use the ZED stereo camera with ROS. It outputs the camera left and right images, depth map, point cloud, pose information and supports the use of multiple ZED cameras.
66

@@ -14,11 +14,13 @@ This package lets you use the ZED stereo camera with ROS. It outputs the camera
1414

1515
### Prerequisites
1616

17-
- Ubuntu 16.04 or newer (Ubuntu 18 recommended)
18-
- [ZED SDK **≥ 3.0**](https://www.stereolabs.com/developers/) and its dependency [CUDA](https://developer.nvidia.com/cuda-downloads)
19-
- [ROS Kinetic](http://wiki.ros.org/kinetic/Installation/Ubuntu) or [ROS Melodic](http://wiki.ros.org/melodic/Installation/Ubuntu)
17+
- Ubuntu 20.04
18+
- [ZED SDK **≥ 3.5**](https://www.stereolabs.com/developers/) and its dependency [CUDA](https://developer.nvidia.com/cuda-downloads)
19+
- [ROS Noetic](http://wiki.ros.org/noetic/Installation/Ubuntu)
2020

21-
*Note:* an older version of the wrapper compatible with the **SDK v2.8.x** is available [here](https://github.com/stereolabs/zed-ros-wrapper/releases/tag/v2.x)
21+
- Ubuntu 18.04
22+
- [ZED SDK **≥ 3.5**](https://www.stereolabs.com/developers/) and its dependency [CUDA](https://developer.nvidia.com/cuda-downloads)
23+
- [ROS Melodic](http://wiki.ros.org/melodic/Installation/Ubuntu)
2224

2325
### Build the program
2426

latest_changes.md

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

4+
v3.5.x
5+
---------
6+
- Add support for ROS Noetic
7+
- Add support for SDK v3.5
8+
- Add support for the new ZED 2i
9+
- Add new parameter `pos_tracking/pos_tracking_enabled` to enable positional tracking from start even if not required by any subscribed topic. This is useful, for example, to keep the TF always updated.
10+
- Add new example to start multiple ZED Nodelets inside the same nodelet manager
11+
- Fixed issue #690
12+
413
v3.4.x
514
---------
615
- Add support for new DEPTH16_MM data type for depth (OPENNI MODE)

zed_nodelets/src/zed_nodelet/include/zed_wrapper_nodelet.hpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -532,9 +532,10 @@ class ZEDWrapperNodelet : public nodelet::Nodelet
532532
double mCamMinDepth;
533533
double mCamMaxDepth;
534534

535-
bool mTrackingActivated;
536-
537-
bool mTrackingReady;
535+
// Positional tracking
536+
bool mPosTrackingEnabled=false;
537+
bool mPosTrackingActivated=false;
538+
bool mPosTrackingReady=false;
538539
bool mTwoDMode = false;
539540
double mFixedZValue = 0.0;
540541
bool mFloorAlignment = false;
@@ -608,7 +609,7 @@ class ZEDWrapperNodelet : public nodelet::Nodelet
608609
double mCamImageResizeFactor = 1.0;
609610
double mCamDepthResizeFactor = 1.0;
610611

611-
// flags
612+
// flags
612613
bool mTriggerAutoExposure = true;
613614
bool mTriggerAutoWB = true;
614615
bool mComputeDepth;

zed_nodelets/src/zed_nodelet/src/zed_wrapper_nodelet.cpp

Lines changed: 60 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -669,6 +669,11 @@ void ZEDWrapperNodelet::readParameters()
669669
mZedUserCamModel = sl::MODEL::ZED2;
670670
NODELET_INFO_STREAM(" * Camera Model by param\t-> " << camera_model);
671671
}
672+
else if (camera_model == "zed2i")
673+
{
674+
mZedUserCamModel = sl::MODEL::ZED2i;
675+
NODELET_INFO_STREAM(" * Camera Model by param\t-> " << camera_model);
676+
}
672677
else
673678
{
674679
NODELET_ERROR_STREAM("Camera model not valid: " << camera_model);
@@ -712,6 +717,8 @@ void ZEDWrapperNodelet::readParameters()
712717
NODELET_INFO_STREAM("*** POSITIONAL TRACKING PARAMETERS ***");
713718

714719
// ----> Tracking
720+
mNhNs.param<bool>("pos_tracking/pos_tracking_enabled", mPosTrackingEnabled, true);
721+
NODELET_INFO_STREAM(" * Positional tracking\t\t-> " << (mPosTrackingEnabled ? "ENABLED" : "DISABLED"));
715722
mNhNs.getParam("pos_tracking/path_pub_rate", mPathPubRate);
716723
NODELET_INFO_STREAM(" * Path rate\t\t\t-> " << mPathPubRate << " Hz");
717724
mNhNs.getParam("pos_tracking/path_max_count", mPathMaxCount);
@@ -1322,7 +1329,7 @@ bool ZEDWrapperNodelet::on_set_pose(zed_interfaces::set_pose::Request& req, zed_
13221329
std::lock_guard<std::mutex> lock(mPosTrkMutex);
13231330

13241331
// Disable tracking
1325-
mTrackingActivated = false;
1332+
mPosTrackingActivated = false;
13261333
mZed.disablePositionalTracking();
13271334

13281335
// Restart tracking
@@ -1335,7 +1342,7 @@ bool ZEDWrapperNodelet::on_set_pose(zed_interfaces::set_pose::Request& req, zed_
13351342
bool ZEDWrapperNodelet::on_reset_tracking(zed_interfaces::reset_tracking::Request& req,
13361343
zed_interfaces::reset_tracking::Response& res)
13371344
{
1338-
if (!mTrackingActivated)
1345+
if (!mPosTrackingActivated)
13391346
{
13401347
res.reset_done = false;
13411348
return false;
@@ -1351,7 +1358,7 @@ bool ZEDWrapperNodelet::on_reset_tracking(zed_interfaces::reset_tracking::Reques
13511358
std::lock_guard<std::mutex> lock(mPosTrkMutex);
13521359

13531360
// Disable tracking
1354-
mTrackingActivated = false;
1361+
mPosTrackingActivated = false;
13551362
mZed.disablePositionalTracking();
13561363

13571364
// Restart tracking
@@ -1627,11 +1634,11 @@ void ZEDWrapperNodelet::start_pos_tracking()
16271634

16281635
if (err == sl::ERROR_CODE::SUCCESS)
16291636
{
1630-
mTrackingActivated = true;
1637+
mPosTrackingActivated = true;
16311638
}
16321639
else
16331640
{
1634-
mTrackingActivated = false;
1641+
mPosTrackingActivated = false;
16351642

16361643
NODELET_WARN("Tracking not activated: %s", sl::toString(err).c_str());
16371644
}
@@ -1789,6 +1796,16 @@ void ZEDWrapperNodelet::publishStaticImuFrame()
17891796

17901797
void ZEDWrapperNodelet::publishOdomFrame(tf2::Transform odomTransf, ros::Time t)
17911798
{
1799+
// ----> Avoid duplicated TF publishing
1800+
static ros::Time last_stamp;
1801+
1802+
if( t==last_stamp )
1803+
{
1804+
return;
1805+
}
1806+
last_stamp = t;
1807+
// <---- Avoid duplicated TF publishing
1808+
17921809
if (!mSensor2BaseTransfValid)
17931810
{
17941811
getSens2BaseTransform();
@@ -1813,11 +1830,21 @@ void ZEDWrapperNodelet::publishOdomFrame(tf2::Transform odomTransf, ros::Time t)
18131830
// Publish transformation
18141831
mTransformOdomBroadcaster.sendTransform(transformStamped);
18151832

1816-
// NODELET_INFO_STREAM( "Published ODOM TF with TS: " << t );
1833+
//NODELET_INFO_STREAM( "Published ODOM TF with TS: " << t );
18171834
}
18181835

18191836
void ZEDWrapperNodelet::publishPoseFrame(tf2::Transform baseTransform, ros::Time t)
18201837
{
1838+
// ----> Avoid duplicated TF publishing
1839+
static ros::Time last_stamp;
1840+
1841+
if( t==last_stamp )
1842+
{
1843+
return;
1844+
}
1845+
last_stamp = t;
1846+
// <---- Avoid duplicated TF publishing
1847+
18211848
if (!mSensor2BaseTransfValid)
18221849
{
18231850
getSens2BaseTransform();
@@ -2999,8 +3026,18 @@ void ZEDWrapperNodelet::publishSensData(ros::Time t)
29993026
ts_mag = sl_tools::slTime2Ros(sens_data.magnetometer.timestamp);
30003027
}
30013028

3029+
bool new_imu_data = ts_imu != lastTs_imu;
3030+
bool new_baro_data = ts_baro != lastTs_baro;
3031+
bool new_mag_data = ts_mag != lastT_mag;
3032+
3033+
if (!new_imu_data && !new_baro_data && !new_mag_data)
3034+
{
3035+
NODELET_DEBUG("No updated sensors data");
3036+
return;
3037+
}
3038+
30023039
// ----> Publish odometry tf only if enabled
3003-
if (mPublishTf && mTrackingReady)
3040+
if (mPublishTf && mPosTrackingReady && new_imu_data)
30043041
{
30053042
NODELET_DEBUG("Publishing TF");
30063043

@@ -3018,25 +3055,17 @@ void ZEDWrapperNodelet::publishSensData(ros::Time t)
30183055
}
30193056
// <---- Publish odometry tf only if enabled
30203057

3021-
bool new_imu_data = ts_imu != lastTs_imu;
3022-
bool new_baro_data = ts_baro != lastTs_baro;
3023-
bool new_mag_data = ts_mag != lastT_mag;
3024-
3025-
if (!new_imu_data && !new_baro_data && !new_mag_data)
3026-
{
3027-
NODELET_DEBUG("No updated sensors data");
3028-
return;
3029-
}
3030-
30313058
if (mZedRealCamModel == sl::MODEL::ZED2)
30323059
{
30333060
// Update temperatures for Diagnostic
30343061
sens_data.temperature.get(sl::SensorsData::TemperatureData::SENSOR_LOCATION::ONBOARD_LEFT, mTempLeft);
30353062
sens_data.temperature.get(sl::SensorsData::TemperatureData::SENSOR_LOCATION::ONBOARD_RIGHT, mTempRight);
30363063
}
30373064

3038-
if (imu_TempSubNumber > 0)
3065+
if (imu_TempSubNumber > 0 && new_imu_data)
30393066
{
3067+
lastTs_imu = ts_imu;
3068+
30403069
sensor_msgs::TemperaturePtr imuTempMsg = boost::make_shared<sensor_msgs::Temperature>();
30413070

30423071
imuTempMsg->header.stamp = ts_imu;
@@ -3262,6 +3291,8 @@ void ZEDWrapperNodelet::publishSensData(ros::Time t)
32623291

32633292
if (imu_RawSubNumber > 0 && new_imu_data)
32643293
{
3294+
lastTs_imu = ts_imu;
3295+
32653296
sensor_msgs::ImuPtr imuRawMsg = boost::make_shared<sensor_msgs::Imu>();
32663297

32673298
imuRawMsg->header.stamp = ts_imu;
@@ -3347,7 +3378,7 @@ void ZEDWrapperNodelet::device_poll_thread_func()
33473378

33483379
mPrevFrameTimestamp = mFrameTimestamp;
33493380

3350-
mTrackingActivated = false;
3381+
mPosTrackingActivated = false;
33513382
mMappingRunning = false;
33523383
mRecording = false;
33533384

@@ -3417,7 +3448,7 @@ void ZEDWrapperNodelet::device_poll_thread_func()
34173448
}
34183449

34193450
mGrabActive =
3420-
mRecording || mStreaming || mMappingEnabled || mObjDetEnabled || mTrackingActivated ||
3451+
mRecording || mStreaming || mMappingEnabled || mObjDetEnabled || mPosTrackingEnabled || mPosTrackingActivated ||
34213452
((rgbSubnumber + rgbRawSubnumber + leftSubnumber + leftRawSubnumber + rightSubnumber + rightRawSubnumber +
34223453
rgbGraySubnumber + rgbGrayRawSubnumber + leftGraySubnumber + leftGrayRawSubnumber + rightGraySubnumber +
34233454
rightGrayRawSubnumber + depthSubnumber + disparitySubnumber + cloudSubnumber + poseSubnumber +
@@ -3430,11 +3461,11 @@ void ZEDWrapperNodelet::device_poll_thread_func()
34303461
std::lock_guard<std::mutex> lock(mPosTrkMutex);
34313462

34323463
// Note: ones tracking is started it is never stopped anymore to not lose tracking information
3433-
bool computeTracking = (mMappingEnabled || mObjDetEnabled || (mComputeDepth & mDepthStabilization) ||
3464+
bool computeTracking = (mPosTrackingEnabled || mPosTrackingActivated || mMappingEnabled || mObjDetEnabled || (mComputeDepth & mDepthStabilization) ||
34343465
poseSubnumber > 0 || poseCovSubnumber > 0 || odomSubnumber > 0 || pathSubNumber > 0);
34353466

34363467
// Start the tracking?
3437-
if ((computeTracking) && !mTrackingActivated && (mDepthMode != sl::DEPTH_MODE::NONE))
3468+
if ((computeTracking) && !mPosTrackingActivated && (mDepthMode != sl::DEPTH_MODE::NONE))
34383469
{
34393470
start_pos_tracking();
34403471
}
@@ -3457,8 +3488,8 @@ void ZEDWrapperNodelet::device_poll_thread_func()
34573488

34583489
// Detect if one of the subscriber need to have the depth information
34593490
mComputeDepth = mDepthMode != sl::DEPTH_MODE::NONE &&
3460-
((depthSubnumber + disparitySubnumber + cloudSubnumber + fusedCloudSubnumber + poseSubnumber +
3461-
poseCovSubnumber + odomSubnumber + confMapSubnumber + objDetSubnumber) > 0);
3491+
(computeTracking || ((depthSubnumber + disparitySubnumber + cloudSubnumber + fusedCloudSubnumber + poseSubnumber +
3492+
poseCovSubnumber + odomSubnumber + confMapSubnumber + objDetSubnumber) > 0));
34623493

34633494
if (mComputeDepth)
34643495
{
@@ -3537,9 +3568,9 @@ void ZEDWrapperNodelet::device_poll_thread_func()
35373568
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
35383569
}
35393570

3540-
mTrackingActivated = false;
3571+
mPosTrackingActivated = false;
35413572

3542-
computeTracking = mDepthStabilization || poseSubnumber > 0 || poseCovSubnumber > 0 || odomSubnumber > 0;
3573+
computeTracking = mPosTrackingEnabled || mDepthStabilization || poseSubnumber > 0 || poseCovSubnumber > 0 || odomSubnumber > 0;
35433574

35443575
if (computeTracking)
35453576
{ // Start the tracking
@@ -3829,7 +3860,7 @@ void ZEDWrapperNodelet::device_poll_thread_func()
38293860
publishOdom(mOdom2BaseTransf, deltaOdom, stamp);
38303861
}
38313862

3832-
mTrackingReady = true;
3863+
mPosTrackingReady = true;
38333864
}
38343865
}
38353866
else if (mFloorAlignment)
@@ -3956,7 +3987,7 @@ void ZEDWrapperNodelet::device_poll_thread_func()
39563987
publishPose(stamp);
39573988
}
39583989

3959-
mTrackingReady = true;
3990+
mPosTrackingReady = true;
39603991
}
39613992

39623993
oldStatus = mPosTrackingStatus;
@@ -4162,7 +4193,7 @@ void ZEDWrapperNodelet::callback_updateDiagnostic(diagnostic_updater::Diagnostic
41624193
}
41634194
}
41644195

4165-
if (mTrackingActivated)
4196+
if (mPosTrackingActivated)
41664197
{
41674198
stat.addf("Tracking status", "%s", sl::toString(mPosTrackingStatus).c_str());
41684199
}

zed_wrapper/launch/zed2i.launch

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
<?xml version="1.0"?>
2+
<!--
3+
Copyright (c) 2020, STEREOLABS.
4+
5+
All rights reserved.
6+
7+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
8+
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
9+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
10+
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
11+
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
12+
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
13+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
14+
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
15+
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
16+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
17+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
18+
-->
19+
<launch>
20+
<arg name="svo_file" default="" /> <!-- <arg name="svo_file" default="path/to/svo/file.svo"> -->
21+
<arg name="stream" default="" /> <!-- <arg name="stream" default="<ip_address>:<port>"> -->
22+
23+
<arg name="node_name" default="zed_node" />
24+
<arg name="camera_model" default="zed2i" />
25+
<arg name="publish_urdf" default="true" />
26+
27+
<arg name="camera_name" default="zed2i" />
28+
29+
<arg name="base_frame" default="base_link" />
30+
31+
<arg name="cam_pos_x" default="0.0" /> <!-- Position respect to base frame (i.e. "base_link) -->
32+
<arg name="cam_pos_y" default="0.0" /> <!-- Position respect to base frame (i.e. "base_link) -->
33+
<arg name="cam_pos_z" default="0.0" /> <!-- Position respect to base frame (i.e. "base_link) -->
34+
<arg name="cam_roll" default="0.0" /> <!-- Orientation respect to base frame (i.e. "base_link) -->
35+
<arg name="cam_pitch" default="0.0" /> <!-- Orientation respect to base frame (i.e. "base_link) -->
36+
<arg name="cam_yaw" default="0.0" /> <!-- Orientation respect to base frame (i.e. "base_link) -->
37+
38+
<group ns="$(arg camera_name)">
39+
<include file="$(find zed_wrapper)/launch/include/zed_camera.launch.xml">
40+
<arg name="camera_name" value="$(arg camera_name)" />
41+
<arg name="svo_file" value="$(arg svo_file)" />
42+
<arg name="stream" value="$(arg stream)" />
43+
<arg name="node_name" value="$(arg node_name)" />
44+
<arg name="camera_model" value="$(arg camera_model)" />
45+
<arg name="base_frame" value="$(arg base_frame)" />
46+
<arg name="publish_urdf" value="$(arg publish_urdf)" />
47+
<arg name="cam_pos_x" value="$(arg cam_pos_x)" />
48+
<arg name="cam_pos_y" value="$(arg cam_pos_y)" />
49+
<arg name="cam_pos_z" value="$(arg cam_pos_z)" />
50+
<arg name="cam_roll" value="$(arg cam_roll)" />
51+
<arg name="cam_pitch" value="$(arg cam_pitch)" />
52+
<arg name="cam_yaw" value="$(arg cam_yaw)" />
53+
</include>
54+
</group>
55+
</launch>

zed_wrapper/params/common.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,14 @@ video:
3737
extrinsic_in_camera_frame: true # if `false` extrinsic parameter in `camera_info` will use ROS native frame (X FORWARD, Z UP) instead of the camera frame (Z FORWARD, Y DOWN) [`true` use old behavior as for version < v3.1]
3838

3939
depth:
40-
quality: 3 # '0': NONE, '1': PERFORMANCE, '2': QUALITY, '3': ULTRA
40+
quality: 1 # '0': NONE, '1': PERFORMANCE, '2': QUALITY, '3': ULTRA
4141
sensing_mode: 0 # '0': STANDARD, '1': FILL (not use FILL for robotic applications)
4242
depth_stabilization: 1 # `0`: disabled, `1`: enabled
4343
openni_depth_mode: false # 'false': 32bit float meters, 'true': 16bit uchar millimeters
4444
depth_downsample_factor: 1.0 # Resample factor for depth data matrices [0.01,1.0] The SDK works with native data sizes, but publishes rescaled matrices (depth map, point cloud, ...)
4545

4646
pos_tracking:
47+
pos_tracking_enabled: true # True to enable positional tracking from start
4748
publish_tf: true # publish `odom -> base_link` TF
4849
publish_map_tf: true # publish `map -> odom` TF
4950
map_frame: 'map'

zed_wrapper/params/zed2.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ general:
66
camera_model: 'zed2'
77

88
depth:
9-
min_depth: 0.7 # Min: 0.2, Max: 3.0 - Default 0.7 - Note: reducing this value wil require more computational power and GPU memory
9+
min_depth: 0.3 # Min: 0.2, Max: 3.0 - Default 0.7 - Note: reducing this value wil require more computational power and GPU memory
1010
max_depth: 20.0 # Max: 40.0
1111

1212
pos_tracking:
@@ -18,7 +18,7 @@ sensors:
1818

1919
object_detection:
2020
od_enabled: false # True to enable Object Detection [only ZED 2]
21-
model: 0 # '0': MULTI_CLASS_BOX - '1': MULTI_CLASS_BOX_ACCURATE - '2': HUMAN_BODY_FAST - '3': HUMAN_BODY_ACCURATE
21+
model: 3 # '0': MULTI_CLASS_BOX - '1': MULTI_CLASS_BOX_ACCURATE - '2': HUMAN_BODY_FAST - '3': HUMAN_BODY_ACCURATE
2222
confidence_threshold: 50 # Minimum value of the detection confidence of an object [0,100]
2323
max_range: 15. # Maximum detection range
2424
object_tracking_enabled: true # Enable/disable the tracking of the detected objects

0 commit comments

Comments
 (0)