Apollo 10.0
自动驾驶开放平台
seyond_driver.h
浏览该文件的文档.
1/******************************************************************************
2 * Copyright 2024 The Apollo Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *****************************************************************************/
16#pragma once
17
18#include <atomic>
19#include <condition_variable>
20#include <memory>
21#include <mutex>
22#include <string>
23#include <thread>
24#include <vector>
25
26#include "modules/common_msgs/sensor_msgs/pointcloud.pb.h"
27#include "modules/drivers/lidar/seyond/proto/seyond.pb.h"
28
29#include "seyond/sdk_common/inno_lidar_api.h"
30#include "seyond/sdk_common/inno_lidar_other_api.h"
31#include "seyond/sdk_common/inno_lidar_packet.h"
32#include "seyond/sdk_common/inno_lidar_packet_utils.h"
33
34namespace apollo {
35namespace drivers {
36namespace lidar {
37
40
42 std::string device_ip = "";
43 uint32_t port;
44 uint32_t udp_port;
48 double max_range;
49 double min_range;
50 std::string log_level = "";
51 bool raw_packets_mode = false;
52
53 void print() const {
54 inno_log_info("------------------------------------------------------");
55 inno_log_info(" Seyond Lidar Parameters ");
56 inno_log_info("device_ip: %s", device_ip.c_str());
57 inno_log_info("port: %d", port);
58 inno_log_info("udp_port: %d", udp_port);
59 inno_log_info("reflectance_mode: %d", reflectance_mode);
60 inno_log_info("multiple_return: %d", multiple_return);
61 inno_log_info("coordinate_mode: %d", coordinate_mode);
62 inno_log_info("max_range: %f", max_range);
63 inno_log_info("min_range: %f", min_range);
64 inno_log_info("log_level: %s", log_level.c_str());
65 inno_log_info("raw_packets_mode: %d", raw_packets_mode);
66 inno_log_info("------------------------------------------------------");
67 }
68};
69
71 public:
74
75 static int32_t data_callback_s_(int32_t handle_, void *ctx,
76 const InnoDataPacket *pkt) {
77 return (reinterpret_cast<SeyondDriver *>(ctx))->data_callback_(pkt);
78 }
79
80 static void message_callback_s_(int32_t handle_, void *ctx,
81 uint32_t from_remote,
82 enum InnoMessageLevel level,
83 enum InnoMessageCode code,
84 const char *error_message) {
85 (reinterpret_cast<SeyondDriver *>(ctx))
86 ->message_callback_(from_remote, level, code, error_message);
87 }
88
89 static int32_t status_callback_s_(int32_t handle_, void *ctx,
90 const InnoStatusPacket *pkt) {
91 return (reinterpret_cast<SeyondDriver *>(ctx))->status_callback_(pkt);
92 }
93
94 static void log_callback_s_(void *ctx, enum InnoLogLevel level,
95 const char *header1, const char *header2,
96 const char *msg) {
97 SeyondDriver::log_cb_s_(static_cast<int32_t>(level), header1, msg);
98 }
99
100 // lidar configuration
102 const std::function<void(const InnoDataPacket *, bool)>
103 &callback) {
104 packet_publish_cb_ = callback;
105 }
107 const std::function<void(std::shared_ptr<PointCloud>)> &cloud_callback,
108 const std::function<std::shared_ptr<PointCloud>()> &allocate_callback) {
109 cloud_publish_cb_ = cloud_callback;
110 allocate_cloud_cb_ = allocate_callback;
111 point_cloud_ptr_ = allocate_cloud_cb_();
112 }
114 const std::function<void(int32_t, const char *, const char *)>
115 &log_callback) {
116 log_cb_s_ = log_callback;
117 }
119 bool init(SeyondParam& param);
120 bool start();
121 bool pause();
122 bool stop();
123
124 // callback group
125 int32_t data_callback_(const InnoDataPacket *pkt);
126 void message_callback_(uint32_t from_remote, enum InnoMessageLevel level,
127 enum InnoMessageCode code, const char *msg);
128 int32_t status_callback_(const InnoStatusPacket *pkt);
129
131
133 const std::shared_ptr<seyond::SeyondScan> &lidar_packets);
134 void convert_and_parse_(const InnoDataPacket *pkt);
135 int32_t process_data_packet_(const InnoDataPacket *pkt);
136 template <typename PointType>
137 void process_xyz_point_data_(bool is_en_data, bool is_use_refl,
138 uint32_t point_num, PointType point_ptr);
139
140 public:
141 // for generic
143 std::vector<char> anglehv_table_;
144
145 private:
146 // apollo
147 std::shared_ptr<PointCloud> point_cloud_ptr_{nullptr};
148
149 std::function<void(const InnoDataPacket *, bool)> packet_publish_cb_;
150 std::function<void(std::shared_ptr<PointCloud>)> cloud_publish_cb_;
151 std::function<std::shared_ptr<PointCloud>()> allocate_cloud_cb_;
152
153 static std::function<void(int32_t, const char*, const char*)> log_cb_s_;
154
155 // config
156 SeyondParam param_;
157 int32_t handle_{-1};
158 std::string lidar_name_{"seyond_lidar"};
159
160 // frame status
161 uint32_t packets_width_{0};
162 int64_t current_frame_id_{-1};
163 double current_ts_start_;
164 uint64_t frame_points_width_;
165 std::vector<uint8_t> convert_buffer_;
166};
167
168} // namespace lidar
169} // namespace drivers
170} // namespace apollo
void process_xyz_point_data_(bool is_en_data, bool is_use_refl, uint32_t point_num, PointType point_ptr)
void register_publish_point_callback(const std::function< void(std::shared_ptr< PointCloud >)> &cloud_callback, const std::function< std::shared_ptr< PointCloud >()> &allocate_callback)
static int32_t status_callback_s_(int32_t handle_, void *ctx, const InnoStatusPacket *pkt)
static int32_t data_callback_s_(int32_t handle_, void *ctx, const InnoDataPacket *pkt)
int32_t data_callback_(const InnoDataPacket *pkt)
void register_log_callback(const std::function< void(int32_t, const char *, const char *)> &log_callback)
int32_t process_scan_packet_(const std::shared_ptr< seyond::SeyondScan > &lidar_packets)
bool init(SeyondParam &param)
static void log_callback_s_(void *ctx, enum InnoLogLevel level, const char *header1, const char *header2, const char *msg)
void register_publish_packet_callback(const std::function< void(const InnoDataPacket *, bool)> &callback)
void message_callback_(uint32_t from_remote, enum InnoMessageLevel level, enum InnoMessageCode code, const char *msg)
void convert_and_parse_(const InnoDataPacket *pkt)
int32_t process_data_packet_(const InnoDataPacket *pkt)
static void message_callback_s_(int32_t handle_, void *ctx, uint32_t from_remote, enum InnoMessageLevel level, enum InnoMessageCode code, const char *error_message)
int32_t status_callback_(const InnoStatusPacket *pkt)
class register implement
Definition arena_queue.h:37