Skip to content

Commit 2f74bf5

Browse files
authored
APG-1816 Add lifecycle service to change state of camera pipelines/streaming (#9)
1 parent c51476f commit 2f74bf5

File tree

7 files changed

+75
-2
lines changed

7 files changed

+75
-2
lines changed

orbbec_camera/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ set(dependencies
3232
camera_info_manager
3333
image_transport
3434
image_publisher
35+
lifecycle_msgs
3536
OpenCV
3637
orbbec_camera_msgs
3738
rclcpp

orbbec_camera/include/orbbec_camera/ob_camera_node.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
#include <std_srvs/srv/set_bool.hpp>
3838
#include <std_srvs/srv/empty.hpp>
3939
#include <diagnostic_updater/diagnostic_updater.hpp>
40+
#include <lifecycle_msgs/srv/change_state.hpp>
4041

4142
#include <sensor_msgs/msg/camera_info.hpp>
4243
#include <camera_info_manager/camera_info_manager.hpp>
@@ -315,7 +316,6 @@ class OBCameraNode {
315316
std::shared_ptr<SetFilter ::Response>& response);
316317
void setSYNCHostimeCallback(const std::shared_ptr<std_srvs::srv::SetBool::Request>& request,
317318
std::shared_ptr<std_srvs::srv::SetBool::Response>& response);
318-
319319
void resetCaptureServiceVariables();
320320
void sendSoftwareTriggerCallback(const std::shared_ptr<CameraTrigger::Request>& request,
321321
std::shared_ptr<CameraTrigger::Response>& response);
@@ -339,6 +339,10 @@ class OBCameraNode {
339339

340340
void setIRLongExposureCallback(const std::shared_ptr<std_srvs::srv::SetBool::Request>& request,
341341
std::shared_ptr<std_srvs::srv::SetBool::Response>& response);
342+
343+
void handleChangeStateRequest(
344+
const std::shared_ptr<lifecycle_msgs::srv::ChangeState::Request> request,
345+
std::shared_ptr<lifecycle_msgs::srv::ChangeState::Response> response);
342346

343347
void publishPointCloud(const std::shared_ptr<ob::FrameSet>& frame_set);
344348

@@ -502,6 +506,8 @@ class OBCameraNode {
502506
rclcpp::Service<CameraTrigger>::SharedPtr send_service_trigger_srv_;
503507
rclcpp::Service<SetFilter>::SharedPtr set_filter_srv_;
504508
rclcpp::Service<CameraTrigger>::SharedPtr capture_camera_images_srv_;
509+
// Lifecycle Service
510+
rclcpp::Service<lifecycle_msgs::srv::ChangeState>::SharedPtr change_state_srv_;
505511

506512

507513
std::atomic_bool service_capture_started_{false};

orbbec_camera/include/orbbec_camera/ob_camera_node_driver.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,5 +118,6 @@ class OBCameraNodeDriver : public rclcpp::Node {
118118
std::string extension_path_;
119119
static backward::SignalHandling sh; // for stack trace
120120
std::string upgrade_firmware_;
121+
bool enable_streams_on_startup_ {true};
121122
};
122123
} // namespace orbbec_camera

orbbec_camera/package.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
<depend>rclcpp_components</depend>
1818
<depend>cv_bridge</depend>
1919
<depend>camera_info_manager</depend>
20+
<depend>lifecycle_msgs</depend>
2021
<depend>orbbec_camera_msgs</depend>
2122
<depend>builtin_interfaces</depend>
2223
<depend>rclcpp</depend>

orbbec_camera/src/ob_camera_node.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1387,6 +1387,7 @@ void OBCameraNode::stopStreams() {
13871387
TRY_TO_SET_PROPERTY(setBoolProperty, OB_PROP_FRAME_INTERLEAVE_ENABLE_BOOL,
13881388
interleave_frame_enable_);
13891389
}
1390+
pipeline_started_.store(false);
13901391
}
13911392
} catch (const ob::Error &e) {
13921393
RCLCPP_ERROR_STREAM(logger_, "Failed to stop pipeline: " << e.getMessage());

orbbec_camera/src/ob_camera_node_driver.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ void OBCameraNodeDriver::init() {
163163
net_device_ip_ = declare_parameter<std::string>("net_device_ip", "");
164164
net_device_port_ = static_cast<int>(declare_parameter<int>("net_device_port", 0));
165165
enumerate_net_device_ = declare_parameter<bool>("enumerate_net_device", false);
166+
enable_streams_on_startup_ = declare_parameter<bool>("enable_streams_on_startup", true);
166167
uvc_backend_ = declare_parameter<std::string>("uvc_backend", "libuvc");
167168
if (uvc_backend_ == "libuvc") {
168169
ctx_->setUvcBackendType(OB_UVC_BACKEND_TYPE_LIBUVC);
@@ -505,7 +506,9 @@ void OBCameraNodeDriver::initializeDevice(const std::shared_ptr<ob::Device> &dev
505506
}
506507
if (ob_camera_node_) {
507508
ob_camera_node_->startIMU();
508-
ob_camera_node_->startStreams();
509+
if (enable_streams_on_startup_) {
510+
ob_camera_node_->startStreams();
511+
}
509512
} else {
510513
RCLCPP_INFO_STREAM(logger_, "ob_camera_node_ is nullptr");
511514
}

orbbec_camera/src/ros_service.cpp

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,9 @@ void OBCameraNode::setupCameraCtrlServices() {
221221
std::shared_ptr<SetString::Response> response) {
222222
setReadCustomerData(request, response);
223223
});
224+
change_state_srv_ = node_->create_service<lifecycle_msgs::srv::ChangeState>(
225+
"change_state", std::bind(&OBCameraNode::handleChangeStateRequest, this,
226+
std::placeholders::_1, std::placeholders::_2));
224227
}
225228

226229
void OBCameraNode::setExposureCallback(const std::shared_ptr<SetInt32::Request>& request,
@@ -1069,6 +1072,63 @@ void OBCameraNode::resetCaptureServiceVariables() {
10691072
number_of_depth_frames_captured_ = 0;
10701073
}
10711074

1075+
void OBCameraNode::handleChangeStateRequest(
1076+
const std::shared_ptr<lifecycle_msgs::srv::ChangeState::Request> request,
1077+
std::shared_ptr<lifecycle_msgs::srv::ChangeState::Response> response) {
1078+
1079+
RCLCPP_INFO(logger_, "Received request to change state '%d' with label '%s'",
1080+
request->transition.id, request->transition.label.c_str());
1081+
1082+
response->success = true;
1083+
if(request->transition.id == lifecycle_msgs::msg::Transition::TRANSITION_ACTIVATE) {
1084+
RCLCPP_INFO_STREAM(logger_, "Recieved request to turn ON camera streams");
1085+
if (pipeline_started_){
1086+
RCLCPP_WARN_STREAM(logger_, "Camera streams already ON");
1087+
response->success = true;
1088+
return;
1089+
}
1090+
try {
1091+
setupProfiles();
1092+
startStreams();
1093+
RCLCPP_INFO_STREAM(logger_, "Camera streams are now ON");
1094+
} catch (const ob::Error& e) {
1095+
response->success = false;
1096+
RCLCPP_ERROR_STREAM(logger_, "Failed to start camera streams: " << e.getMessage());
1097+
} catch (const std::exception& e) {
1098+
response->success = false;
1099+
RCLCPP_ERROR_STREAM(logger_, "Failed to start camera streams: " << e.what());
1100+
} catch (...) {
1101+
response->success = false;
1102+
RCLCPP_ERROR_STREAM(logger_, "Failed to start camera streams: Unknown Error");
1103+
}
1104+
}
1105+
else if(request->transition.id == lifecycle_msgs::msg::Transition::TRANSITION_DEACTIVATE) {
1106+
RCLCPP_INFO_STREAM(logger_, "Recieved request to turn OFF camera streams");
1107+
if (!pipeline_ || !pipeline_started_){
1108+
RCLCPP_WARN_STREAM(logger_, "Camera streams already OFF");
1109+
response->success = true;
1110+
return;
1111+
}
1112+
try {
1113+
stopStreams();
1114+
RCLCPP_INFO_STREAM(logger_, "Camera streams are now OFF");
1115+
} catch (const ob::Error& e) {
1116+
response->success = false;
1117+
RCLCPP_ERROR_STREAM(logger_, "Failed to stop camera streams: " << e.getMessage());
1118+
} catch (const std::exception& e) {
1119+
response->success = false;
1120+
RCLCPP_ERROR_STREAM(logger_, "Failed to stop camera streams: " << e.what());
1121+
} catch (...) {
1122+
response->success = false;
1123+
RCLCPP_ERROR_STREAM(logger_, "Failed to stop camera streams: Unknown Error");
1124+
}
1125+
}
1126+
else {
1127+
response->success = false;
1128+
RCLCPP_ERROR_STREAM(logger_, "Unsupported transition ID: " << request->transition.id);
1129+
}
1130+
}
1131+
10721132
void OBCameraNode::sendSoftwareTriggerCallback(
10731133
const std::shared_ptr<CameraTrigger::Request>& request,
10741134
std::shared_ptr<CameraTrigger::Response>& response) {

0 commit comments

Comments
 (0)