diff --git a/.vscode/settings.json b/.vscode/settings.json index be954f3b..7c2789d0 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -72,6 +72,8 @@ "typeindex": "cpp", "typeinfo": "cpp", "variant": "cpp", - "*.ipp": "cpp" + "*.ipp": "cpp", + "filesystem": "cpp", + "shared_mutex": "cpp" } } \ No newline at end of file diff --git a/orbbec_camera/include/orbbec_camera/ob_camera_node.h b/orbbec_camera/include/orbbec_camera/ob_camera_node.h index 91f70a6c..80af0f66 100644 --- a/orbbec_camera/include/orbbec_camera/ob_camera_node.h +++ b/orbbec_camera/include/orbbec_camera/ob_camera_node.h @@ -293,6 +293,10 @@ class OBCameraNode { std::shared_ptr& response); void setRESETTimestampCallback(const std::shared_ptr& request, std::shared_ptr& response); + void setSYNCInterleaveLaserCallback(const std::shared_ptr& request, + std::shared_ptr& response); + void setSYNCHostimeCallback(const std::shared_ptr& request, + std::shared_ptr& response); bool toggleSensor(const stream_index_pair& stream_index, bool enabled, std::string& msg); void saveImageCallback(const std::shared_ptr& request, @@ -359,6 +363,10 @@ class OBCameraNode { void setupDepthPostProcessFilter(); + // interleave AE + int init_interleave_hdr_param(); + int init_interleave_laser_param(); + private: rclcpp::Node* node_ = nullptr; std::shared_ptr device_ = nullptr; @@ -439,6 +447,8 @@ class OBCameraNode { rclcpp::Service::SharedPtr get_ldp_measure_distance_srv_; rclcpp::Service::SharedPtr set_sync_immediately_srv_; rclcpp::Service::SharedPtr set_reset_timestamp_srv_; + rclcpp::Service::SharedPtr set_interleaver_laser_sync_srv_; + rclcpp::Service::SharedPtr set_sync_host_time_srv_; bool enable_sync_output_accel_gyro_ = false; bool publish_tf_ = false; @@ -602,5 +612,11 @@ class OBCameraNode { bool use_intra_process_ = false; std::string cloud_frame_id_; std::vector> filter_list_; + + // interleave AE + std::string interleave_ae_mode_ = "hdr"; // hdr or laser + bool interleave_frame_enable_ = false; + bool interleave_skip_enable_ = false; + int interleave_skip_index_ = 1; }; } // namespace orbbec_camera diff --git a/orbbec_camera/src/ros_service.cpp b/orbbec_camera/src/ros_service.cpp index ee9cefad..a7468d77 100644 --- a/orbbec_camera/src/ros_service.cpp +++ b/orbbec_camera/src/ros_service.cpp @@ -179,6 +179,16 @@ void OBCameraNode::setupCameraCtrlServices() { std::shared_ptr response) { setRESETTimestampCallback(request, response); }); + set_interleaver_laser_sync_srv_ = node_->create_service( + "set_sync_interleaverlaser", [this](const std::shared_ptr request, + std::shared_ptr response) { + setSYNCInterleaveLaserCallback(request, response); + }); + set_sync_host_time_srv_ = node_->create_service( + "set_sync_hosttime", [this](const std::shared_ptr request, + std::shared_ptr response) { + setSYNCHostimeCallback(request, response); + }); } void OBCameraNode::setExposureCallback(const std::shared_ptr& request, @@ -815,5 +825,40 @@ void OBCameraNode::setRESETTimestampCallback( response->success = false; } } - +void OBCameraNode::setSYNCInterleaveLaserCallback( + const std::shared_ptr& request, + std::shared_ptr& response) { + (void)request; + try { + device_->setIntProperty(OB_PROP_TIMER_RESET_TRIGGER_OUT_ENABLE_BOOL, 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& request, + std::shared_ptr& response) { + (void)request; + try { + device_->timerSyncWithHost(); + 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; + } +} } // namespace orbbec_camera