mirror of
https://github.com/orbbec/OrbbecSDK_ROS2.git
synced 2026-10-11 15:09:48 +08:00
feat: add services support for auto exposure and sports modes in OBCameraNode
This commit is contained in:
@@ -404,6 +404,12 @@ class OBCameraNode {
|
|||||||
void getUserCalibParamsCallback(const std::shared_ptr<GetUserCalibParams::Request>& request,
|
void getUserCalibParamsCallback(const std::shared_ptr<GetUserCalibParams::Request>& request,
|
||||||
std::shared_ptr<GetUserCalibParams::Response>& response);
|
std::shared_ptr<GetUserCalibParams::Response>& response);
|
||||||
|
|
||||||
|
void setAEModeCallback(const std::shared_ptr<SetString::Request>& request,
|
||||||
|
std::shared_ptr<SetString::Response>& response);
|
||||||
|
|
||||||
|
void setSportsModeCallback(const std::shared_ptr<SetBool::Request>& request,
|
||||||
|
std::shared_ptr<SetBool::Response>& response);
|
||||||
|
|
||||||
void setUserCalibParamsCallback(const std::shared_ptr<SetUserCalibParams::Request>& request,
|
void setUserCalibParamsCallback(const std::shared_ptr<SetUserCalibParams::Request>& request,
|
||||||
std::shared_ptr<SetUserCalibParams::Response>& response);
|
std::shared_ptr<SetUserCalibParams::Response>& response);
|
||||||
|
|
||||||
@@ -596,6 +602,8 @@ class OBCameraNode {
|
|||||||
rclcpp::Service<std_srvs::srv::SetBool>::SharedPtr set_streams_enable_srv_;
|
rclcpp::Service<std_srvs::srv::SetBool>::SharedPtr set_streams_enable_srv_;
|
||||||
rclcpp::Service<GetUserCalibParams>::SharedPtr get_user_calib_params_srv_;
|
rclcpp::Service<GetUserCalibParams>::SharedPtr get_user_calib_params_srv_;
|
||||||
rclcpp::Service<SetUserCalibParams>::SharedPtr set_user_calib_params_srv_;
|
rclcpp::Service<SetUserCalibParams>::SharedPtr set_user_calib_params_srv_;
|
||||||
|
rclcpp::Service<SetString>::SharedPtr set_ae_mode_srv_;
|
||||||
|
rclcpp::Service<SetBool>::SharedPtr set_sports_mode_srv_;
|
||||||
|
|
||||||
bool enable_sync_output_accel_gyro_ = false;
|
bool enable_sync_output_accel_gyro_ = false;
|
||||||
bool publish_tf_ = false;
|
bool publish_tf_ = false;
|
||||||
|
|||||||
@@ -968,15 +968,16 @@ void OBCameraNode::setupDevices() {
|
|||||||
RCLCPP_ERROR(logger_, "intra camera sync reference does not support this setting");
|
RCLCPP_ERROR(logger_, "intra camera sync reference does not support this setting");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (pid == 0x0840) {
|
if (pid == GEMINI_305_PID) {
|
||||||
if (enable_sports_mode_) {
|
if (enable_sports_mode_) {
|
||||||
if (device_->isPropertySupported(OB_PROP_COLOR_AE_MODE_INT, OB_PERMISSION_WRITE)) {
|
if (device_->isPropertySupported(OB_PROP_COLOR_FAST_AE_BOOL, OB_PERMISSION_WRITE)) {
|
||||||
device_->setIntProperty(OB_PROP_COLOR_AE_MODE_INT, enable_sports_mode_);
|
device_->setIntProperty(OB_PROP_COLOR_FAST_AE_BOOL, (enable_sports_mode_ ? 0 : 1));
|
||||||
RCLCPP_INFO_STREAM(logger_,
|
RCLCPP_INFO_STREAM(logger_,
|
||||||
"Setting Sports Mode to " << (enable_sports_mode_ ? "ON" : "OFF"));
|
"Setting Sports Mode to " << (enable_sports_mode_ ? "ON" : "OFF"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!ae_mode_.empty()) {
|
if ((ae_mode_ == "depthbased" || ae_mode_ == "colorbased") &&
|
||||||
|
device_->isPropertySupported(OB_PROP_COLOR_AE_MODE_INT, OB_PERMISSION_WRITE)) {
|
||||||
if (device_->isPropertySupported(OB_PROP_COLOR_AE_MODE_INT, OB_PERMISSION_WRITE)) {
|
if (device_->isPropertySupported(OB_PROP_COLOR_AE_MODE_INT, OB_PERMISSION_WRITE)) {
|
||||||
auto ae_mode = ae_mode_ == "depthbased" ? 0 : 1;
|
auto ae_mode = ae_mode_ == "depthbased" ? 0 : 1;
|
||||||
device_->setIntProperty(OB_PROP_COLOR_AE_MODE_INT, ae_mode);
|
device_->setIntProperty(OB_PROP_COLOR_AE_MODE_INT, ae_mode);
|
||||||
@@ -1384,7 +1385,7 @@ void OBCameraNode::setupProfiles() {
|
|||||||
selected_profile = profiles->getProfile(0)->as<ob::VideoStreamProfile>();
|
selected_profile = profiles->getProfile(0)->as<ob::VideoStreamProfile>();
|
||||||
} else {
|
} else {
|
||||||
auto pid = device_->getDeviceInfo()->getPid();
|
auto pid = device_->getDeviceInfo()->getPid();
|
||||||
if (pid == 0x0840 && elem == DEPTH) {
|
if (pid == GEMINI_305_PID && elem == DEPTH) {
|
||||||
// Gemini 305
|
// Gemini 305
|
||||||
OBDownSampleConfig conf;
|
OBDownSampleConfig conf;
|
||||||
conf.originWidth = width_[elem];
|
conf.originWidth = width_[elem];
|
||||||
|
|||||||
@@ -231,25 +231,37 @@ void OBCameraNode::setupCameraCtrlServices() {
|
|||||||
std::shared_ptr<SetBool::Response> response) {
|
std::shared_ptr<SetBool::Response> response) {
|
||||||
sendSoftwareTriggerCallback(request, response);
|
sendSoftwareTriggerCallback(request, response);
|
||||||
});
|
});
|
||||||
write_customerdata_srv_ = node_->create_service<SetString>(
|
if (device_->getDeviceInfo()->getPid() == GEMINI_435Le_PID) {
|
||||||
"write_customer_data", [this](const std::shared_ptr<SetString::Request> request,
|
write_customerdata_srv_ = node_->create_service<SetString>(
|
||||||
std::shared_ptr<SetString::Response> response) {
|
"write_customer_data", [this](const std::shared_ptr<SetString::Request> request,
|
||||||
writeCustomerDataCallback(request, response);
|
std::shared_ptr<SetString::Response> response) {
|
||||||
|
writeCustomerDataCallback(request, response);
|
||||||
|
});
|
||||||
|
read_customerdata_srv_ = node_->create_service<GetString>(
|
||||||
|
"read_customer_data", [this](const std::shared_ptr<GetString::Request> request,
|
||||||
|
std::shared_ptr<GetString::Response> response) {
|
||||||
|
readCustomerDataCallback(request, response);
|
||||||
|
});
|
||||||
|
set_user_calib_params_srv_ = node_->create_service<SetUserCalibParams>(
|
||||||
|
"set_user_calib_params", [this](const std::shared_ptr<SetUserCalibParams::Request> request,
|
||||||
|
std::shared_ptr<SetUserCalibParams::Response> response) {
|
||||||
|
setUserCalibParamsCallback(request, response);
|
||||||
|
});
|
||||||
|
get_user_calib_params_srv_ = node_->create_service<GetUserCalibParams>(
|
||||||
|
"get_user_calib_params", [this](const std::shared_ptr<GetUserCalibParams::Request> request,
|
||||||
|
std::shared_ptr<GetUserCalibParams::Response> response) {
|
||||||
|
getUserCalibParamsCallback(request, response);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
set_ae_mode_srv_ = node_->create_service<SetString>(
|
||||||
|
"set_ae_mode", [this](const std::shared_ptr<SetString::Request> request,
|
||||||
|
std::shared_ptr<SetString::Response> response) {
|
||||||
|
setAEModeCallback(request, response);
|
||||||
});
|
});
|
||||||
read_customerdata_srv_ = node_->create_service<GetString>(
|
set_sports_mode_srv_ = node_->create_service<SetBool>(
|
||||||
"read_customer_data", [this](const std::shared_ptr<GetString::Request> request,
|
"set_sports_mode", [this](const std::shared_ptr<SetBool::Request> request,
|
||||||
std::shared_ptr<GetString::Response> response) {
|
std::shared_ptr<SetBool::Response> response) {
|
||||||
readCustomerDataCallback(request, response);
|
setSportsModeCallback(request, response);
|
||||||
});
|
|
||||||
set_user_calib_params_srv_ = node_->create_service<SetUserCalibParams>(
|
|
||||||
"set_user_calib_params", [this](const std::shared_ptr<SetUserCalibParams::Request> request,
|
|
||||||
std::shared_ptr<SetUserCalibParams::Response> response) {
|
|
||||||
setUserCalibParamsCallback(request, response);
|
|
||||||
});
|
|
||||||
get_user_calib_params_srv_ = node_->create_service<GetUserCalibParams>(
|
|
||||||
"get_user_calib_params", [this](const std::shared_ptr<GetUserCalibParams::Request> request,
|
|
||||||
std::shared_ptr<GetUserCalibParams::Response> response) {
|
|
||||||
getUserCalibParamsCallback(request, response);
|
|
||||||
});
|
});
|
||||||
set_streams_enable_srv_ = node_->create_service<SetBool>(
|
set_streams_enable_srv_ = node_->create_service<SetBool>(
|
||||||
"set_streams_enable", [this](const std::shared_ptr<SetBool::Request> request,
|
"set_streams_enable", [this](const std::shared_ptr<SetBool::Request> request,
|
||||||
@@ -1453,4 +1465,37 @@ void OBCameraNode::getUserCalibParamsCallback(
|
|||||||
response->message = "exception occurred";
|
response->message = "exception occurred";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
void OBCameraNode::setAEModeCallback(const std::shared_ptr<SetString::Request>& request,
|
||||||
|
std::shared_ptr<SetString::Response>& response) {
|
||||||
|
try {
|
||||||
|
if (device_->isPropertySupported(OB_PROP_COLOR_AE_MODE_INT, OB_PERMISSION_WRITE) &&
|
||||||
|
(request->data == "depthbased" || request->data == "colorbased")) {
|
||||||
|
device_->setIntProperty(OB_PROP_COLOR_AE_MODE_INT, request->data == "depthbased" ? 0 : 1);
|
||||||
|
response->success = true;
|
||||||
|
response->message = "set AE mode success";
|
||||||
|
} else {
|
||||||
|
response->success = false;
|
||||||
|
response->message = "set AE mode failed";
|
||||||
|
}
|
||||||
|
} catch (...) {
|
||||||
|
response->success = false;
|
||||||
|
response->message = "exception occurred";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void OBCameraNode::setSportsModeCallback(const std::shared_ptr<SetBool::Request>& request,
|
||||||
|
std::shared_ptr<SetBool::Response>& response) {
|
||||||
|
try {
|
||||||
|
if (device_->isPropertySupported(OB_PROP_COLOR_FAST_AE_BOOL, OB_PERMISSION_WRITE)) {
|
||||||
|
device_->setIntProperty(OB_PROP_COLOR_FAST_AE_BOOL, request->data ? 1 : 0);
|
||||||
|
response->success = true;
|
||||||
|
response->message = "set sports mode success";
|
||||||
|
} else {
|
||||||
|
response->success = false;
|
||||||
|
response->message = "set sports mode failed";
|
||||||
|
}
|
||||||
|
} catch (...) {
|
||||||
|
response->success = false;
|
||||||
|
response->message = "exception occurred";
|
||||||
|
}
|
||||||
|
}
|
||||||
} // namespace orbbec_camera
|
} // namespace orbbec_camera
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ void listSensorProfiles(const std::shared_ptr<ob::Device>& device) {
|
|||||||
auto profile_list = sensor->getStreamProfileList();
|
auto profile_list = sensor->getStreamProfileList();
|
||||||
for (size_t j = 0; j < profile_list->getCount(); j++) {
|
for (size_t j = 0; j < profile_list->getCount(); j++) {
|
||||||
auto origin_profile = profile_list->getProfile(j);
|
auto origin_profile = profile_list->getProfile(j);
|
||||||
if (sensor->getType() == OB_SENSOR_DEPTH && pid == 0x0840) {
|
if (sensor->getType() == OB_SENSOR_DEPTH && pid == GEMINI_305_PID) {
|
||||||
// Gemini 305
|
// Gemini 305
|
||||||
auto profile = origin_profile->as<ob::VideoStreamProfile>();
|
auto profile = origin_profile->as<ob::VideoStreamProfile>();
|
||||||
std::cout << magic_enum::enum_name(sensor->getType()) << " profile: " << profile->getWidth()
|
std::cout << magic_enum::enum_name(sensor->getType()) << " profile: " << profile->getWidth()
|
||||||
|
|||||||
Reference in New Issue
Block a user