Program Listing for File processor_factories.hpp
↰ Return to documentation for file (include/ros2_ouster/OS1/processor_factories.hpp
)
// Copyright 2020, Steve Macenski
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef ROS2_OUSTER__OS1__PROCESSOR_FACTORIES_HPP_
#define ROS2_OUSTER__OS1__PROCESSOR_FACTORIES_HPP_
#include <cstdint>
#include <string>
#include <map>
#include <utility>
#include "rclcpp/qos.hpp"
#include "ros2_ouster/conversions.hpp"
#include "ros2_ouster/string_utils.hpp"
#include "ros2_ouster/OS1/processors/image_processor.hpp"
#include "ros2_ouster/OS1/processors/imu_processor.hpp"
#include "ros2_ouster/OS1/processors/pointcloud_processor.hpp"
#include "ros2_ouster/OS1/processors/scan_processor.hpp"
namespace ros2_ouster
{
constexpr std::uint32_t OS1_PROC_IMG = (1 << 0);
constexpr std::uint32_t OS1_PROC_PCL = (1 << 1);
constexpr std::uint32_t OS1_PROC_IMU = (1 << 2);
constexpr std::uint32_t OS1_PROC_SCAN = (1 << 3);
constexpr std::uint32_t OS1_DEFAULT_PROC_MASK =
OS1_PROC_IMG | OS1_PROC_PCL | OS1_PROC_IMU | OS1_PROC_SCAN;
inline std::uint32_t
toProcMask(const std::string & mask_str)
{
std::uint32_t mask = 0x0;
auto tokens = ros2_ouster::split(mask_str, '|');
for (auto & token : tokens) {
if (token == "IMG") {
mask |= ros2_ouster::OS1_PROC_IMG;
} else if (token == "PCL") {
mask |= ros2_ouster::OS1_PROC_PCL;
} else if (token == "IMU") {
mask |= ros2_ouster::OS1_PROC_IMU;
} else if (token == "SCAN") {
mask |= ros2_ouster::OS1_PROC_SCAN;
}
}
return mask;
}
inline ros2_ouster::DataProcessorInterface * createImageProcessor(
const rclcpp_lifecycle::LifecycleNode::SharedPtr node,
const ros2_ouster::Metadata & mdata,
const std::string & frame,
const rclcpp::QoS & qos)
{
return new OS1::ImageProcessor(node, mdata, frame, qos);
}
inline ros2_ouster::DataProcessorInterface * createPointcloudProcessor(
const rclcpp_lifecycle::LifecycleNode::SharedPtr node,
const ros2_ouster::Metadata & mdata,
const std::string & frame,
const rclcpp::QoS & qos)
{
return new OS1::PointcloudProcessor(node, mdata, frame, qos);
}
inline ros2_ouster::DataProcessorInterface * createIMUProcessor(
const rclcpp_lifecycle::LifecycleNode::SharedPtr node,
const ros2_ouster::Metadata & mdata,
const std::string & frame,
const rclcpp::QoS & qos)
{
return new OS1::IMUProcessor(node, mdata, frame, qos);
}
inline ros2_ouster::DataProcessorInterface * createScanProcessor(
const rclcpp_lifecycle::LifecycleNode::SharedPtr node,
const ros2_ouster::Metadata & mdata,
const std::string & frame,
const rclcpp::QoS & qos)
{
return new OS1::ScanProcessor(node, mdata, frame, qos);
}
inline std::multimap<ClientState, DataProcessorInterface *> createProcessors(
const rclcpp_lifecycle::LifecycleNode::SharedPtr node,
const ros2_ouster::Metadata & mdata,
const std::string & imu_frame,
const std::string & laser_frame,
const rclcpp::QoS & qos,
std::uint32_t mask = ros2_ouster::OS1_DEFAULT_PROC_MASK)
{
std::multimap<ClientState, DataProcessorInterface *> data_processors;
if ((mask & ros2_ouster::OS1_PROC_IMG) == ros2_ouster::OS1_PROC_IMG) {
data_processors.insert(
std::pair<ClientState, DataProcessorInterface *>(
ClientState::LIDAR_DATA, createImageProcessor(
node, mdata, laser_frame, qos)));
}
if ((mask & ros2_ouster::OS1_PROC_PCL) == ros2_ouster::OS1_PROC_PCL) {
data_processors.insert(
std::pair<ClientState, DataProcessorInterface *>(
ClientState::LIDAR_DATA, createPointcloudProcessor(
node, mdata, laser_frame, qos)));
}
if ((mask & ros2_ouster::OS1_PROC_IMU) == ros2_ouster::OS1_PROC_IMU) {
data_processors.insert(
std::pair<ClientState, DataProcessorInterface *>(
ClientState::IMU_DATA, createIMUProcessor(
node, mdata, imu_frame, qos)));
}
if ((mask & ros2_ouster::OS1_PROC_SCAN) == ros2_ouster::OS1_PROC_SCAN) {
data_processors.insert(
std::pair<ClientState, DataProcessorInterface *>(
ClientState::LIDAR_DATA, createScanProcessor(
node, mdata, laser_frame, qos)));
}
return data_processors;
}
} // namespace ros2_ouster
#endif // ROS2_OUSTER__OS1__PROCESSOR_FACTORIES_HPP_