8 #include "depthai/depthai.hpp" 14 #include <camera_info_manager/camera_info_manager.hpp> 15 #include <image_transport/image_transport.hpp> 17 #include "rclcpp/rclcpp.hpp" 18 #include "sensor_msgs/msg/camera_info.hpp" 19 #include "sensor_msgs/msg/image.hpp" 20 #include "std_msgs/msg/header.hpp" 27 #include <boost/make_shared.hpp> 28 #include <boost/shared_ptr.hpp> 30 #include "sensor_msgs/Image.h" 38 namespace StdMsgs = std_msgs::msg;
40 using ImagePtr = ImageMsgs::Image::SharedPtr;
49 template <
class RosMsg,
class SimMsg>
52 using ConvertFunc = std::function<void(std::shared_ptr<SimMsg>, std::deque<RosMsg>&)>;
55 using CustomPublisher =
typename std::conditional<std::is_same<RosMsg, ImageMsgs::Image>::value,
56 std::shared_ptr<image_transport::Publisher>,
57 typename rclcpp::Publisher<RosMsg>::SharedPtr>::type;
60 std::shared_ptr<rclcpp::Node> node,
63 rclcpp::QoS qosSetting = rclcpp::QoS(rclcpp::KeepLast(1)).transient_local().reliable());
66 std::shared_ptr<rclcpp::Node> node,
69 size_t qosHistoryDepth,
70 std::string cameraParamUri =
"",
71 std::string cameraName =
"");
74 std::shared_ptr<rclcpp::Node> node,
77 size_t qosHistoryDepth,
78 ImageMsgs::CameraInfo cameraInfoData,
79 std::string cameraName);
84 std::shared_ptr<image_transport::Publisher>
advertise(
int queueSize, std::true_type);
89 typename rclcpp::Publisher<RosMsg>::SharedPtr
advertise(
int queueSize, std::false_type);
92 conditional<std::is_same<RosMsg, ImageMsgs::Image>::value, std::shared_ptr<image_transport::Publisher>, std::shared_ptr<rosOrigin::Publisher> >::type;
99 std::string cameraParamUri =
"",
100 std::string cameraName =
"");
104 std::string rosTopic,
107 ImageMsgs::CameraInfo cameraInfoData,
108 std::string cameraName);
113 std::shared_ptr<image_transport::Publisher>
advertise(
int queueSize, std::true_type);
118 std::shared_ptr<rosOrigin::Publisher>
advertise(
int queueSize, std::false_type);
137 void daiCallback(std::string name, std::shared_ptr<ADatatype> data);
144 std::shared_ptr<rclcpp::Node> _node;
162 template <
class RosMsg,
class SimMsg>
166 template <
class RosMsg,
class SimMsg>
168 std::shared_ptr<rclcpp::Node> node,
169 std::string rosTopic,
171 rclcpp::QoS qosSetting)
176 template <
class RosMsg,
class SimMsg>
178 std::shared_ptr<rclcpp::Node> node,
179 std::string rosTopic,
181 size_t qosHistoryDepth,
182 std::string cameraParamUri,
183 std::string cameraName)
194 template <
class RosMsg,
class SimMsg>
196 std::shared_ptr<rclcpp::Node> node,
197 std::string rosTopic,
199 size_t qosHistoryDepth,
200 ImageMsgs::CameraInfo cameraInfoData,
201 std::string cameraName)
212 template <
class RosMsg,
class SimMsg>
214 return _node->create_publisher<RosMsg>(
_rosTopic, queueSize);
217 template <
class RosMsg,
class SimMsg>
232 template <
class RosMsg,
class SimMsg>
235 std::string rosTopic,
238 std::string cameraParamUri,
239 std::string cameraName)
251 template <
class RosMsg,
class SimMsg>
254 std::string rosTopic,
257 ImageMsgs::CameraInfo cameraInfoData,
258 std::string cameraName)
270 template <
class RosMsg,
class SimMsg>
275 template <
class RosMsg,
class SimMsg>
288 template <
class RosMsg,
class SimMsg>
305 template <
class RosMsg,
class SimMsg>
308 auto daiDataPtr = std::dynamic_pointer_cast<SimMsg>(data);
312 template <
class RosMsg,
class SimMsg>
316 "addPublisherCallback() function adds a callback to the" 317 "depthai which handles the publishing so no need to start" 318 "the thread using startPublisherThread() ");
322 int messageCounter = 0;
323 while(rosOrigin::ok()) {
326 if(daiDataPtr ==
nullptr) {
328 if(messageCounter > 2000000) {
336 if(messageCounter != 0) {
344 template <
class RosMsg,
class SimMsg>
350 template <
class RosMsg,
class SimMsg>
352 std::deque<RosMsg> opMsgs;
354 int infoSubCount = 0, mainSubCount = 0;
362 infoSubCount = _node->count_subscribers(
_cameraName +
"/camera_info");
364 mainSubCount = _node->count_subscribers(
_rosTopic);
367 if(mainSubCount > 0 || infoSubCount > 0) {
370 while(opMsgs.size()) {
371 RosMsg currMsg = opMsgs.front();
372 if(mainSubCount > 0) {
376 if(infoSubCount > 0) {
382 localCameraInfo.header.seq = currMsg.header.seq;
384 localCameraInfo.header.stamp = currMsg.header.stamp;
385 localCameraInfo.header.frame_id = currMsg.header.frame_id;
393 template <
class RosMsg,
class SimMsg>
void publishHelper(std::shared_ptr< SimMsg > inData)
CustomPublisher _rosPublisher
std::unique_ptr< camera_info_manager::CameraInfoManager > _camInfoManager
ImageMsgs::CameraInfo _cameraInfoData
std::shared_ptr< image_transport::Publisher > advertise(int queueSize, std::true_type)
Publisher advertise(const std::string &base_topic, uint32_t queue_size, bool latch=false)
typename std::conditional< std::is_same< RosMsg, ImageMsgs::Image >::value, std::shared_ptr< image_transport::Publisher >, std::shared_ptr< rosOrigin::Publisher > >::type CustomPublisher
std::string _camInfoFrameId
void addPublisherCallback()
void daiCallback(std::string name, std::shared_ptr< ADatatype > data)
std::shared_ptr< rosOrigin::Publisher > _cameraInfoPublisher
ImageMsgs::ImagePtr ImagePtr
Publisher advertise(const std::string &topic, uint32_t queue_size, bool latch=false)
std::function< void(std::shared_ptr< SimMsg >, std::deque< RosMsg > &)> ConvertFunc
BridgePublisher(std::shared_ptr< dai::DataOutputQueue > daiMessageQueue, rosOrigin::NodeHandle nh, std::string rosTopic, ConvertFunc converter, int queueSize, std::string cameraParamUri="", std::string cameraName="")
rosOrigin::NodeHandle _nh
void startPublisherThread()
image_transport::ImageTransport _it
std::thread _readingThread
static const std::string LOG_TAG
std::shared_ptr< dai::DataOutputQueue > _daiMessageQueue
std::string _cameraParamUri