diff --git a/depthai_ros_driver/include/depthai_ros_driver/dai_nodes/sensors/tof.hpp b/depthai_ros_driver/include/depthai_ros_driver/dai_nodes/sensors/tof.hpp index 4c9ace91..0c6ed5eb 100644 --- a/depthai_ros_driver/include/depthai_ros_driver/dai_nodes/sensors/tof.hpp +++ b/depthai_ros_driver/include/depthai_ros_driver/dai_nodes/sensors/tof.hpp @@ -53,12 +53,14 @@ class ToF : public BaseNode { private: std::shared_ptr tofPub; + std::shared_ptr intensityPub; std::shared_ptr tofNode; std::shared_ptr alignNode; std::unique_ptr ph; dai::CameraBoardSocket boardSocket; dai::CameraBoardSocket alignedSocket; std::string tofQName; + std::string intensityQName; bool aligned; }; diff --git a/depthai_ros_driver/src/dai_nodes/sensors/tof.cpp b/depthai_ros_driver/src/dai_nodes/sensors/tof.cpp index 50d064f8..6d4e1f1e 100644 --- a/depthai_ros_driver/src/dai_nodes/sensors/tof.cpp +++ b/depthai_ros_driver/src/dai_nodes/sensors/tof.cpp @@ -42,6 +42,7 @@ ToF::ToF(const std::string& daiNodeName, ToF::~ToF() = default; void ToF::setNames() { tofQName = getName() + "_tof"; + intensityQName = getName() + "_intensity"; } std::shared_ptr ToF::getUnderlyingNode() { return tofNode; @@ -59,6 +60,18 @@ void ToF::setInOut(std::shared_ptr pipeline) { tofPub = setupOutput(pipeline, tofQName, &tofNode->depth, ph->getParam(ParamNames::SYNCED), encConfig); } + + if(ph->getParam("i_publish_intensity_topic")) { + // Use the same encoder settings as ToF output + utils::VideoEncoderConfig intensityEncConfig; + intensityEncConfig.profile = static_cast(ph->getParam(ParamNames::LOW_BANDWIDTH_PROFILE)); + intensityEncConfig.bitrate = ph->getParam(ParamNames::LOW_BANDWIDTH_BITRATE); + intensityEncConfig.frameFreq = ph->getParam(ParamNames::LOW_BANDWIDTH_FRAME_FREQ); + intensityEncConfig.quality = ph->getParam(ParamNames::LOW_BANDWIDTH_QUALITY); + intensityEncConfig.enabled = ph->getParam(ParamNames::LOW_BANDWIDTH); + + intensityPub = setupOutput(pipeline, intensityQName, &tofNode->intensity, ph->getParam(ParamNames::SYNCED), intensityEncConfig); + } } void ToF::setupQueues(std::shared_ptr device) { @@ -89,11 +102,42 @@ void ToF::setupQueues(std::shared_ptr device) { tofPub->setup(device, convConfig, pubConfig); } + + if(ph->getParam("i_publish_intensity_topic")) { + auto tfPrefix = getOpticalFrameName(getSocketName(boardSocket)); + + utils::ImgConverterConfig intensityConvConfig; + intensityConvConfig.tfPrefix = tfPrefix; + intensityConvConfig.getBaseDeviceTimestamp = ph->getParam(ParamNames::GET_BASE_DEVICE_TIMESTAMP); + intensityConvConfig.updateROSBaseTimeOnRosMsg = ph->getParam(ParamNames::UPDATE_ROS_BASE_TIME_ON_ROS_MSG); + intensityConvConfig.lowBandwidth = ph->getParam(ParamNames::LOW_BANDWIDTH); + intensityConvConfig.encoding = dai::ImgFrame::Type::RAW8; + intensityConvConfig.addExposureOffset = ph->getParam(ParamNames::ADD_EXPOSURE_OFFSET); + intensityConvConfig.expOffset = static_cast(ph->getParam(ParamNames::EXPOSURE_OFFSET)); + intensityConvConfig.reverseSocketOrder = ph->getParam(ParamNames::REVERSE_STEREO_SOCKET_ORDER); + + utils::ImgPublisherConfig intensityPubConfig; + intensityPubConfig.daiNodeName = getName(); + intensityPubConfig.topicName = "~/" + getName() + "/intensity"; + intensityPubConfig.lazyPub = ph->getParam(ParamNames::ENABLE_LAZY_PUBLISHER); + intensityPubConfig.socket = ph->getSocketID(); + intensityPubConfig.calibrationFile = ph->getParam(ParamNames::CALIBRATION_FILE); + intensityPubConfig.rectified = false; + intensityPubConfig.width = ph->getParam(ParamNames::WIDTH); + intensityPubConfig.height = ph->getParam(ParamNames::HEIGHT); + intensityPubConfig.maxQSize = ph->getParam(ParamNames::MAX_Q_SIZE); + + intensityPub->setup(device, intensityConvConfig, intensityPubConfig); + } } void ToF::closeQueues() { if(ph->getParam(param_handlers::ParamNames::PUBLISH_TOPIC)) { tofPub->closeQueue(); } + + if(ph->getParam("i_publish_intensity_topic")) { + intensityPub->closeQueue(); + } } void ToF::link(dai::Node::Input& in, int /*linkType*/) { @@ -130,6 +174,9 @@ std::vector> ToF::getPublishers( if(ph->getParam(ParamNames::PUBLISH_TOPIC) && ph->getParam(ParamNames::SYNCED)) { pubs.push_back(tofPub); } + if(ph->getParam("i_publish_intensity_topic") && ph->getParam(ParamNames::SYNCED)) { + pubs.push_back(tofPub); + } return pubs; } diff --git a/depthai_ros_driver/src/param_handlers/tof_param_handler.cpp b/depthai_ros_driver/src/param_handlers/tof_param_handler.cpp index b894105c..9c39e58e 100644 --- a/depthai_ros_driver/src/param_handlers/tof_param_handler.cpp +++ b/depthai_ros_driver/src/param_handlers/tof_param_handler.cpp @@ -22,6 +22,7 @@ ToFParamHandler::ToFParamHandler(std::shared_ptr node, const std:: ToFParamHandler::~ToFParamHandler() = default; void ToFParamHandler::declareParams(std::shared_ptr tof, dai::CameraBoardSocket socket) { declareAndLogParam(ParamNames::PUBLISH_TOPIC, true); + declareAndLogParam("i_publish_intensity_topic", false); declareAndLogParam(ParamNames::SYNCED, false); declareAndLogParam(ParamNames::LOW_BANDWIDTH, false); declareAndLogParam(ParamNames::LOW_BANDWIDTH_PROFILE, 4); diff --git a/depthai_ros_driver/src/pipeline/pipeline_generator.cpp b/depthai_ros_driver/src/pipeline/pipeline_generator.cpp index f2df2d01..0171a376 100644 --- a/depthai_ros_driver/src/pipeline/pipeline_generator.cpp +++ b/depthai_ros_driver/src/pipeline/pipeline_generator.cpp @@ -103,6 +103,10 @@ std::vector> PipelineGenerator::createPipel std::string PipelineGenerator::validatePipeline(std::shared_ptr node, const std::string& typeStr, int sensorNum, const std::string& deviceName) { auto pType = utils::getValFromMap(typeStr, pipelineTypeMap); + if (deviceName == "OAK-FFC-4P" || deviceName == "OAK-FFC-3P") { + RCLCPP_WARN(node->get_logger(), "OAK-FFC-4P/3P device detected. Default pipelines may not work without reconfiguration."); + return typeStr; + } if(deviceName == "OAK-D-SR-POE") { RCLCPP_WARN(node->get_logger(), "OAK-D-SR-POE device detected. Pipeline types other than StereoToF/ToF/RGBToF might not work without reconfiguration."); }