feat: add services support for auto exposure and sports modes in OBCameraNode

This commit is contained in:
ob-yalian
2026-01-13 17:23:08 +08:00
parent 835295b9aa
commit 181d34fb5c
4 changed files with 78 additions and 24 deletions
+6 -5
View File
@@ -968,15 +968,16 @@ void OBCameraNode::setupDevices() {
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 (device_->isPropertySupported(OB_PROP_COLOR_AE_MODE_INT, OB_PERMISSION_WRITE)) {
device_->setIntProperty(OB_PROP_COLOR_AE_MODE_INT, enable_sports_mode_);
if (device_->isPropertySupported(OB_PROP_COLOR_FAST_AE_BOOL, OB_PERMISSION_WRITE)) {
device_->setIntProperty(OB_PROP_COLOR_FAST_AE_BOOL, (enable_sports_mode_ ? 0 : 1));
RCLCPP_INFO_STREAM(logger_,
"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)) {
auto ae_mode = ae_mode_ == "depthbased" ? 0 : 1;
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>();
} else {
auto pid = device_->getDeviceInfo()->getPid();
if (pid == 0x0840 && elem == DEPTH) {
if (pid == GEMINI_305_PID && elem == DEPTH) {
// Gemini 305
OBDownSampleConfig conf;
conf.originWidth = width_[elem];
+63 -18
View File
@@ -231,25 +231,37 @@ void OBCameraNode::setupCameraCtrlServices() {
std::shared_ptr<SetBool::Response> response) {
sendSoftwareTriggerCallback(request, response);
});
write_customerdata_srv_ = node_->create_service<SetString>(
"write_customer_data", [this](const std::shared_ptr<SetString::Request> request,
std::shared_ptr<SetString::Response> response) {
writeCustomerDataCallback(request, response);
if (device_->getDeviceInfo()->getPid() == GEMINI_435Le_PID) {
write_customerdata_srv_ = node_->create_service<SetString>(
"write_customer_data", [this](const std::shared_ptr<SetString::Request> request,
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>(
"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_sports_mode_srv_ = node_->create_service<SetBool>(
"set_sports_mode", [this](const std::shared_ptr<SetBool::Request> request,
std::shared_ptr<SetBool::Response> response) {
setSportsModeCallback(request, response);
});
set_streams_enable_srv_ = node_->create_service<SetBool>(
"set_streams_enable", [this](const std::shared_ptr<SetBool::Request> request,
@@ -1453,4 +1465,37 @@ void OBCameraNode::getUserCalibParamsCallback(
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