Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

added camera reset service #227

Open
wants to merge 1 commit into
base: humble-devel
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions spinnaker_camera_driver/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,7 @@ set(ROS_DEPENDENCIES
"rclcpp_components"
"sensor_msgs"
"std_msgs"
"std_srvs"
"camera_info_manager"
"image_transport"
"flir_camera_msgs")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ find_dependency(image_transport)
find_dependency(flir_camera_msgs)
find_dependency(sensor_msgs)
find_dependency(std_msgs)
find_dependency(std_srvs)

# Add the targets file
include("${CMAKE_CURRENT_LIST_DIR}/spinnaker_camera_driverTargets.cmake")
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
#include <spinnaker_camera_driver/spinnaker_wrapper.hpp>
#include <spinnaker_camera_driver/synchronizer.hpp>
#include <std_msgs/msg/float64.hpp>
#include <std_srvs/srv/trigger.hpp>
#include <thread>

namespace spinnaker_camera_driver
Expand Down Expand Up @@ -88,6 +89,11 @@ class Camera
void printStatus();
void checkSubscriptions();
void doPublish(const ImageConstPtr & im);
void resetCallback(
const std::shared_ptr<std_srvs::srv::Trigger::Request> req,
const std::shared_ptr<std_srvs::srv::Trigger::Response> res);
void delayedStart();

rclcpp::Logger get_logger()
{
return rclcpp::get_logger(
Expand Down Expand Up @@ -128,6 +134,7 @@ class Camera
image_transport::ImageTransport * imageTransport_;
image_transport::CameraPublisher pub_;
rclcpp::Publisher<flir_camera_msgs::msg::ImageMetaData>::SharedPtr metaPub_;
rclcpp::Service<std_srvs::srv::Trigger>::SharedPtr resetService_;
std::string serial_;
std::string name_;
std::string cameraInfoURL_;
Expand Down Expand Up @@ -156,6 +163,8 @@ class Camera
rclcpp::Node::OnSetParametersCallbackHandle::SharedPtr callbackHandle_; // keep alive callbacks
rclcpp::TimerBase::SharedPtr statusTimer_;
rclcpp::TimerBase::SharedPtr checkSubscriptionsTimer_;
rclcpp::TimerBase::SharedPtr delayedStartTimer_;
int restartDelay_{10};
bool cameraRunning_{false};
std::mutex mutex_;
std::condition_variable cv_;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ class SpinnakerWrapper
bool deInitCamera();
bool startCamera(const SpinnakerWrapper::Callback & cb);
bool stopCamera();
void resetCamera();
void setDebug(bool b);
void setComputeBrightness(bool b);
void setAcquisitionTimeout(double sec);
Expand Down
1 change: 1 addition & 0 deletions spinnaker_camera_driver/package.xml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
<depend>rclcpp_components</depend>
<depend>sensor_msgs</depend>
<depend>std_msgs</depend>
<depend>std_srvs</depend>

<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>
Expand Down
33 changes: 32 additions & 1 deletion spinnaker_camera_driver/src/camera.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,7 @@ void Camera::readParameters()
parameterFile_ = safe_declare<std::string>(prefix_ + "parameter_file", "parameters.yaml");
connectWhileSubscribed_ = safe_declare<bool>(prefix_ + "connect_while_subscribed", false);
enableExternalControl_ = safe_declare<bool>(prefix_ + "enable_external_control", false);
restartDelay_ = safe_declare<int>(prefix_ + "restart_delay", 10);
callbackHandle_ = node_->add_on_set_parameters_callback(
std::bind(&Camera::parameterChanged, this, std::placeholders::_1));
}
Expand Down Expand Up @@ -478,6 +479,34 @@ void Camera::controlCallback(const flir_camera_msgs::msg::CameraControl::UniqueP
}
}

void Camera::resetCallback(
const std::shared_ptr<std_srvs::srv::Trigger::Request>,
const std::shared_ptr<std_srvs::srv::Trigger::Response> res)
{
if (wrapper_) {
const bool cameraRunning = cameraRunning_;
stopCamera(); // stops the camera
wrapper_->resetCamera();
if (cameraRunning) {
LOG_INFO("restarting camera in " << restartDelay_ << " seconds");
delayedStartTimer_ = rclcpp::create_timer(
node_, node_->get_clock(), rclcpp::Duration(restartDelay_, 0),
std::bind(&Camera::delayedStart, this));
}
res->success = true;
res->message = "camera reset!";
} else {
res->success = false;
res->message = "camera not initialized!";
}
}

void Camera::delayedStart()
{
delayedStartTimer_->cancel();
startCamera();
}

void Camera::processImage(const ImageConstPtr & im)
{
{
Expand Down Expand Up @@ -689,7 +718,9 @@ bool Camera::start()
metaMsg_.header.frame_id = frameId_;

pub_ = imageTransport_->advertiseCamera("~/" + topicPrefix_ + "image_raw", qosDepth_);

resetService_ = node_->create_service<std_srvs::srv::Trigger>(
"~/" + prefix_ + "reset",
std::bind(&Camera::resetCallback, this, std::placeholders::_1, std::placeholders::_2));
wrapper_ = std::make_shared<spinnaker_camera_driver::SpinnakerWrapper>();
wrapper_->setDebug(debug_);
wrapper_->setComputeBrightness(computeBrightness_);
Expand Down
1 change: 1 addition & 0 deletions spinnaker_camera_driver/src/spinnaker_wrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ std::string SpinnakerWrapper::execute(const std::string & nodeName)
throw SpinnakerWrapper::Exception(e.what());
}
}
void SpinnakerWrapper::resetCamera() { wrapperImpl_->resetCamera(); }

void SpinnakerWrapper::setComputeBrightness(bool b) { wrapperImpl_->setComputeBrightness(b); }

Expand Down
11 changes: 11 additions & 0 deletions spinnaker_camera_driver/src/spinnaker_wrapper_impl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -473,6 +473,17 @@ bool SpinnakerWrapperImpl::stopCamera()
return (false);
}

void SpinnakerWrapperImpl::resetCamera()
{
if (camera_) {
try {
camera_->DeviceReset();
} catch (const Spinnaker::Exception & e) {
std::cerr << "reset failed with spinnaker error: " << e.what() << std::endl;
}
}
}

void SpinnakerWrapperImpl::setPixelFormat(const std::string & pixFmt)
{
pixelFormat_ = pixel_format::from_nodemap_string(pixFmt);
Expand Down
1 change: 1 addition & 0 deletions spinnaker_camera_driver/src/spinnaker_wrapper_impl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ class SpinnakerWrapperImpl : public Spinnaker::ImageEventHandler

bool startCamera(const SpinnakerWrapper::Callback & cb);
bool stopCamera();
void resetCamera();

double getReceiveFrameRate() const;
double getIncompleteRate();
Expand Down
Loading