CARLA
 
载入中...
搜索中...
未找到
CustomV2XSensor.cpp
浏览该文件的文档.
1// Copyright (c) 2024 Institut fuer Technik der Informationsverarbeitung (ITIV) at the
2// Karlsruhe Institute of Technology
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#include "Carla.h"
11#include <string>
12#include <cstring>
13#include <algorithm>
14#include "CustomV2XSensor.h"
15#include "V2X/PathLossModel.h"
16
17std::list<AActor *> ACustomV2XSensor::mV2XActorContainer;
19
20ACustomV2XSensor::ACustomV2XSensor(const FObjectInitializer &ObjectInitializer)
21 : Super(ObjectInitializer)
22{
23 PrimaryActorTick.bCanEverTick = true;
24 RandomEngine = CreateDefaultSubobject<URandomEngine>(TEXT("RandomEngine"));
25
26 // 初始路径损耗模型
28}
29
31{
32 UE_LOG(LogCarla, Warning, TEXT("CustomV2XSensor: called setowner with %p"), Owner);
33 if (GetOwner() != nullptr)
34 {
35 ACustomV2XSensor::mV2XActorContainer.remove(GetOwner());
36 UE_LOG(LogCarla, Warning, TEXT("CustomV2XSensor: removed old owner %p"), GetOwner());
37 }
38
39 Super::SetOwner(Owner);
40
41 // 如果演员详细信息不可用,则将演员存储到静态列表中
42 if(Owner != nullptr)
43 {
45 {
47 UE_LOG(LogCarla, Warning, TEXT("CustomV2XSensor: added owner, length now %d"), ACustomV2XSensor::mV2XActorContainer.size());
48 }
49
50 }
51
53
54 UCarlaEpisode* CarlaEpisode = UCarlaStatics::GetCurrentEpisode(GetWorld());
55 FCarlaActor* CarlaActor = CarlaEpisode->FindCarlaActor(Owner);
56 if (CarlaActor != nullptr)
57 {
58 mStationId = static_cast<long>(CarlaActor->GetActorId());
59 }
60}
61
66
67/* 添加可配置参数的功能*/
68void ACustomV2XSensor::Set(const FActorDescription &ActorDescription)
69{
70 UE_LOG(LogCarla, Warning, TEXT("CustomV2XSensor: Set function called"));
71 Super::Set(ActorDescription);
73}
74
75void ACustomV2XSensor::SetPropagationParams(const float TransmitPower,
76 const float ReceiverSensitivity,
77 const float Frequency,
78 const float combined_antenna_gain,
79 const float path_loss_exponent,
80 const float reference_distance_fspl,
81 const float filter_distance,
82 const bool use_etsi_fading,
83 const float custom_fading_stddev)
84{
85 // 将参数转发到PathLossModel对象
86 PathLossModelObj->SetParams(TransmitPower, ReceiverSensitivity, Frequency, combined_antenna_gain, path_loss_exponent, reference_distance_fspl, filter_distance, use_etsi_fading, custom_fading_stddev);
87}
88
90 PathLossModelObj->SetPathLossModel(path_loss_model);
91}
92
97
98/*
99 * 函数将参与者详细信息存储到静态列表中。
100 *调用CaService对象生成CAM消息将消息存储在静态映射中
101 */
102void ACustomV2XSensor::PrePhysTick(float DeltaSeconds)
103{
104 Super::PrePhysTick(DeltaSeconds);
105 // 清除上一个sim卡周期创建的消息
106 if (GetOwner())
107 {
108 ACustomV2XSensor::mActorV2XDataMap.erase(GetOwner());
109
110 // 步骤0:如果满足触发条件,则创建要发送的消息
111 //这需要在预物理滴答中完成,以便在所有其他v2x传感器中实现同步接收
112 //检查消息是否生成
114 {
115 // 如果生成了消息,请将其存储
116 //制作一对消息和发送功率
117 //如果不同的v2x传感器以不同的功率发送,我们需要存储它
119 message_pw.Message = CreateCustomV2XMessage();
120
122 ACustomV2XSensor::mActorV2XDataMap.insert({GetOwner(), message_pw});
123 }
124 }
125}
126
128{
129 CustomV2XM_t message = CustomV2XM_t();
130
131 CreateITSPduHeader(message);
132 std::strcpy(message.message,mMessageData.c_str());
133 mMessageDataChanged = false;
134 return message;
135}
136
144
145/*
146*函数负责向当前参与者发送消息。
147*首先通过调用LOSComm对象来模拟通信。
148*如果存在列表,则将这些列表中的消息发送给当前参与者
149*/
150void ACustomV2XSensor::PostPhysTick(UWorld *World, ELevelTick TickType, float DeltaTime)
151{
152 TRACE_CPUPROFILER_EVENT_SCOPE(ACustomV2XSensor::PostPhysTick);
153
154 //步骤1:创建一个参与者列表,其中包含要针对此v2x传感器实例发送的消息
155 std::vector<ActorPowerPair> ActorPowerList;
156 for (const auto &pair : ACustomV2XSensor::mActorV2XDataMap)
157 {
158 if (pair.first != GetOwner())
159 {
160 ActorPowerPair actor_power_pair;
161 actor_power_pair.first = pair.first;
162 //以发射功率发送的演员
163 actor_power_pair.second = pair.second.Power;
164 ActorPowerList.push_back(actor_power_pair);
165 }
166 }
167
168 //步骤2:模拟参与者列表中的参与者与当前参与者的通信。
169 if (!ActorPowerList.empty())
170 {
171 UCarlaEpisode *carla_episode = UCarlaStatics::GetCurrentEpisode(GetWorld());
172 PathLossModelObj->Simulate(ActorPowerList, carla_episode, GetWorld());
173 //步骤3:获取可以向当前参与者发送消息的参与者列表,以及他们的消息的接收能力。
174 ActorPowerMap actor_receivepower_map = PathLossModelObj->GetReceiveActorPowerList();
175 //步骤4:检索收到的参与者的消息
176
177 //获取注册表以检索carla演员ID
178 const FActorRegistry &Registry = carla_episode->GetActorRegistry();
179
180 ACustomV2XSensor::V2XDataList msg_received_power_list;
181 for (const auto &pair : actor_receivepower_map)
182 {
184 carla::sensor::data::CustomV2XData received_msg_and_pw;
185 //发送CAM
186 received_msg_and_pw.Message = send_msg_and_pw.Message;
187 //接收电力
188 received_msg_and_pw.Power = pair.second;
189
190 msg_received_power_list.push_back(received_msg_and_pw);
191 }
192
193 WriteMessageToV2XData(msg_received_power_list);
194 }
195 //步骤5:发送消息
196
197 if (mV2XData.GetMessageCount() > 0)
198 {
199 auto DataStream = GetDataStream(*this);
200 DataStream.SerializeAndSend(*this, mV2XData, DataStream.PopBufferFromPool());
201 }
202 mV2XData.Reset();
203}
204
205/*
206*函数将消息存储到结构中,以便将其发送到python客户端
207*/
209{
210 for (const auto &elem : msg_received_power_list)
211 {
213 }
214}
215
216
217void ACustomV2XSensor::Send(const FString message)
218{
219 //注意:这是不安全的!
220 //应该固定在某个地方以限制长度
221 mMessageData = TCHAR_TO_UTF8(*message);
222 mMessageDataChanged = true;
223}
224
UE_LOG(LogCarla, Log, TEXT("UActorDispatcher::Destroying actor: '%s' %x"), *Id, Actor)
auto end() const noexcept
auto begin() const noexcept
名称范围迭代支持
TSharedPtr< const FActorInfo > carla::rpc::ActorState UWorld * World
struct CustomV2XM CustomV2XM_t
std::pair< AActor *, float > ActorPowerPair
std::map< AActor *, float > ActorPowerMap
EScenario
EPathLossModel
const long mMessageId
void Set(const FActorDescription &ActorDescription) override
void SetOwner(AActor *Owner) override
PathLossModel * PathLossModelObj
std::string mMessageData
void Send(const FString message)
std::map< AActor *, carla::sensor::data::CustomV2XData > ActorV2XDataMap
void SetPathLossModel(const EPathLossModel path_loss_model)
void WriteMessageToV2XData(const ACustomV2XSensor::V2XDataList &msg_received_power_list)
CustomV2XM_t CreateCustomV2XMessage()
void SetPropagationParams(const float TransmitPower, const float ReceiverSensitivity, const float Frequency, const float combined_antenna_gain, const float path_loss_exponent, const float reference_distance_fspl, const float filter_distance, const bool use_etsi_fading, const float custom_fading_stddev)
virtual void PrePhysTick(float DeltaSeconds) override
void SetScenario(EScenario scenario)
static FActorDefinition GetSensorDefinition()
const long mProtocolVersion
virtual void PostPhysTick(UWorld *World, ELevelTick TickType, float DeltaTime) override
std::vector< carla::sensor::data::CustomV2XData > V2XDataList
ACustomV2XSensor(const FObjectInitializer &ObjectInitializer)
static std::list< AActor * > mV2XActorContainer
void CreateITSPduHeader(CustomV2XM_t &message)
static ACustomV2XSensor::ActorV2XDataMap mActorV2XDataMap
FAsyncDataStream GetDataStream(const SensorT &Self)
Return the FDataStream associated with this sensor.
URandomEngine * RandomEngine
Random Engine used to provide noise for sensor output.
所有Carla角色的注册表
查看一个参与者和它的属性
Definition CarlaActor.h:23
IdType GetActorId() const
Definition CarlaActor.h:67
ActorPowerMap GetReceiveActorPowerList()
void Simulate(const std::vector< ActorPowerPair > ActorList, UCarlaEpisode *CarlaEpisode, UWorld *World)
void SetScenario(EScenario scenario)
void SetPathLossModel(const EPathLossModel path_loss_model)
void SetParams(const float TransmitPower, const float ReceiverSensitivity, const float Frequency, const float combined_antenna_gain, const float path_loss_exponent, const float reference_distance_fspl, const float filter_distance, const bool use_etsi_fading, const float custom_fading_stddev)
float GetTransmitPower()
void SetOwner(AActor *Owner)
static FActorDefinition MakeCustomV2XDefinition()
创建一个自定义车对外界信息交换传感器参与者定义。
static void SetCustomV2X(const FActorDescription &Description, ACustomV2XSensor *V2X)
static UCarlaEpisode * GetCurrentEpisode(const UObject *WorldContextObject)
void WriteMessage(CustomV2XData message)
Definition V2XData.h:93
ITSContainer::ItsPduHeader_t header
Definition LibITS.h:915
char message[100]
Definition LibITS.h:916