CARLA
 
载入中...
搜索中...
未找到
AsyncDataStream.h
浏览该文件的文档.
1// Copyright (c) 2020 Computer Vision Center (CVC) at the Universitat Autonoma
2// de Barcelona (UAB).
3//
4// This work is licensed under the terms of the MIT license.
5// For a copy, see <https://opensource.org/licenses/MIT>.
6
7#pragma once
8
10#include <carla/Buffer.h>
11#include <carla/Logging.h>
16
17template <typename T>
18class FDataStreamTmpl;
19
20// =============================================================================
21// -- FAsyncDataStreamTmpl -----------------------------------------------------
22// =============================================================================
23
24//用于向客户端发送传感器数据的流媒体通道,支持发送
25///异步数据。“发送”功能发送的数据被传递给
26///序列化程序在carla::sensor:SensorRegistry上注册了传感器
27///被顺流而下。
28///
29///@warning这是一个一次性对象,需要为每个对象创建一个新对象
30///新消息。
31///
32///FAsyncDataStream还有一个carla::Buffer池,允许重用
33///分配内存,尽可能使用它。
35{
36public:
37
38 using StreamType = T;
39
41
42 /// 返回允许订阅此流的令牌。
43 auto GetToken() const
44 {
45 return Stream.GetToken();
46 }
47
48 /// 从池中弹出缓冲区。池中的缓冲区可以重用以前消息分配的内存,从而显著提高大消息的性能。
50 {
51 return Stream.MakeBuffer();
52 }
53
54 /// 向下游发送一些数据。
55 template <typename SensorT, typename... ArgsT>
56 void Send(SensorT &Sensor, ArgsT &&... Args);
57
58 template <typename SensorT, typename... ArgsT>
59 void SerializeAndSend(SensorT &Sensor, ArgsT &&... Args);
60
61 /// 允许更改标头的帧号
62 void SetFrameNumber(uint64_t FrameNumber)
63 {
65 reinterpret_cast<carla::sensor::s11n::SensorHeaderSerializer::Header *>(Header.data());
66 if (HeaderStr)
67 {
68 if (HeaderStr->frame != FrameNumber)
69 {
70 carla::log_info("Re-framing sensor type ", HeaderStr->sensor_type, " from ", HeaderStr->frame, " to ", FrameNumber);
71 HeaderStr->frame = FrameNumber;
72 }
73 }
74 }
75
76 /// 返回此流的传感器类型
77 uint64_t GetSensorType()
78 {
80 reinterpret_cast<carla::sensor::s11n::SensorHeaderSerializer::Header *>(Header.data());
81 if (HeaderStr)
82 {
83 return HeaderStr->sensor_type;
84 }
85 return 0u;
86 }
87
88 /// 返回传感器的变换
89 FTransform GetSensorTransform()
90 {
92 reinterpret_cast<carla::sensor::s11n::SensorHeaderSerializer::Header *>(Header.data());
93 if (HeaderStr)
94 {
95 return FTransform(HeaderStr->sensor_transform);
96 }
97 return FTransform();
98 }
99
100 /// 返回传感器的时间戳
102 {
104 reinterpret_cast<carla::sensor::s11n::SensorHeaderSerializer::Header *>(Header.data());
105 if (HeaderStr)
106 {
107 return HeaderStr->timestamp;
108 }
109 return 0.0;
110 }
111
112private:
113
114 friend class FDataStreamTmpl<T>;
115
116 /// @这个函数需要在游戏线程中调用。
117 template <typename SensorT>
118 explicit FAsyncDataStreamTmpl(
119 const SensorT &InSensor,
120 double Timestamp,
121 StreamType InStream);
122
124
126};
127
128// =============================================================================
129// -- FAsyncDataStream and FAsyncDataMultiStream -------------------------------
130// =============================================================================
131
133
135
136// =============================================================================
137// -- FAsyncDataStreamTmpl implementation --------------------------------------
138// =============================================================================
139
140template <typename T>
141template <typename SensorT, typename... ArgsT>
142inline void FAsyncDataStreamTmpl<T>::SerializeAndSend(SensorT &Sensor, ArgsT &&... Args)
143{
144 // 序列化数据
145 carla::Buffer Data(carla::sensor::SensorRegistry::Serialize(Sensor, std::forward<ArgsT>(Args)...));
146
147 // 创建缓冲区视图
148 auto ViewHeader = carla::BufferView::CreateFrom(std::move(Header));
149 auto ViewData = carla::BufferView::CreateFrom(std::move(Data));
150
151 // 发送视图
152 Stream.Write(ViewHeader, ViewData);
153}
154
155template <typename T>
156template <typename SensorT, typename... ArgsT>
157inline void FAsyncDataStreamTmpl<T>::Send(SensorT &Sensor, ArgsT &&... Args)
158{
159 // 创建缓冲区视图
160 auto ViewHeader = carla::BufferView::CreateFrom(std::move(Header));
161
162 // 发送视图
163 Stream.Write(ViewHeader, std::forward<ArgsT>(Args)...);
164}
异步数据。“发送”功能发送的数据被传递给 序列化程序在carla::sensor:SensorRegistry上注册了传感器 被顺流而下。
void SetFrameNumber(uint64_t FrameNumber)
允许更改标头的帧号
FAsyncDataStreamTmpl(FAsyncDataStreamTmpl &&)=default
carla::Buffer PopBufferFromPool()
从池中弹出缓冲区。池中的缓冲区可以重用以前消息分配的内存,从而显著提高大消息的性能。
double GetSensorTimestamp()
返回传感器的时间戳
void Send(SensorT &Sensor, ArgsT &&... Args)
向下游发送一些数据。
FTransform GetSensorTransform()
返回传感器的变换
auto GetToken() const
返回允许订阅此流的令牌。
void SerializeAndSend(SensorT &Sensor, ArgsT &&... Args)
uint64_t GetSensorType()
返回此流的传感器类型
用于将传感器数据发送到客户端的流式处理通道。每个传感器 都有自己的 FDataStream。但请注意,此类不提供 send 函数。 为了发送数据,需要使用 “MakeAsyncDataStream” 函...
Definition DataStream.h:27
boost::optional< StreamType > Stream
Definition DataStream.h:72
static std::shared_ptr< BufferView > CreateFrom(Buffer &&buffer)
Definition BufferView.h:60
一块原始数据。 请注意,如果需要更多容量,则会分配一个新的内存块,并 删除旧的内存块。这意味着默认情况下,缓冲区只能增长。要释放内存,使用 clear 或 pop。
static Buffer Serialize(Sensor &sensor, Args &&... args)
Serialize the arguments provided into a Buffer by calling to the serializer registered for the given ...
static void log_info(Args &&... args)
Definition Logging.h:86