Merge remote-tracking branch 'origin/v2-main_feature/test_interleave_mode' into test_interleave_mode_opdk

This commit is contained in:
datean
2024-11-29 16:13:13 +08:00
18 changed files with 89 additions and 42 deletions
@@ -245,6 +245,16 @@ OB_EXPORT uint32_t ob_filter_config_schema_list_get_count(const ob_filter_config
OB_EXPORT ob_filter_config_schema_item ob_filter_config_schema_list_get_item(const ob_filter_config_schema_list *config_schema_list, uint32_t index, OB_EXPORT ob_filter_config_schema_item ob_filter_config_schema_list_get_item(const ob_filter_config_schema_list *config_schema_list, uint32_t index,
ob_error **error); ob_error **error);
/**
* @brief Set the align to stream profile for the align filter.
* @breif It is useful when the align target stream dose not started (without any frame to get intrinsics and extrinsics).
*
* @param filter A filter object.
* @param align_to_stream_profile The align target stream profile.
* @param error Pointer to an error object that will be set if an error occurs.
*/
OB_EXPORT void ob_align_filter_set_align_to_stream_profile(ob_filter *filter, const ob_stream_profile *align_to_stream_profile, ob_error **error);
// The following interfaces are deprecated and are retained here for compatibility purposes. // The following interfaces are deprecated and are retained here for compatibility purposes.
#define ob_get_filter ob_filter_list_get_filter #define ob_get_filter ob_filter_list_get_filter
#define ob_get_filter_name ob_filter_get_name #define ob_get_filter_name ob_filter_get_name
@@ -1,9 +1,6 @@
// Copyright (c) Orbbec Inc. All Rights Reserved. // Copyright (c) Orbbec Inc. All Rights Reserved.
// Licensed under the MIT License. // Licensed under the MIT License.
// License: Apache 2.0. See LICENSE file in root directory.
// Copyright(c) 2020 Orbbec Corporation. All Rights Reserved.
/** /**
* @file ObTypes.h * @file ObTypes.h
* @brief Provide structs commonly used in the SDK, enumerating constant definitions. * @brief Provide structs commonly used in the SDK, enumerating constant definitions.
@@ -97,7 +97,7 @@ typedef enum {
/** /**
* @brief Software filter switch * @brief Software filter switch
*/ */
OB_PROP_DEPTH_SOFT_FILTER_BOOL = 24, OB_PROP_DEPTH_NOISE_REMOVAL_FILTER_BOOL = 24,
/** /**
* @brief LDP status * @brief LDP status
@@ -105,14 +105,14 @@ typedef enum {
OB_PROP_LDP_STATUS_BOOL = 32, OB_PROP_LDP_STATUS_BOOL = 32,
/** /**
* @brief soft filter maxdiff param * @brief maxdiff for depth noise removal filter
*/ */
OB_PROP_DEPTH_MAX_DIFF_INT = 40, OB_PROP_DEPTH_NOISE_REMOVAL_FILTER_MAX_DIFF_INT = 40,
/** /**
* @brief soft filter maxSpeckleSize * @brief maxSpeckleSize for depth noise removal filter
*/ */
OB_PROP_DEPTH_MAX_SPECKLE_SIZE_INT = 41, OB_PROP_DEPTH_NOISE_REMOVAL_FILTER_MAX_SPECKLE_SIZE_INT = 41,
/** /**
* @brief Hardware d2c is on * @brief Hardware d2c is on
@@ -759,7 +759,9 @@ typedef enum {
#define OB_PROP_LASER_ENERGY_LEVEL_INT OB_PROP_LASER_POWER_LEVEL_CONTROL_INT #define OB_PROP_LASER_ENERGY_LEVEL_INT OB_PROP_LASER_POWER_LEVEL_CONTROL_INT
#define OB_PROP_LASER_HW_ENERGY_LEVEL_INT OB_PROP_LASER_POWER_ACTUAL_LEVEL_INT #define OB_PROP_LASER_HW_ENERGY_LEVEL_INT OB_PROP_LASER_POWER_ACTUAL_LEVEL_INT
#define OB_PROP_DEVICE_USB3_REPEAT_IDENTIFY_BOOL OB_PROP_DEVICE_USB2_REPEAT_IDENTIFY_BOOL #define OB_PROP_DEVICE_USB3_REPEAT_IDENTIFY_BOOL OB_PROP_DEVICE_USB2_REPEAT_IDENTIFY_BOOL
#define OB_PROP_DEPTH_NOISE_REMOVAL_FILTER_BOOL OB_PROP_DEPTH_SOFT_FILTER_BOOL #define OB_PROP_DEPTH_SOFT_FILTER_BOOL OB_PROP_DEPTH_NOISE_REMOVAL_FILTER_BOOL
#define OB_PROP_DEPTH_MAX_DIFF_INT OB_PROP_DEPTH_NOISE_REMOVAL_FILTER_MAX_DIFF_INT
#define OB_PROP_DEPTH_MAX_SPECKLE_SIZE_INT OB_PROP_DEPTH_NOISE_REMOVAL_FILTER_MAX_SPECKLE_SIZE_INT
/** /**
* @brief The data type used to describe all property settings * @brief The data type used to describe all property settings
@@ -440,6 +440,18 @@ public:
void setMatchTargetResolution(bool state) { void setMatchTargetResolution(bool state) {
setConfigValue("MatchTargetRes", state); setConfigValue("MatchTargetRes", state);
} }
/**
* @brief Set the Align To Stream Profile
* @brief It is useful when the align target stream dose not started (without any frame to get intrinsics and extrinsics).
*
* @param profile The Align To Stream Profile.
*/
void setAlignToStreamProfile(std::shared_ptr<const StreamProfile> profile) {
ob_error *error = nullptr;
ob_align_filter_set_align_to_stream_profile(impl_, profile->getImpl(), &error);
Error::handle(&error);
}
}; };
/** /**
Binary file not shown.
Binary file not shown.
@@ -23,7 +23,7 @@
#define OB_ROS_MAJOR_VERSION 2 #define OB_ROS_MAJOR_VERSION 2
#define OB_ROS_MINOR_VERSION 0 #define OB_ROS_MINOR_VERSION 0
#define OB_ROS_PATCH_VERSION 8 #define OB_ROS_PATCH_VERSION 9
#ifndef STRINGIFY #ifndef STRINGIFY
#define STRINGIFY(arg) #arg #define STRINGIFY(arg) #arg
@@ -312,6 +312,8 @@ class OBCameraNode {
std::shared_ptr<std_srvs::srv::SetBool::Response>& response); std::shared_ptr<std_srvs::srv::SetBool::Response>& response);
void setSYNCInterleaveLaserCallback(const std::shared_ptr<SetInt32 ::Request>& request, void setSYNCInterleaveLaserCallback(const std::shared_ptr<SetInt32 ::Request>& request,
std::shared_ptr<SetInt32 ::Response>& response); std::shared_ptr<SetInt32 ::Response>& response);
void setSYNCHostimeCallback(const std::shared_ptr<std_srvs::srv::SetBool::Request>& request,
std::shared_ptr<std_srvs::srv::SetBool::Response>& response);
bool toggleSensor(const stream_index_pair& stream_index, bool enabled, std::string& msg); bool toggleSensor(const stream_index_pair& stream_index, bool enabled, std::string& msg);
void saveImageCallback(const std::shared_ptr<std_srvs::srv::Empty::Request>& request, void saveImageCallback(const std::shared_ptr<std_srvs::srv::Empty::Request>& request,
@@ -465,6 +467,7 @@ class OBCameraNode {
rclcpp::Service<std_srvs::srv::SetBool>::SharedPtr set_sync_immediately_srv_; rclcpp::Service<std_srvs::srv::SetBool>::SharedPtr set_sync_immediately_srv_;
rclcpp::Service<std_srvs::srv::SetBool>::SharedPtr set_reset_timestamp_srv_; rclcpp::Service<std_srvs::srv::SetBool>::SharedPtr set_reset_timestamp_srv_;
rclcpp::Service<SetInt32>::SharedPtr set_interleaver_laser_sync_srv_; rclcpp::Service<SetInt32>::SharedPtr set_interleaver_laser_sync_srv_;
rclcpp::Service<std_srvs::srv::SetBool>::SharedPtr set_sync_host_time_srv_;
bool enable_sync_output_accel_gyro_ = false; bool enable_sync_output_accel_gyro_ = false;
bool publish_tf_ = false; bool publish_tf_ = false;
+1 -1
View File
@@ -2,7 +2,7 @@
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?> <?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3"> <package format="3">
<name>orbbec_camera</name> <name>orbbec_camera</name>
<version>2.0.8</version> <version>2.0.9</version>
<description>Orbbec Camera package</description> <description>Orbbec Camera package</description>
<maintainer email="[email protected]">Joe Dong</maintainer> <maintainer email="[email protected]">Joe Dong</maintainer>
<license>Apache-2.0</license> <license>Apache-2.0</license>
+30 -30
View File
@@ -545,14 +545,14 @@ void OBCameraNode::setupDepthPostProcessFilter() {
} else if (filter_name == "NoiseRemovalFilter" && enable_noise_removal_filter_) { } else if (filter_name == "NoiseRemovalFilter" && enable_noise_removal_filter_) {
auto noise_removal_filter = filter->as<ob::NoiseRemovalFilter>(); auto noise_removal_filter = filter->as<ob::NoiseRemovalFilter>();
OBNoiseRemovalFilterParams params = noise_removal_filter->getFilterParams(); OBNoiseRemovalFilterParams params = noise_removal_filter->getFilterParams();
RCLCPP_INFO_STREAM(logger_, "Default noise removal filter params: " RCLCPP_INFO_STREAM(
<< "disp_diff: " << params.disp_diff logger_, "Default noise removal filter params: " << "disp_diff: " << params.disp_diff
<< ", max_size: " << params.max_size); << ", max_size: " << params.max_size);
params.disp_diff = noise_removal_filter_min_diff_; params.disp_diff = noise_removal_filter_min_diff_;
params.max_size = noise_removal_filter_max_size_; params.max_size = noise_removal_filter_max_size_;
RCLCPP_INFO_STREAM(logger_, "Set noise removal filter params: " RCLCPP_INFO_STREAM(logger_,
<< "disp_diff: " << params.disp_diff "Set noise removal filter params: " << "disp_diff: " << params.disp_diff
<< ", max_size: " << params.max_size); << ", max_size: " << params.max_size);
if (noise_removal_filter_min_diff_ != -1 && noise_removal_filter_max_size_ != -1) { if (noise_removal_filter_min_diff_ != -1 && noise_removal_filter_max_size_ != -1) {
noise_removal_filter->setFilterParams(params); noise_removal_filter->setFilterParams(params);
} }
@@ -561,11 +561,11 @@ void OBCameraNode::setupDepthPostProcessFilter() {
hdr_merge_gain_2_ != -1) { hdr_merge_gain_2_ != -1) {
auto hdr_merge_filter = filter->as<ob::HdrMerge>(); auto hdr_merge_filter = filter->as<ob::HdrMerge>();
hdr_merge_filter->enable(true); hdr_merge_filter->enable(true);
RCLCPP_INFO_STREAM(logger_, "Set HDR merge filter params: " RCLCPP_INFO_STREAM(
<< "exposure_1: " << hdr_merge_exposure_1_ logger_, "Set HDR merge filter params: " << "exposure_1: " << hdr_merge_exposure_1_
<< ", gain_1: " << hdr_merge_gain_1_ << ", gain_1: " << hdr_merge_gain_1_
<< ", exposure_2: " << hdr_merge_exposure_2_ << ", exposure_2: " << hdr_merge_exposure_2_
<< ", gain_2: " << hdr_merge_gain_2_); << ", gain_2: " << hdr_merge_gain_2_);
auto config = OBHdrConfig(); auto config = OBHdrConfig();
config.enable = true; config.enable = true;
config.exposure_1 = hdr_merge_exposure_1_; config.exposure_1 = hdr_merge_exposure_1_;
@@ -860,24 +860,6 @@ void OBCameraNode::startStreams() {
colorFrameThread_ = std::make_shared<std::thread>([this]() { onNewColorFrameCallback(); }); colorFrameThread_ = std::make_shared<std::thread>([this]() { onNewColorFrameCallback(); });
} }
// enable interleave frame
if ((interleave_ae_mode_ == "hdr") || (interleave_ae_mode_ == "laser")) {
RCLCPP_INFO_STREAM(logger_, "current interleave_ae_mode_: " << interleave_ae_mode_);
if (device_->isPropertySupported(OB_PROP_FRAME_INTERLEAVE_ENABLE_BOOL, OB_PERMISSION_WRITE)) {
RCLCPP_INFO_STREAM(logger_, "Enable enable_interleave_depth_frame to "
<< (interleave_frame_enable_ ? "true" : "false"));
TRY_TO_SET_PROPERTY(setBoolProperty, OB_PROP_FRAME_INTERLEAVE_ENABLE_BOOL,
interleave_frame_enable_);
}
}
// set interleave larse PATTERN_SYNC_DELAY
if ((interleave_ae_mode_ == "laser") &&
device_->isPropertySupported(OB_PROP_FRAME_INTERLEAVE_LASER_PATTERN_SYNC_DELAY_INT,
OB_PERMISSION_READ_WRITE)) {
RCLCPP_INFO_STREAM(logger_, "Setting OB_PROP_FRAME_INTERLEAVE_LASER_PATTERN_SYNC_DELAY_INT 0 ");
TRY_TO_SET_PROPERTY(setIntProperty, OB_PROP_FRAME_INTERLEAVE_LASER_PATTERN_SYNC_DELAY_INT, 0);
}
if (enable_frame_sync_) { if (enable_frame_sync_) {
RCLCPP_INFO_STREAM(logger_, "Enable frame sync"); RCLCPP_INFO_STREAM(logger_, "Enable frame sync");
TRY_EXECUTE_BLOCK(pipeline_->enableFrameSync()); TRY_EXECUTE_BLOCK(pipeline_->enableFrameSync());
@@ -885,6 +867,25 @@ void OBCameraNode::startStreams() {
RCLCPP_INFO_STREAM(logger_, "Disable frame sync"); RCLCPP_INFO_STREAM(logger_, "Disable frame sync");
TRY_EXECUTE_BLOCK(pipeline_->disableFrameSync()); TRY_EXECUTE_BLOCK(pipeline_->disableFrameSync());
} }
// enable interleave frame
if ((interleave_ae_mode_ == "hdr") || (interleave_ae_mode_ == "laser")) {
RCLCPP_INFO_STREAM(logger_, "current interleave_ae_mode_: " << interleave_ae_mode_);
if (device_->isPropertySupported(OB_PROP_FRAME_INTERLEAVE_ENABLE_BOOL, OB_PERMISSION_WRITE)) {
TRY_TO_SET_PROPERTY(setBoolProperty, OB_PROP_FRAME_INTERLEAVE_ENABLE_BOOL,
interleave_frame_enable_);
RCLCPP_INFO_STREAM(logger_, "Enable enable_interleave_depth_frame to "
<< (interleave_frame_enable_ ? "true" : "false"));
}
}
// set interleave larse PATTERN_SYNC_DELAY
if ((interleave_ae_mode_ == "laser") && interleave_frame_enable_ &&
device_->isPropertySupported(OB_PROP_FRAME_INTERLEAVE_LASER_PATTERN_SYNC_DELAY_INT,
OB_PERMISSION_READ_WRITE) &&
(sync_mode_str_ == "PRIMARY" || sync_mode_str_ == "SOFTWARE_TRIGGERING")) {
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
TRY_TO_SET_PROPERTY(setIntProperty, OB_PROP_FRAME_INTERLEAVE_LASER_PATTERN_SYNC_DELAY_INT, 0);
RCLCPP_INFO_STREAM(logger_, "Setting OB_PROP_FRAME_INTERLEAVE_LASER_PATTERN_SYNC_DELAY_INT 0 ");
}
pipeline_started_.store(true); pipeline_started_.store(true);
} }
@@ -2241,7 +2242,6 @@ void OBCameraNode::onNewFrameCallback(const std::shared_ptr<ob::Frame> &frame,
} else { } else {
memcpy(image.data, video_frame->getData(), video_frame->getDataSize()); memcpy(image.data, video_frame->getData(), video_frame->getDataSize());
} }
if (stream_index == DEPTH) { if (stream_index == DEPTH) {
auto depth_scale = video_frame->as<ob::DepthFrame>()->getValueScale(); auto depth_scale = video_frame->as<ob::DepthFrame>()->getValueScale();
image = image * depth_scale; image = image * depth_scale;
+24 -1
View File
@@ -184,6 +184,11 @@ void OBCameraNode::setupCameraCtrlServices() {
std::shared_ptr<SetInt32::Response> response) { std::shared_ptr<SetInt32::Response> response) {
setSYNCInterleaveLaserCallback(request, response); setSYNCInterleaveLaserCallback(request, response);
}); });
set_sync_host_time_srv_ = node_->create_service<SetBool>(
"set_sync_hosttime", [this](const std::shared_ptr<SetBool::Request> request,
std::shared_ptr<SetBool::Response> response) {
setSYNCHostimeCallback(request, response);
});
} }
void OBCameraNode::setExposureCallback(const std::shared_ptr<SetInt32::Request>& request, void OBCameraNode::setExposureCallback(const std::shared_ptr<SetInt32::Request>& request,
@@ -825,7 +830,25 @@ void OBCameraNode::setSYNCInterleaveLaserCallback(
std::shared_ptr<SetInt32 ::Response>& response) { std::shared_ptr<SetInt32 ::Response>& response) {
(void)request; (void)request;
try { try {
device_->setIntProperty(OB_PROP_TIMER_RESET_TRIGGER_OUT_ENABLE_BOOL, request->data); device_->setIntProperty(OB_PROP_FRAME_INTERLEAVE_LASER_PATTERN_SYNC_DELAY_INT, request->data);
response->success = true;
} catch (const ob::Error& e) {
response->message = e.getMessage();
response->success = false;
} catch (const std::exception& e) {
response->message = e.what();
response->success = false;
} catch (...) {
response->message = "unknown error";
response->success = false;
}
}
void OBCameraNode::setSYNCHostimeCallback(
const std::shared_ptr<std_srvs::srv::SetBool::Request>& request,
std::shared_ptr<std_srvs::srv::SetBool::Response>& response) {
(void)request;
try {
device_->timerSyncWithHost();
response->success = true; response->success = true;
} catch (const ob::Error& e) { } catch (const ob::Error& e) {
response->message = e.getMessage(); response->message = e.getMessage();