16#ifndef APOLLO_LIDAR_COMPONENT_BASE_IMPL_H
17#define APOLLO_LIDAR_COMPONENT_BASE_IMPL_H
22#include "modules/common_msgs/sensor_msgs/pointcloud.pb.h"
23#include "modules/drivers/lidar/common/proto/lidar_config_base.pb.h"
34template <
typename ScanType,
typename ComponentType = apollo::cyber::NullType>
42 const std::shared_ptr<ScanType>& scan_message) = 0;
51 virtual bool WriteScan(
const std::shared_ptr<ScanType>& scan_message);
57 virtual std::shared_ptr<apollo::cyber::base::ArenaQueue<PointXYZIT>>
69 std::shared_ptr<cyber::Writer<ScanType>> scan_writer_ =
nullptr;
70 std::shared_ptr<cyber::Reader<ScanType>> scan_reader_ =
nullptr;
71 std::shared_ptr<cyber::Writer<PointCloud>> pcd_writer_ =
nullptr;
74 std::atomic<int> pcd_sequence_num_{0};
77template <
typename ScanType,
typename ComponentType>
80 pcd_writer_ = this->node_->template CreateWriter<PointCloud>(
85 LidarConfigBase_SourceType_RAW_PACKET) {
86 scan_reader_ = this->node_->template CreateReader<ScanType>(
89 std::placeholders::_1));
93 frame_id_ = lidar_config_base.
frame_id();
95 default_reserved_points_num_ =
109template <
typename ScanType,
typename ComponentType>
113 LidarConfigBase_SourceType_ONLINE_LIDAR) {
114 scan_writer_ = this->node_->template CreateWriter<ScanType>(
121template <
typename ScanType,
typename ComponentType>
122std::shared_ptr<ScanType>
124 if (scan_writer_ ==
nullptr) {
125 return std::make_shared<ScanType>();
127 return scan_writer_->AcquireMessage();
130template <
typename ScanType,
typename ComponentType>
132 const std::shared_ptr<ScanType>& scan_message) {
134 return scan_writer_->Write(scan_message);
139template <
typename ScanType,
typename ComponentType>
140std::shared_ptr<apollo::cyber::base::ArenaQueue<PointXYZIT>>
142 std::shared_ptr<apollo::cyber::base::ArenaQueue<PointXYZIT>> ret;
143 auto channel_id = pcd_writer_->GetChannelId();
146 apollo::cyber::transport::ProtobufArenaManager::Instance();
147 if (!arena_manager->Enable()) {
148 ADEBUG <<
"arena manager enable failed.";
153 ret = std::shared_ptr<apollo::cyber::base::ArenaQueue<PointXYZIT>>(
156 arena_manager->GetAvailableBuffer(channel_id)),
162template <
typename ScanType,
typename ComponentType>
163std::shared_ptr<PointCloud>
165 std::shared_ptr<PointCloud> new_pcd_object = pcd_writer_->AcquireMessage();
166 new_pcd_object->Clear();
167 new_pcd_object->mutable_point()->Reserve(default_reserved_points_num_);
168 return new_pcd_object;
171template <
typename ScanType,
typename ComponentType>
173 const std::shared_ptr<PointCloud>& point_cloud) {
174 point_cloud->mutable_header()->set_frame_id(frame_id_);
175 point_cloud->mutable_header()->set_sequence_num(
176 pcd_sequence_num_.fetch_add(1));
177 point_cloud->mutable_header()->set_timestamp_sec(
196template <
typename ScanType,
typename ComponentType>
198 std::shared_ptr<PointCloud>& unused_pcd_frame) {
199 unused_pcd_frame->clear_point();
Cyber has builtin time type Time.
virtual bool WritePointCloud(const std::shared_ptr< PointCloud > &point_cloud)
uint32_t default_reserved_points_num_
bool InitConverter(const LidarConfigBase &lidar_config_base)
virtual ~LidarComponentBaseImpl()=default
bool InitPacket(const LidarConfigBase &lidar_config_base)
virtual std::shared_ptr< apollo::cyber::base::ArenaQueue< PointXYZIT > > GetPointQueue()
virtual bool WriteScan(const std::shared_ptr< ScanType > &scan_message)
std::shared_ptr< ScanType > AcquireScanMessage()
static void PcdDefaultCleaner(std::shared_ptr< PointCloud > &unused_pcd_frame)
virtual std::shared_ptr< PointCloud > AllocatePointCloud()
virtual bool InitBase(const LidarConfigBase &lidar_config_base)=0
virtual void ReadScanCallback(const std::shared_ptr< ScanType > &scan_message)=0
#define RETURN_VAL_IF(condition, val)
required string scan_channel
required string point_cloud_channel
required SourceType source_type
optional uint32 default_reserved_points_num