CARLA
 
载入中...
搜索中...
未找到
ObstacleDetectionSensor.cpp
浏览该文件的文档.
1// Copyright (c) 2017 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#include "Carla.h"
9
15
17#include "carla/ros2/ROS2.h"
19
20AObstacleDetectionSensor::AObstacleDetectionSensor(const FObjectInitializer &ObjectInitializer)
21 : Super(ObjectInitializer)
22{
23 PrimaryActorTick.bCanEverTick = true;
24}
25
27{
28 FActorDefinition SensorDefinition = FActorDefinition();
29 UActorBlueprintFunctionLibrary::MakeObstacleDetectorDefinitions(TEXT("other"), TEXT("obstacle"), SensorDefinition);
30 return SensorDefinition;
31}
32
34{
35 //为了从米转换为厘米,我们需要将数值乘以100。
36 Super::Set(Description);
38 "distance",
39 Description.Variations,
40 Distance) * 100.0f;
42 "hit_radius",
43 Description.Variations,
44 HitRadius) * 100.0f;
46 "only_dynamics",
47 Description.Variations,
49#if !(UE_BUILD_SHIPPING || UE_BUILD_TEST)
51 "debug_linetrace",
52 Description.Variations,
54#endif
55}
56
57void AObstacleDetectionSensor::PostPhysTick(UWorld *World, ELevelTick TickType, float DeltaTime)
58{
59 TRACE_CPUPROFILER_EVENT_SCOPE(AObstacleDetectionSensor::PostPhysTick);
60 const FVector &Start = GetActorLocation();
61 const FVector &End = Start + (GetActorForwardVector() * Distance);
62 UWorld* CurrentWorld = GetWorld();
63
64 // 用于保存扫描结果的结构体
65 FHitResult HitOut = FHitResult();
66
67 // 查询参数的初始化
68 FCollisionQueryParams TraceParams(FName(TEXT("ObstacleDetection Trace")), true, this);
69
70#if !(UE_BUILD_SHIPPING || UE_BUILD_TEST)
71 // 如果启用了调试模式,我们将创建一个标签来显示扫描结果
73 {
74 const FName TraceTag("ObstacleDebugTrace");
75 CurrentWorld->DebugDrawTraceTag = TraceTag;
76 TraceParams.TraceTag = TraceTag;
77 }
78#endif
79
80 // 与复杂网格的碰撞
81 TraceParams.bTraceComplex = true;
82
83 // 忽略触发框
84 TraceParams.bIgnoreTouches = true;
85
86 // 限制返回的信息
87 TraceParams.bReturnPhysicalMaterial = false;
88
89 // 忽略自身
90 TraceParams.AddIgnoredActor(this);
91 if(Super::GetOwner()!=nullptr)
92 TraceParams.AddIgnoredActor(Super::GetOwner());
93
94 bool isHitReturned;
95 // 选择一种扫描类型是一种权宜之计,直到所有事情都得到妥善处理
96 // 根据正确的碰撞通道和对象类型进行组织
97 if (bOnlyDynamics)
98 {
99 // 如果我们只考虑动态物体,我们会检查对象类型“AllDynamicObjects”
100 FCollisionObjectQueryParams TraceChannel = FCollisionObjectQueryParams(
101 FCollisionObjectQueryParams::AllDynamicObjects);
102 isHitReturned = CurrentWorld->SweepSingleByObjectType(
103 HitOut,
104 Start,
105 End,
106 FQuat(),
107 TraceChannel,
108 FCollisionShape::MakeSphere(HitRadius),
109 TraceParams);
110 }
111 else
112 {
113 //否则,如果我们考虑所有物体,我们会获取与Pawn交互的所有物体
114 ECollisionChannel TraceChannel = ECC_WorldStatic;
115 isHitReturned = CurrentWorld->SweepSingleByChannel(
116 HitOut,
117 Start,
118 End,
119 FQuat(),
120 TraceChannel,
121 FCollisionShape::MakeSphere(HitRadius),
122 TraceParams);
123 }
124
125 if (isHitReturned)
126 {
127 OnObstacleDetectionEvent(this, HitOut.Actor.Get(), HitOut.Distance, HitOut);
128 }
129}
130
132 AActor *Actor,
133 AActor *OtherActor,
134 float HitDistance,
135 const FHitResult &Hit)
136{
137 if ((Actor != nullptr) && (OtherActor != nullptr) && IsStreamReady())
138 {
139 const auto &Episode = GetEpisode();
140
141 auto DataStream = GetDataStream(*this);
142
143 // ROS2
144 #if defined(WITH_ROS2)
145 auto ROS2 = carla::ros2::ROS2::GetInstance();
146 if (ROS2->IsEnabled())
147 {
148 TRACE_CPUPROFILER_EVENT_SCOPE_STR("ROS2 Send");
150 AActor* ParentActor = GetAttachParentActor();
151 if (ParentActor)
152 {
153 FTransform LocalTransformRelativeToParent = GetActorTransform().GetRelativeTransform(ParentActor->GetActorTransform());
154 ROS2->ProcessDataFromObstacleDetection(DataStream.GetSensorType(), StreamId, LocalTransformRelativeToParent, Actor, OtherActor, HitDistance/100.0f, this);
155 }
156 else
157 {
158 ROS2->ProcessDataFromObstacleDetection(DataStream.GetSensorType(), StreamId, DataStream.GetSensorTransform(), Actor, OtherActor, HitDistance/100.0f, this);
159 }
160 }
161 #endif
162
163 DataStream.SerializeAndSend(*this,
164 Episode.SerializeActor(Actor),
165 Episode.SerializeActor(OtherActor),
166 HitDistance/100.0f);
167 }
168}
TSharedPtr< const FActorInfo > carla::rpc::ActorState UWorld * World
TSharedPtr< const FActorInfo > carla::rpc::ActorState UWorld Actor
void Set(const FActorDescription &Description) override
void OnObstacleDetectionEvent(AActor *Actor, AActor *OtherActor, float Distance, const FHitResult &Hit)
AObstacleDetectionSensor(const FObjectInitializer &ObjectInitializer)
virtual void PostPhysTick(UWorld *World, ELevelTick TickType, float DeltaSeconds) override
static FActorDefinition GetSensorDefinition()
auto GetToken() const
Return the token that allows subscribing to this sensor's stream.
FAsyncDataStream GetDataStream(const SensorT &Self)
Return the FDataStream associated with this sensor.
static bool RetrieveActorAttributeToBool(const FString &Id, const TMap< FString, FActorAttribute > &Attributes, bool Default)
从参与者属性映射中检索布尔值,如果不存在则返回默认值。
static float RetrieveActorAttributeToFloat(const FString &Id, const TMap< FString, FActorAttribute > &Attributes, float Default)
static void MakeObstacleDetectorDefinitions(const FString &Type, const FString &Id, FActorDefinition &Definition)
static std::shared_ptr< ROS2 > GetInstance()
Definition ROS2.h:51
静态断言,用于确保token_data结构体的大小与Token::data的大小相同。
const auto & get_stream_id() const
获取流ID的引用。
TMap< FString, FActorAttribute > Variations
用户选择了参与者的变化版本。请注意,此时是 由不可修改的属性表示