From 68297b5bc8d7cee2cbb340e248aed2a5b7718464 Mon Sep 17 00:00:00 2001 From: "Nicholas Gyde (Collabera)" Date: Tue, 11 Feb 2020 12:05:16 -0800 Subject: [PATCH 01/29] Fast capture prototype. --- .../Content/Blueprints/BP_PIPCamera.uasset | Bin 28807 -> 29157 bytes .../DroneTextureRenderTarget2D.uasset | Bin 0 -> 3783 bytes .../Plugins/AirSim/Source/RenderRequest.cpp | 42 ++++++++++++++++++ Unreal/Plugins/AirSim/Source/RenderRequest.h | 13 +++++- .../AirSim/Source/UnrealImageCapture.cpp | 37 +++++++++------ 5 files changed, 78 insertions(+), 14 deletions(-) create mode 100644 Unreal/Plugins/AirSim/Content/Blueprints/DroneTextureRenderTarget2D.uasset diff --git a/Unreal/Plugins/AirSim/Content/Blueprints/BP_PIPCamera.uasset b/Unreal/Plugins/AirSim/Content/Blueprints/BP_PIPCamera.uasset index add176509f96a3d0d150c43f8a66ea787adea9ae..eefb0330159067a325a4970cf8df2da420b1fdb2 100644 GIT binary patch literal 29157 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 diff --git a/Unreal/Plugins/AirSim/Content/Blueprints/DroneTextureRenderTarget2D.uasset b/Unreal/Plugins/AirSim/Content/Blueprints/DroneTextureRenderTarget2D.uasset new file mode 100644 index 0000000000000000000000000000000000000000..ca6b9d9114f1d11e4da792ce65736abb3c7be917 GIT binary patch literal 3783 zcmeHKZ){Ul6hE&W8)KUc&}qPbM3ccb)~$>(NYK6Rtz8#rYun)#q1$7-8&CQ#_ubA7 zB~*-Ni^Pa7_=yccryq<8m>7c+7NbEl{!L6K5KSCG3Hu^sj4-J8y!MrDcFqre>`C6c z_xwNi-t*r3z0nuShHk{;@pdD?0t0Bor!f5T)Y9puXn*0@b0e!i+gN))mtBZnTwQ8A z`diPB#fL7RuXtn$mrd;aaQsi};I)EZs*i{#ZIusl*<=xq#Ybm2MEC$u%&$fPU?m^d znJtppVijxFiego@ZM|rdETUMuR;;y&Qf>7Hw1>0260Bk?R+Z#m$w3Xk5FhcHECATk z+jtTlbvh3o9p5)nb|KDlXnvS52TJ(7>CIiRjC1AX%?&l>9ugq3O4ig=n$4O4z*qjQ za~W_qje7Fj*KxAG5a9E>5;FbHw=RzBt>gles8FvGG+6^t5}`_nsV0f?J@AoU7Nx{P zLY;*AWZF%bS%RD&e!p@zdU-pj5@DwLFeS~d9Z!=E22+kTk1bBqHH5kqzLzi6z39ND ziK8BCTArjR zo4E^QW%#3C33+7k~&xcc^Xh)0l8(7-Gj`!m5u=&-zcpxC^)?44!*qlc^p4Duu%p z?QnMD>!EwA;Knj=msG*UN%CF6eX;3$Sj7i=^Z2C&g>|=cV2}@=>>0ai$bERPfxqf< zv+1&%nQfKqgOGizWZ#+p`xjxG|3vPssPw@~{FXWzoYMQ&_I>zCof}Qf10IiXgoOd- zF`GL+0)^5>;&h1fV{#?MW&}AWhLaLxGTP zhuz)m-6>PjX$#2RT3DMLP&pz+r5I&lI|&ggGqOdAsA+n{Z0Ydb7N$X&0m3bh&(`L# zTg7TimzHm{OR_4mszI|F(uTkYQV`?-zJeRIT~PqIMt>E7@-M` zEv3Qr@Q`*Ijz(ZPXM7DUzGhE@-Q#L@x24yl{U~{PDcZzGqeQFENqPwNGD_s&9Yu1d zapQDKpQ8*<7~vff_RhTjZ91IA<3rMMxE4ysh8dMQI>xmkr982QnRV%=nqBfX%70=1 E20S4&e*gdg literal 0 HcmV?d00001 diff --git a/Unreal/Plugins/AirSim/Source/RenderRequest.cpp b/Unreal/Plugins/AirSim/Source/RenderRequest.cpp index 57f423272d..6c07ad5d6d 100644 --- a/Unreal/Plugins/AirSim/Source/RenderRequest.cpp +++ b/Unreal/Plugins/AirSim/Source/RenderRequest.cpp @@ -3,6 +3,7 @@ #include "Engine/TextureRenderTarget2D.h" #include "Async/TaskGraphInterfaces.h" #include "ImageUtils.h" +#include "UnrealString.h" #include "AirBlueprintLib.h" #include "Async/Async.h" @@ -18,6 +19,47 @@ RenderRequest::~RenderRequest() { } +void RenderRequest::fastScreenshot(std::shared_ptr param, std::shared_ptr result) +{ + //params_ = ¶m; + //results_ = &result; + //fast_param_ = param.get(); + //fast_result_ = result.get(); + + UAirBlueprintLib::RunCommandOnGameThread([this]() { + fast_cap_done_ = false; + fast_rt_resource_ = fast_param_->render_component->TextureTarget->GameThread_GetRenderTargetResource(); + fast_param_->render_component->CaptureScene(); + ENQUEUE_UNIQUE_RENDER_COMMAND_ONEPARAMETER( + SceneDrawCompletion, + RenderRequest *, This, this, + { + This->FastTask(); + } + ); + }, true); + while (!fast_cap_done_) {} //Spin lock. +} + +void RenderRequest::FastTask() +{ + fast_cap_texture_ = fast_rt_resource_->TextureRHI->GetTexture2D(); + EPixelFormat pixelFormat = fast_cap_texture_->GetFormat(); + uint32 width = fast_cap_texture_->GetSizeX(); + uint32 height = fast_cap_texture_->GetSizeY(); + fast_cap_tex_size_ = width * height; + // + uint32 stride; + auto *src = (const unsigned char*)RHILockTexture2D(fast_cap_texture_, 0, RLM_ReadOnly, stride, false); // needs to be on render thread? + fast_result_->image_data_uint8.Reset(fast_result_->image_data_uint8.Num()); + fast_result_->image_data_uint8.Append(src, width * height); + //void *dest = static_cast(fast_result_->image_data_uint8.GetData()); + //if (src && dest) +// FMemory::BigBlockMemcpy(dest, src, fast_cap_tex_size_); + RHIUnlockTexture2D(fast_cap_texture_, 0, false); + fast_cap_done_ = true; +} + // read pixels from render target using render thread, then compress the result into PNG // argument on the thread that calls this method. void RenderRequest::getScreenshot(std::shared_ptr params[], std::vector>& results, unsigned int req_size, bool use_safe_method) diff --git a/Unreal/Plugins/AirSim/Source/RenderRequest.h b/Unreal/Plugins/AirSim/Source/RenderRequest.h index 3eb7fa97d3..450588cdec 100644 --- a/Unreal/Plugins/AirSim/Source/RenderRequest.h +++ b/Unreal/Plugins/AirSim/Source/RenderRequest.h @@ -41,7 +41,15 @@ class RenderRequest : public FRenderCommand std::shared_ptr* params_; std::shared_ptr* results_; - unsigned int req_size_; +public: + RenderParams *fast_param_; + RenderResult *fast_result_; + volatile bool fast_cap_done_ = false; + FTextureRenderTargetResource* fast_rt_resource_; +private: + FRHITexture2D *fast_cap_texture_; + volatile unsigned int fast_cap_tex_size_; + volatile unsigned int req_size_; std::shared_ptr wait_signal_; @@ -64,10 +72,13 @@ class RenderRequest : public FRenderCommand RETURN_QUICK_DECLARE_CYCLE_STAT(RenderRequest, STATGROUP_RenderThreadCommands); } + void fastScreenshot(std::shared_ptr param, std::shared_ptr result); + // read pixels from render target using render thread, then compress the result into PNG // argument on the thread that calls this method. void getScreenshot( std::shared_ptr params[], std::vector>& results, unsigned int req_size, bool use_safe_method); void ExecuteTask(); + void FastTask(); }; diff --git a/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp b/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp index da28a1795f..473041e7cb 100644 --- a/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp +++ b/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp @@ -33,7 +33,7 @@ void UnrealImageCapture::getSceneCaptureImage(const std::vector& responses, bool use_safe_method) const { std::vector> render_params; - std::vector> render_results; + //std::vector> render_results; bool visibilityChanged = false; for (unsigned int i = 0; i < requests.size(); ++i) { @@ -89,16 +89,27 @@ void UnrealImageCapture::getSceneCaptureImage(const std::vector(); + + //auto param = render_params.at(0); + //auto result = std::make_shared(); + UAirBlueprintLib::RunCommandOnGameThread([this, &render_request]() { + render_request.fastScreenshot(nullptr, nullptr); + }, true); + ////// + + //for (unsigned int i = 0; i < requests.size(); ++i) { + // const ImageRequest& request = requests.at(i); + // ImageResponse& response = responses.at(i); + const ImageRequest &request = requests.at(0); + ImageResponse &response = responses.at(0); response.camera_name = request.camera_name; - response.time_stamp = render_results[i]->time_stamp; - response.image_data_uint8 = std::vector(render_results[i]->image_data_uint8.GetData(), render_results[i]->image_data_uint8.GetData() + render_results[i]->image_data_uint8.Num()); - response.image_data_float = std::vector(render_results[i]->image_data_float.GetData(), render_results[i]->image_data_float.GetData() + render_results[i]->image_data_float.Num()); + response.time_stamp = render_request.fast_result_->time_stamp; + response.image_data_uint8 = std::vector(render_request.fast_result_->image_data_uint8.GetData(), render_request.fast_result_->image_data_uint8.GetData() + render_request.fast_result_->image_data_uint8.Num()); + //response.image_data_float = std::vector(result->image_data_float.GetData(), result->image_data_float.GetData() + render_results[i]->image_data_float.Num()); if (use_safe_method) { // Currently, we don't have a way to synthronize image capturing and camera pose when safe method is used, @@ -109,10 +120,10 @@ void UnrealImageCapture::getSceneCaptureImage(const std::vectorwidth; - response.height = render_results[i]->height; + response.width = render_request.fast_result_->width; + response.height = render_request.fast_result_->height; response.image_type = request.image_type; - } + //} } From f539dbfb5f60e1ff7b2b9c1f66de1385b072b2e1 Mon Sep 17 00:00:00 2001 From: "Nicholas Gyde (Collabera)" Date: Wed, 12 Feb 2020 10:19:18 -0800 Subject: [PATCH 02/29] Image capture is functional but needs optimization and cleanup. --- .../Content/Blueprints/BP_PIPCamera.uasset | Bin 29157 -> 29157 bytes .../DroneTextureRenderTarget2D.uasset | Bin 3783 -> 2513 bytes .../Plugins/AirSim/Source/RenderRequest.cpp | 18 ++++++++++-------- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/Unreal/Plugins/AirSim/Content/Blueprints/BP_PIPCamera.uasset b/Unreal/Plugins/AirSim/Content/Blueprints/BP_PIPCamera.uasset index eefb0330159067a325a4970cf8df2da420b1fdb2..8a9fef2d21398a68bc6a8469349d824085fd3a3c 100644 GIT binary patch delta 98 zcmaF*nDOaj#tFX!n$zw?H=I7}ymxx^tCu@xschzAobSiTIJq#yd~!jE%;XRtwg6(8 v5Sd9p>PfH+qrhaw5b4R!f*wt74@{r@D(K#1rJxg&$5Jg!4wSy}9 delta 92 zcmaF*nDOaj#tFX!iq8GQgE_vP$ru$twfy rF$zpp43?gp8z3_|5Qt5ISQ3c;`pZmy2*gMIWf&PjDmEVpQIrJ$T%RQ! diff --git a/Unreal/Plugins/AirSim/Content/Blueprints/DroneTextureRenderTarget2D.uasset b/Unreal/Plugins/AirSim/Content/Blueprints/DroneTextureRenderTarget2D.uasset index ca6b9d9114f1d11e4da792ce65736abb3c7be917..eecc7662d795e89b1182356edc7417053aa982d8 100644 GIT binary patch delta 1135 zcmX>udr^3T#6$;?i4qz@(>NFySQ!`?{POcsffNIS_{1~=#|&l$1|VYi0wh4PAifTW z0R%Qc8iZ%CF)&=RniDxCh0A66l@xQC>W!Znf$|`I;uEijO5Fr1ILisrf&l-4U>e6{ zH^ydBUZAK`Wl3s4QGP*cQAs7kGe6w}lTR`lMoI%^TtiYTN=l1TgHrQSQj00pKRD;K#= z=3{Eo6$Z*+G4)mDAqOsyRES%Akh_zk1;dA|s9lpMFv*DX1BHW2ib|6aRv0kM`7?P9 zlbS3vP#FFIJ;n`G2Lhl_00Gv?@0p}6VJdzDRfs_(;41i_d=LfG1*7>UJ2RUz0RyX% zS#k0NX4c7zn03Sipc%sU(s4>T|` zv++n6B#_3aCr=yIbor6xYE5kNljZny>OsjA1Yj8mWF{DZB2Wa% z#wsZYm4xX4=5R1zhtdo}PzK0pARr2%7+{GDq+xOkv#5=+*O6t%wCA~OKbO3(NYK6Rtz8#rYun)#q1$7-8&CQ#_ubA7 zB~*-Ni^Pa7_=yccryq<8m>7c+7NbEl{!L6K5KSCG3Hu^sj4-J8y!MrDcFqre>`C6c z_xwNi-t*r3z0nuShHk{;@pdD?0t0Bor!f5T)Y9puXn*0@b0e!i+gN))mtBZnTwQ8A z`diPB#fL7RuXtn$mrd;aaQsi};I)EZs*i{#ZIusl*<=xq#Ybm2MEC$u%&$fPU?m^d znJtppVijxFiego@ZM|rdETUMuR;;y&Qf>7Hw1>0260Bk?R+Z#m$w3Xk5FhcHECATk z+jtTlbvh3o9p5)nb|KDlXnvS52TJ(7>CIiRjC1AX%?&l>9ugq3O4ig=n$4O4z*qjQ za~W_qje7Fj*KxAG5a9E>5;FbHw=RzBt>gles8FvGG+6^t5}`_nsV0f?J@AoU7Nx{P zLY;*AWZF%bS%RD&e!p@zdU-pj5@DwLFeS~d9Z!=E22+kTk1bBqHH5kqzLzi6z39ND ziK8BCTArjR zo4E^QW%#3C33+7k~&xcc^Xh)0l8(7-Gj`!m5u=&-zcpxC^)?44!*qlc^p4Duu%p z?QnMD>!EwA;Knj=msG*UN%CF6eX;3$Sj7i=^Z2C&g>|=cV2}@=>>0ai$bERPfxqf< zv+1&%nQfKqgOGizWZ#+p`xjxG|3vPssPw@~{FXWzoYMQ&_I>zCof}Qf10IiXgoOd- zF`GL+0)^5>;&h1fV{#?MW&}AWhLaLxGTP zhuz)m-6>PjX$#2RT3DMLP&pz+r5I&lI|&ggGqOdAsA+n{Z0Ydb7N$X&0m3bh&(`L# zTg7TimzHm{OR_4mszI|F(uTkYQV`?-zJeRIT~PqIMt>E7@-M` zEv3Qr@Q`*Ijz(ZPXM7DUzGhE@-Q#L@x24yl{U~{PDcZzGqeQFENqPwNGD_s&9Yu1d zapQDKpQ8*<7~vff_RhTjZ91IA<3rMMxE4ysh8dMQI>xmkr982QnRV%=nqBfX%70=1 E20S4&e*gdg diff --git a/Unreal/Plugins/AirSim/Source/RenderRequest.cpp b/Unreal/Plugins/AirSim/Source/RenderRequest.cpp index 6c07ad5d6d..9b8583d9ca 100644 --- a/Unreal/Plugins/AirSim/Source/RenderRequest.cpp +++ b/Unreal/Plugins/AirSim/Source/RenderRequest.cpp @@ -4,7 +4,8 @@ #include "Async/TaskGraphInterfaces.h" #include "ImageUtils.h" #include "UnrealString.h" - +#include +#include #include "AirBlueprintLib.h" #include "Async/Async.h" @@ -37,8 +38,11 @@ void RenderRequest::fastScreenshot(std::shared_ptr param, std::sha This->FastTask(); } ); - }, true); - while (!fast_cap_done_) {} //Spin lock. + }, false); + while (!fast_cap_done_) + { + std::this_thread::sleep_for(std::chrono::microseconds(500)); + } //Spin lock. } void RenderRequest::FastTask() @@ -47,15 +51,13 @@ void RenderRequest::FastTask() EPixelFormat pixelFormat = fast_cap_texture_->GetFormat(); uint32 width = fast_cap_texture_->GetSizeX(); uint32 height = fast_cap_texture_->GetSizeY(); - fast_cap_tex_size_ = width * height; - // uint32 stride; - auto *src = (const unsigned char*)RHILockTexture2D(fast_cap_texture_, 0, RLM_ReadOnly, stride, false); // needs to be on render thread? + auto *src = (const unsigned char*)RHILockTexture2D(fast_cap_texture_, 0, RLM_ReadOnly, stride, false); // needs to be on render thread fast_result_->image_data_uint8.Reset(fast_result_->image_data_uint8.Num()); - fast_result_->image_data_uint8.Append(src, width * height); + fast_result_->image_data_uint8.Append(src, height * stride); //void *dest = static_cast(fast_result_->image_data_uint8.GetData()); //if (src && dest) -// FMemory::BigBlockMemcpy(dest, src, fast_cap_tex_size_); + // FMemory::BigBlockMemcpy(dest, src, height * stride); RHIUnlockTexture2D(fast_cap_texture_, 0, false); fast_cap_done_ = true; } From 57602f66fc5094e63e86a3737ce60d1c83ba8327 Mon Sep 17 00:00:00 2001 From: "Nicholas Gyde (Collabera)" Date: Tue, 18 Feb 2020 13:04:11 -0800 Subject: [PATCH 03/29] Improvements to image capture speedup --- .../Content/Blueprints/BP_FlyingPawn.uasset | Bin 153281 -> 150741 bytes .../Content/Blueprints/BP_PIPCamera.uasset | Bin 29157 -> 29344 bytes .../Plugins/AirSim/Source/RenderRequest.cpp | 4 +- .../AirSim/Source/UnrealImageCapture.cpp | 253 +++++++++--------- 4 files changed, 128 insertions(+), 129 deletions(-) diff --git a/Unreal/Plugins/AirSim/Content/Blueprints/BP_FlyingPawn.uasset b/Unreal/Plugins/AirSim/Content/Blueprints/BP_FlyingPawn.uasset index 0f4b2616d7668aeb476e00f70ac54af5503c344d..41ff672653159a18450e71d97a72579cd89fafe9 100644 GIT binary patch literal 150741 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

~7l@hD4egx6)Uc|7q2y$;5 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�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 WWd96j{}8f&hO-papd>^z<^KSmJl?PX diff --git a/Unreal/Plugins/AirSim/Content/Blueprints/BP_PIPCamera.uasset b/Unreal/Plugins/AirSim/Content/Blueprints/BP_PIPCamera.uasset index 8a9fef2d21398a68bc6a8469349d824085fd3a3c..58e6d9813a76cbb854b5a323cf39e995b40e09a1 100644 GIT binary patch literal 29344 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 KFt*eGru=_r{Ui$j literal 29157 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 param, std::sha } ); }, false); - while (!fast_cap_done_) + while (!fast_cap_done_) //Waits for render thread to finish. Game thread command above merely queues render command. { std::this_thread::sleep_for(std::chrono::microseconds(500)); - } //Spin lock. + } } void RenderRequest::FastTask() diff --git a/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp b/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp index 473041e7cb..f63c853b4c 100644 --- a/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp +++ b/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp @@ -6,165 +6,164 @@ #include "common/ClockFactory.hpp" UnrealImageCapture::UnrealImageCapture(const common_utils::UniqueValueMap* cameras) - : cameras_(cameras) + : cameras_(cameras) { - //TODO: explore screenshot option - //addScreenCaptureHandler(camera->GetWorld()); + //TODO: explore screenshot option + //addScreenCaptureHandler(camera->GetWorld()); } UnrealImageCapture::~UnrealImageCapture() {} -void UnrealImageCapture::getImages(const std::vector& requests, - std::vector& responses) const +void UnrealImageCapture::getImages(const std::vector& requests, + std::vector& responses) const { - if (cameras_->valsSize() == 0) { - for (unsigned int i = 0; i < requests.size(); ++i) { - responses.push_back(ImageResponse()); - responses[responses.size() - 1].message = "camera is not set"; - } - } - else - getSceneCaptureImage(requests, responses, false); + if (cameras_->valsSize() == 0) { + for (unsigned int i = 0; i < requests.size(); ++i) { + responses.push_back(ImageResponse()); + responses[responses.size() - 1].message = "camera is not set"; + } + } + else + getSceneCaptureImage(requests, responses, false); } -void UnrealImageCapture::getSceneCaptureImage(const std::vector& requests, - std::vector& responses, bool use_safe_method) const +void UnrealImageCapture::getSceneCaptureImage(const std::vector& requests, + std::vector& responses, bool use_safe_method) const { - std::vector> render_params; - //std::vector> render_results; - - bool visibilityChanged = false; - for (unsigned int i = 0; i < requests.size(); ++i) { - APIPCamera* camera = cameras_->at(requests.at(i).camera_name); - //TODO: may be we should have these methods non-const? - visibilityChanged = const_cast(this)->updateCameraVisibility(camera, requests[i]) || visibilityChanged; - } - - if (use_safe_method && visibilityChanged) { - // We don't do game/render thread synchronization for safe method. - // We just blindly sleep for 200ms (the old way) - std::this_thread::sleep_for(std::chrono::duration(0.2)); - } - - UGameViewportClient * gameViewport = nullptr; - for (unsigned int i = 0; i < requests.size(); ++i) { - APIPCamera* camera = cameras_->at(requests.at(i).camera_name); - if (gameViewport == nullptr) { - gameViewport = camera->GetWorld()->GetGameViewport(); - } - - responses.push_back(ImageResponse()); - ImageResponse& response = responses.at(i); - - UTextureRenderTarget2D* textureTarget = nullptr; - USceneCaptureComponent2D* capture = camera->getCaptureComponent(requests[i].image_type, false); - if (capture == nullptr) { - response.message = "Can't take screenshot because none camera type is not active"; - } - else if (capture->TextureTarget == nullptr) { - response.message = "Can't take screenshot because texture target is null"; - } - else - textureTarget = capture->TextureTarget; - - render_params.push_back(std::make_shared(capture, textureTarget, requests[i].pixels_as_float, requests[i].compress)); - } - - if (nullptr == gameViewport) { - return; - } - - auto query_camera_pose_cb = [this, &requests, &responses]() { - size_t count = requests.size(); - for (size_t i = 0; i < count; i++) { - const ImageRequest& request = requests.at(i); - APIPCamera* camera = cameras_->at(request.camera_name); - ImageResponse& response = responses.at(i); - auto camera_pose = camera->getPose(); - response.camera_position = camera_pose.position; - response.camera_orientation = camera_pose.orientation; - } - }; - RenderRequest render_request { gameViewport, std::move(query_camera_pose_cb) }; - - //render_request.getScreenshot(render_params.data(), render_results, render_params.size(), use_safe_method); - ////// + std::vector> render_params; + //std::vector> render_results; + + bool visibilityChanged = false; + //for (unsigned int i = 0; i < requests.size(); ++i) { + APIPCamera* camera = cameras_->at(requests.at(0).camera_name); + //TODO: may be we should have these methods non-const? + visibilityChanged = const_cast(this)->updateCameraVisibility(camera, requests[0]) || visibilityChanged; + //} + + //if (use_safe_method && visibilityChanged) { + // We don't do game/render thread synchronization for safe method. + // We just blindly sleep for 200ms (the old way) + // std::this_thread::sleep_for(std::chrono::duration(0.2)); + //} + + //UGameViewportClient * gameViewport = nullptr; + //for (unsigned int i = 0; i < requests.size(); ++i) + //{ + //APIPCamera* camera = cameras_->at(requests.at(0).camera_name); + USceneCaptureComponent2D* capture = camera->getCaptureComponent(requests[0].image_type, false); + + // if (gameViewport == nullptr) { + // gameViewport = camera->GetWorld()->GetGameViewport(); + // } + + responses.push_back(ImageResponse()); + ImageResponse& response = responses.at(responses.size() - 1); + + UTextureRenderTarget2D* textureTarget = nullptr; + //if (capture == nullptr) { + // response.message = "Can't take screenshot because none camera type is not active"; + //} + //else if (capture->TextureTarget == nullptr) { + // response.message = "Can't take screenshot because texture target is null"; + //} + //else + textureTarget = capture->TextureTarget; + + render_params.push_back(std::make_shared(capture, textureTarget, requests[0].pixels_as_float, requests[0].compress)); + + // if (nullptr == gameViewport) { + // return; + // } + + //auto query_camera_pose_cb = [this, &requests, &responses]() { + // size_t count = requests.size(); + // for (size_t i = 0; i < count; i++) { + // const ImageRequest& request = requests.at(i); + // APIPCamera* camera = cameras_->at(request.camera_name); + // ImageResponse& response = responses.at(i); + // auto camera_pose = camera->getPose(); + // response.camera_position = camera_pose.position; + // response.camera_orientation = camera_pose.orientation; + // } + //}; + RenderRequest render_request{ nullptr, nullptr }; //gameViewport, std::move(query_camera_pose_cb) }; + + //render_request.getScreenshot(render_params.data(), render_results, render_params.size(), use_safe_method); render_request.fast_param_ = render_params.at(0).get(); render_request.fast_result_ = new RenderRequest::RenderResult(); //TODO: MEMORY LEAK //std::make_shared(); //auto param = render_params.at(0); //auto result = std::make_shared(); - UAirBlueprintLib::RunCommandOnGameThread([this, &render_request]() { + //UAirBlueprintLib::RunCommandOnGameThread([this, &render_request]() { render_request.fastScreenshot(nullptr, nullptr); - }, true); + //}, true); ////// - //for (unsigned int i = 0; i < requests.size(); ++i) { - // const ImageRequest& request = requests.at(i); - // ImageResponse& response = responses.at(i); + //for (unsigned int i = 0; i < requests.size(); ++i) { + // const ImageRequest& request = requests.at(i); + // ImageResponse& response = responses.at(i); const ImageRequest &request = requests.at(0); - ImageResponse &response = responses.at(0); - response.camera_name = request.camera_name; - response.time_stamp = render_request.fast_result_->time_stamp; - response.image_data_uint8 = std::vector(render_request.fast_result_->image_data_uint8.GetData(), render_request.fast_result_->image_data_uint8.GetData() + render_request.fast_result_->image_data_uint8.Num()); - //response.image_data_float = std::vector(result->image_data_float.GetData(), result->image_data_float.GetData() + render_results[i]->image_data_float.Num()); - - if (use_safe_method) { - // Currently, we don't have a way to synthronize image capturing and camera pose when safe method is used, - APIPCamera* camera = cameras_->at(request.camera_name); - msr::airlib::Pose pose = camera->getPose(); - response.camera_position = pose.position; - response.camera_orientation = pose.orientation; - } - response.pixels_as_float = request.pixels_as_float; - response.compress = request.compress; - response.width = render_request.fast_result_->width; - response.height = render_request.fast_result_->height; - response.image_type = request.image_type; - //} - + //ImageResponse &response = responses.at(i); + //response.camera_name = request.camera_name; + response.time_stamp = render_request.fast_result_->time_stamp; + response.image_data_uint8 = std::vector(render_request.fast_result_->image_data_uint8.GetData(), render_request.fast_result_->image_data_uint8.GetData() + render_request.fast_result_->image_data_uint8.Num()); + //response.image_data_float = std::vector(result->image_data_float.GetData(), result->image_data_float.GetData() + render_results[i]->image_data_float.Num()); + + /*if (use_safe_method) { + // Currently, we don't have a way to synthronize image capturing and camera pose when safe method is used, + APIPCamera* camera = cameras_->at(request.camera_name); + msr::airlib::Pose pose = camera->getPose(); + response.camera_position = pose.position; + response.camera_orientation = pose.orientation; + }*/ + response.pixels_as_float = request.pixels_as_float; + response.compress = request.compress; + response.width = render_request.fast_result_->width; + response.height = render_request.fast_result_->height; + response.image_type = request.image_type; + //} } bool UnrealImageCapture::updateCameraVisibility(APIPCamera* camera, const msr::airlib::ImageCaptureBase::ImageRequest& request) { - bool visibilityChanged = false; - if (! camera->getCameraTypeEnabled(request.image_type)) { - camera->setCameraTypeEnabled(request.image_type, true); - visibilityChanged = true; - } + bool visibilityChanged = false; + if (!camera->getCameraTypeEnabled(request.image_type)) { + camera->setCameraTypeEnabled(request.image_type, true); + visibilityChanged = true; + } - return visibilityChanged; + return visibilityChanged; } bool UnrealImageCapture::getScreenshotScreen(ImageType image_type, std::vector& compressedPng) { - FScreenshotRequest::RequestScreenshot(false); // This is an async operation - return true; + FScreenshotRequest::RequestScreenshot(false); // This is an async operation + return true; } void UnrealImageCapture::addScreenCaptureHandler(UWorld *world) { - static bool is_installed = false; - - if (!is_installed) { - UGameViewportClient* ViewportClient = world->GetGameViewport(); - ViewportClient->OnScreenshotCaptured().Clear(); - ViewportClient->OnScreenshotCaptured().AddLambda( - [this](int32 SizeX, int32 SizeY, const TArray& Bitmap) - { - // Make sure that all alpha values are opaque. - TArray& RefBitmap = const_cast&>(Bitmap); - for(auto& Color : RefBitmap) - Color.A = 255; - - TArray last_compressed_png; - FImageUtils::CompressImageArray(SizeX, SizeY, RefBitmap, last_compressed_png); - last_compressed_png_ = std::vector(last_compressed_png.GetData(), last_compressed_png.GetData() + last_compressed_png.Num()); - }); - - is_installed = true; - } + static bool is_installed = false; + + if (!is_installed) { + UGameViewportClient* ViewportClient = world->GetGameViewport(); + ViewportClient->OnScreenshotCaptured().Clear(); + ViewportClient->OnScreenshotCaptured().AddLambda( + [this](int32 SizeX, int32 SizeY, const TArray& Bitmap) + { + // Make sure that all alpha values are opaque. + TArray& RefBitmap = const_cast&>(Bitmap); + for (auto& Color : RefBitmap) + Color.A = 255; + + TArray last_compressed_png; + FImageUtils::CompressImageArray(SizeX, SizeY, RefBitmap, last_compressed_png); + last_compressed_png_ = std::vector(last_compressed_png.GetData(), last_compressed_png.GetData() + last_compressed_png.Num()); + }); + + is_installed = true; + } } From 8c3a757fbdec781f3902cbad86be5edd767c6f7e Mon Sep 17 00:00:00 2001 From: "Nicholas Gyde (Collabera)" Date: Wed, 4 Mar 2020 15:25:59 -0800 Subject: [PATCH 04/29] Cleaned up fast img capture, but it's less faster for some reason. --- .../DroneTextureRenderTarget2D.uasset | Bin 2513 -> 0 bytes Unreal/Plugins/AirSim/Source/PawnSimApi.cpp | 20 +- Unreal/Plugins/AirSim/Source/PawnSimApi.h | 4 +- .../Plugins/AirSim/Source/RenderRequest.cpp | 221 ++---------------- Unreal/Plugins/AirSim/Source/RenderRequest.h | 39 +--- .../AirSim/Source/UnrealImageCapture.cpp | 133 ++--------- .../AirSim/Source/UnrealImageCapture.h | 8 +- 7 files changed, 64 insertions(+), 361 deletions(-) delete mode 100644 Unreal/Plugins/AirSim/Content/Blueprints/DroneTextureRenderTarget2D.uasset diff --git a/Unreal/Plugins/AirSim/Content/Blueprints/DroneTextureRenderTarget2D.uasset b/Unreal/Plugins/AirSim/Content/Blueprints/DroneTextureRenderTarget2D.uasset deleted file mode 100644 index eecc7662d795e89b1182356edc7417053aa982d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2513 zcmd^BZ){XW5TCP^VrdJ4puwskd?3*O*V-P$n7-?~cU)7h$K6$1jkL?%diUV|W#3+H z(FCH=lxR#)Li_-zs3j!EXw;baFF=&&2aQ(0)IW&^G}=gFLJg?ZI`i)KdaYOLcYn!y zJ3BKwGdnvw@11#M%kkf5XJ?1X0It0TY#<32$!hCoqFQ&jnRJrRgIaHQv%WdIY~ zjt(4-R_Z6ejCRyM_}V4(VXq^H<**Lv?&tTy8l2VD^?BOrf;_>Q#T(iholaW;;Nx9) zEvA6WYz$WfE)y|{9zVG*$5U@i-7M|55gARIDMDtl$(_jZj4)HuYSIPfAk0T(R`4KC zMY#ww5#!RSL;2_Df4PBHg(AYt$fmBe;C;Qj_wa~>E53$1R~E@UshEkme5~_P-zsEl zmc^wnnMn(&Gs)nmmv@G%k?$UrJRs5;F61cu=x;cU0Yg`USr*6#Mh@MKv#SJj?$T2y zNySqlUL!4%Ou}#Dx3$qRc(Y~{x&nX1t8n5=$%50DzG&~JNP5gzT$-tvt+@Zx2@j=h z2bau__rifUo+dMPflQZuSWSD)ZM|Sg`}*}M%qs*~WG{p#i3^$g zct3n}Xv_O*HURsd=$)isLsDcTbK7o)qciJ}T_SUM(v6!A?xM;h(6$LPST`$jBrKHu zi888wLMa(}A}Co+ZaR-wN|wLg@Hg65OURG%MLfz9fol4{K>0zF1)FN!LLQwAf#T3? z3gA?cAF`$F<;DLR7TP3*zZUqW<04Rg&)XD$T}yfTYJ-ZQlpnQD>Ck*6|MVd9V8HLK zu3S&mRPEcY2bFj^1++EVK7rd?*43aTwpupEIB90=b7XR#WeBgd?{mu4frhiU!gi1MNFWhvq4vw@<1plq< PawnSimApi::getImages( - const std::vector& requests) const +void PawnSimApi::getImages(const std::vector& requests, std::vector &responses) const { - std::vector responses; - - const ImageCaptureBase* camera = getImageCapture(); - camera->getImages(requests, responses); - - return responses; + for (int i = 0; i < requests.size() && i < responses.size(); ++i) + getImage(requests[i], responses[i]); } -std::vector PawnSimApi::getImage(const std::string& camera_name, ImageCaptureBase::ImageType image_type) const +void PawnSimApi::getImage(const ImageCaptureBase::ImageRequest& request, ImageCaptureBase::ImageResponse &response) const { - std::vector request = { ImageCaptureBase::ImageRequest(camera_name, image_type) }; - const std::vector& response = getImages(request); - if (response.size() > 0) - return response.at(0).image_data_uint8; - else - return std::vector(); + getImageCapture()->getImage(request, response); } void PawnSimApi::setRCForceFeedback(float rumble_strength, float auto_center) diff --git a/Unreal/Plugins/AirSim/Source/PawnSimApi.h b/Unreal/Plugins/AirSim/Source/PawnSimApi.h index 750d865065..0051e4c337 100644 --- a/Unreal/Plugins/AirSim/Source/PawnSimApi.h +++ b/Unreal/Plugins/AirSim/Source/PawnSimApi.h @@ -72,8 +72,8 @@ class PawnSimApi : public msr::airlib::VehicleSimApiBase { virtual void update() override; virtual const UnrealImageCapture* getImageCapture() const override; - virtual std::vector getImages(const std::vector& request) const override; - virtual std::vector getImage(const std::string& camera_name, ImageCaptureBase::ImageType image_type) const override; + virtual void getImages(const std::vector& request, std::vector &responses) const override; + virtual void getImage(const ImageCaptureBase::ImageRequest& request, ImageCaptureBase::ImageResponse &response) const override; virtual Pose getPose() const override; virtual void setPose(const Pose& pose, bool ignore_collision) override; virtual msr::airlib::CameraInfo getCameraInfo(const std::string& camera_name) const override; diff --git a/Unreal/Plugins/AirSim/Source/RenderRequest.cpp b/Unreal/Plugins/AirSim/Source/RenderRequest.cpp index 2976db3ffc..168683eab7 100644 --- a/Unreal/Plugins/AirSim/Source/RenderRequest.cpp +++ b/Unreal/Plugins/AirSim/Source/RenderRequest.cpp @@ -9,219 +9,48 @@ #include "AirBlueprintLib.h" #include "Async/Async.h" -RenderRequest::RenderRequest(UGameViewportClient * game_viewport, std::function&& query_camera_pose_cb) - : params_(nullptr), results_(nullptr), req_size_(0), - wait_signal_(new msr::airlib::WorkerThreadSignal), - game_viewport_(game_viewport), query_camera_pose_cb_(std::move(query_camera_pose_cb)) -{ -} +RenderRequest::RenderRequest(std::vector& rgb_output) : rgba_output_(&rgb_output) +{} RenderRequest::~RenderRequest() -{ -} +{} -void RenderRequest::fastScreenshot(std::shared_ptr param, std::shared_ptr result) +void RenderRequest::FastScreenshot() { - //params_ = ¶m; - //results_ = &result; - //fast_param_ = param.get(); - //fast_result_ = result.get(); - UAirBlueprintLib::RunCommandOnGameThread([this]() { fast_cap_done_ = false; - fast_rt_resource_ = fast_param_->render_component->TextureTarget->GameThread_GetRenderTargetResource(); - fast_param_->render_component->CaptureScene(); + fast_rt_resource_ = fast_param_.render_component->TextureTarget->GameThread_GetRenderTargetResource(); + fast_param_.render_component->CaptureScene(); ENQUEUE_UNIQUE_RENDER_COMMAND_ONEPARAMETER( SceneDrawCompletion, RenderRequest *, This, this, { - This->FastTask(); + This->RenderThreadScreenshotTask(); } ); + //Reserve a default amount of space while the other threads run. If it's sufficient, it will save the render thread some time. + rgb_output_.reserve(126 * 126); }, false); - while (!fast_cap_done_) //Waits for render thread to finish. Game thread command above merely queues render command. - { - std::this_thread::sleep_for(std::chrono::microseconds(500)); - } + + //Try to wait just long enough for the render thread to finish the capture. + //Start with a long-ish wait, then check for completion more frequently. + for (int best_guess_cap_time_microseconds = 500; !fast_cap_done_; best_guess_cap_time_microseconds = 500) + std::this_thread::sleep_for(std::chrono::microseconds(best_guess_cap_time_microseconds)); } -void RenderRequest::FastTask() +void RenderRequest::RenderThreadScreenshotTask() { - fast_cap_texture_ = fast_rt_resource_->TextureRHI->GetTexture2D(); - EPixelFormat pixelFormat = fast_cap_texture_->GetFormat(); - uint32 width = fast_cap_texture_->GetSizeX(); - uint32 height = fast_cap_texture_->GetSizeY(); + FRHITexture2D *fast_cap_texture = fast_rt_resource_->TextureRHI->GetTexture2D(); + EPixelFormat pixelFormat = fast_cap_texture->GetFormat(); + uint32 width = fast_cap_texture->GetSizeX(); + uint32 height = fast_cap_texture->GetSizeY(); uint32 stride; - auto *src = (const unsigned char*)RHILockTexture2D(fast_cap_texture_, 0, RLM_ReadOnly, stride, false); // needs to be on render thread - fast_result_->image_data_uint8.Reset(fast_result_->image_data_uint8.Num()); - fast_result_->image_data_uint8.Append(src, height * stride); + auto *src = (const unsigned char*)RHILockTexture2D(fast_cap_texture, 0, RLM_ReadOnly, stride, false); // needs to be on render thread + //fast_result_->image_data_uint8.Reset(fast_result_->image_data_uint8.Num()); + //fast_result_->image_data_uint8.Append(src, height * stride); //void *dest = static_cast(fast_result_->image_data_uint8.GetData()); - //if (src && dest) - // FMemory::BigBlockMemcpy(dest, src, height * stride); - RHIUnlockTexture2D(fast_cap_texture_, 0, false); + if (src) + rgba_output_->insert(rgba_output_->begin(), &src[0], &src[height * stride]);//FMemory::BigBlockMemcpy(rgb_output, src, height * stride); + RHIUnlockTexture2D(fast_cap_texture, 0, false); fast_cap_done_ = true; } - -// read pixels from render target using render thread, then compress the result into PNG -// argument on the thread that calls this method. -void RenderRequest::getScreenshot(std::shared_ptr params[], std::vector>& results, unsigned int req_size, bool use_safe_method) -{ - //TODO: is below really needed? - for (unsigned int i = 0; i < req_size; ++i) { - results.push_back(std::make_shared()); - - if (!params[i]->pixels_as_float) - results[i]->bmp.Reset(); - else - results[i]->bmp_float.Reset(); - results[i]->time_stamp = 0; - } - - //make sure we are not on the rendering thread - CheckNotBlockedOnRenderThread(); - - if (use_safe_method) { - for (unsigned int i = 0; i < req_size; ++i) { - //TODO: below doesn't work right now because it must be running in game thread - FIntPoint img_size; - if (!params[i]->pixels_as_float) { - //below is documented method but more expensive because it forces flush - FTextureRenderTargetResource* rt_resource = params[i]->render_target->GameThread_GetRenderTargetResource(); - auto flags = setupRenderResource(rt_resource, params[i].get(), results[i].get(), img_size); - rt_resource->ReadPixels(results[i]->bmp, flags); - } - else { - FTextureRenderTargetResource* rt_resource = params[i]->render_target->GetRenderTargetResource(); - setupRenderResource(rt_resource, params[i].get(), results[i].get(), img_size); - rt_resource->ReadFloat16Pixels(results[i]->bmp_float); - } - } - } - else { - //wait for render thread to pick up our task - params_ = params; - results_ = results.data(); - req_size_ = req_size; - - // Queue up the task of querying camera pose in the game thread and synchronizing render thread with camera pose - AsyncTask(ENamedThreads::GameThread, [this]() { - check(IsInGameThread()); - - saved_DisableWorldRendering_ = game_viewport_->bDisableWorldRendering; - game_viewport_->bDisableWorldRendering = 0; - end_draw_handle_ = game_viewport_->OnEndDraw().AddLambda([this] { - check(IsInGameThread()); - - // capture CameraPose for this frame - query_camera_pose_cb_(); - - // The completion is called immeidately after GameThread sends the - // rendering commands to RenderThread. Hence, our ExecuteTask will - // execute *immediately* after RenderThread renders the scene! - RenderRequest* This = this; - ENQUEUE_RENDER_COMMAND(SceneDrawCompletion)( - [This](FRHICommandListImmediate& RHICmdList) - { - This->ExecuteTask(); - }); - - game_viewport_->bDisableWorldRendering = saved_DisableWorldRendering_; - - assert(end_draw_handle_.IsValid()); - game_viewport_->OnEndDraw().Remove(end_draw_handle_); - }); - - // while we're still on GameThread, enqueue request for capture the scene! - for (unsigned int i = 0; i < req_size_; ++i) { - params_[i]->render_component->CaptureSceneDeferred(); - } - }); - - // wait for this task to complete - while (!wait_signal_->waitFor(5)) { - // log a message and continue wait - // lamda function still references a few objects for which there is no refcount. - // Walking away will cause memory corruption, which is much more difficult to debug. - UE_LOG(LogTemp, Warning, TEXT("Failed: timeout waiting for screenshot")); - } - } - - for (unsigned int i = 0; i < req_size; ++i) { - if (!params[i]->pixels_as_float) { - if (results[i]->width != 0 && results[i]->height != 0) { - results[i]->image_data_uint8.SetNumUninitialized(results[i]->width * results[i]->height * 3, false); - if (params[i]->compress) - UAirBlueprintLib::CompressImageArray(results[i]->width, results[i]->height, results[i]->bmp, results[i]->image_data_uint8); - else { - uint8* ptr = results[i]->image_data_uint8.GetData(); - for (const auto& item : results[i]->bmp) { - *ptr++ = item.B; - *ptr++ = item.G; - *ptr++ = item.R; - } - } - } - } - else { - results[i]->image_data_float.SetNumUninitialized(results[i]->width * results[i]->height); - float* ptr = results[i]->image_data_float.GetData(); - for (const auto& item : results[i]->bmp_float) { - *ptr++ = item.R.GetFloat(); - } - } - } -} - -FReadSurfaceDataFlags RenderRequest::setupRenderResource(const FTextureRenderTargetResource* rt_resource, const RenderParams* params, RenderResult* result, FIntPoint& size) -{ - size = rt_resource->GetSizeXY(); - result->width = size.X; - result->height = size.Y; - FReadSurfaceDataFlags flags(RCM_UNorm, CubeFace_MAX); - flags.SetLinearToGamma(false); - - return flags; -} - -void RenderRequest::ExecuteTask() -{ - if (params_ != nullptr && req_size_ > 0) - { - for (unsigned int i = 0; i < req_size_; ++i) { - FRHICommandListImmediate& RHICmdList = GetImmediateCommandList_ForRenderCommand(); - auto rt_resource = params_[i]->render_target->GetRenderTargetResource(); - if (rt_resource != nullptr) { - const FTexture2DRHIRef& rhi_texture = rt_resource->GetRenderTargetTexture(); - FIntPoint size; - auto flags = setupRenderResource(rt_resource, params_[i].get(), results_[i].get(), size); - - //should we be using ENQUEUE_UNIQUE_RENDER_COMMAND_ONEPARAMETER which was in original commit by @saihv - //https://github.com/Microsoft/AirSim/pull/162/commits/63e80c43812300a8570b04ed42714a3f6949e63f#diff-56b790f9394f7ca1949ddbb320d8456fR64 - if (!params_[i]->pixels_as_float) { - //below is undocumented method that avoids flushing, but it seems to segfault every 2000 or so calls - RHICmdList.ReadSurfaceData( - rhi_texture, - FIntRect(0, 0, size.X, size.Y), - results_[i]->bmp, - flags); - } - else { - RHICmdList.ReadSurfaceFloatData( - rhi_texture, - FIntRect(0, 0, size.X, size.Y), - results_[i]->bmp_float, - CubeFace_PosX, 0, 0 - ); - } - } - - results_[i]->time_stamp = msr::airlib::ClockFactory::get()->nowNanos(); - } - - req_size_ = 0; - params_ = nullptr; - results_ = nullptr; - - wait_signal_->signal(); - } -} diff --git a/Unreal/Plugins/AirSim/Source/RenderRequest.h b/Unreal/Plugins/AirSim/Source/RenderRequest.h index 450588cdec..2bd22b604d 100644 --- a/Unreal/Plugins/AirSim/Source/RenderRequest.h +++ b/Unreal/Plugins/AirSim/Source/RenderRequest.h @@ -13,15 +13,10 @@ class RenderRequest : public FRenderCommand { public: struct RenderParams { - USceneCaptureComponent2D * const render_component; + USceneCaptureComponent2D *render_component; UTextureRenderTarget2D* render_target; bool pixels_as_float; bool compress; - - RenderParams(USceneCaptureComponent2D * render_component_val, UTextureRenderTarget2D* render_target_val, bool pixels_as_float_val, bool compress_val) - : render_component(render_component_val), render_target(render_target_val), pixels_as_float(pixels_as_float_val), compress(compress_val) - { - } }; struct RenderResult { TArray image_data_uint8; @@ -37,48 +32,32 @@ class RenderRequest : public FRenderCommand }; private: - static FReadSurfaceDataFlags setupRenderResource(const FTextureRenderTargetResource* rt_resource, const RenderParams* params, RenderResult* result, FIntPoint& size); - std::shared_ptr* params_; std::shared_ptr* results_; public: - RenderParams *fast_param_; - RenderResult *fast_result_; + RenderParams fast_param_{ nullptr, nullptr, false, false }; + std::vector *rgba_output_ = nullptr; + +private: volatile bool fast_cap_done_ = false; FTextureRenderTargetResource* fast_rt_resource_; -private: - FRHITexture2D *fast_cap_texture_; - volatile unsigned int fast_cap_tex_size_; - volatile unsigned int req_size_; std::shared_ptr wait_signal_; bool saved_DisableWorldRendering_ = false; - UGameViewportClient * const game_viewport_; + //UGameViewportClient * const game_viewport_; FDelegateHandle end_draw_handle_; std::function query_camera_pose_cb_; public: - RenderRequest(UGameViewportClient * game_viewport, std::function&& query_camera_pose_cb); + RenderRequest(std::vector& rgb_output); ~RenderRequest(); - void DoTask(ENamedThreads::Type CurrentThread, const FGraphEventRef& MyCompletionGraphEvent) - { - ExecuteTask(); - } - FORCEINLINE TStatId GetStatId() const { RETURN_QUICK_DECLARE_CYCLE_STAT(RenderRequest, STATGROUP_RenderThreadCommands); } - void fastScreenshot(std::shared_ptr param, std::shared_ptr result); - - // read pixels from render target using render thread, then compress the result into PNG - // argument on the thread that calls this method. - void getScreenshot( - std::shared_ptr params[], std::vector>& results, unsigned int req_size, bool use_safe_method); - - void ExecuteTask(); - void FastTask(); + void FastScreenshot(); + void RenderThreadScreenshotTask(); }; diff --git a/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp b/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp index f63c853b4c..57706bad28 100644 --- a/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp +++ b/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp @@ -15,127 +15,34 @@ UnrealImageCapture::UnrealImageCapture(const common_utils::UniqueValueMap& requests, - std::vector& responses) const +void UnrealImageCapture::getImages(const std::vector& requests, std::vector& responses) const { - if (cameras_->valsSize() == 0) { - for (unsigned int i = 0; i < requests.size(); ++i) { - responses.push_back(ImageResponse()); - responses[responses.size() - 1].message = "camera is not set"; - } - } - else - getSceneCaptureImage(requests, responses, false); + for (int i = 0; i < requests.size() && i < responses.size(); ++i) + getImage(requests[i], responses[i]); } - -void UnrealImageCapture::getSceneCaptureImage(const std::vector& requests, - std::vector& responses, bool use_safe_method) const +void UnrealImageCapture::getImage(const msr::airlib::ImageCaptureBase::ImageRequest& request, msr::airlib::ImageCaptureBase::ImageResponse& response) const { - std::vector> render_params; - //std::vector> render_results; - - bool visibilityChanged = false; - //for (unsigned int i = 0; i < requests.size(); ++i) { - APIPCamera* camera = cameras_->at(requests.at(0).camera_name); - //TODO: may be we should have these methods non-const? - visibilityChanged = const_cast(this)->updateCameraVisibility(camera, requests[0]) || visibilityChanged; - //} - - //if (use_safe_method && visibilityChanged) { - // We don't do game/render thread synchronization for safe method. - // We just blindly sleep for 200ms (the old way) - // std::this_thread::sleep_for(std::chrono::duration(0.2)); - //} - - //UGameViewportClient * gameViewport = nullptr; - //for (unsigned int i = 0; i < requests.size(); ++i) - //{ - //APIPCamera* camera = cameras_->at(requests.at(0).camera_name); - USceneCaptureComponent2D* capture = camera->getCaptureComponent(requests[0].image_type, false); - - // if (gameViewport == nullptr) { - // gameViewport = camera->GetWorld()->GetGameViewport(); - // } - - responses.push_back(ImageResponse()); - ImageResponse& response = responses.at(responses.size() - 1); - - UTextureRenderTarget2D* textureTarget = nullptr; - //if (capture == nullptr) { - // response.message = "Can't take screenshot because none camera type is not active"; - //} - //else if (capture->TextureTarget == nullptr) { - // response.message = "Can't take screenshot because texture target is null"; - //} - //else - textureTarget = capture->TextureTarget; - - render_params.push_back(std::make_shared(capture, textureTarget, requests[0].pixels_as_float, requests[0].compress)); - - // if (nullptr == gameViewport) { - // return; - // } - - //auto query_camera_pose_cb = [this, &requests, &responses]() { - // size_t count = requests.size(); - // for (size_t i = 0; i < count; i++) { - // const ImageRequest& request = requests.at(i); - // APIPCamera* camera = cameras_->at(request.camera_name); - // ImageResponse& response = responses.at(i); - // auto camera_pose = camera->getPose(); - // response.camera_position = camera_pose.position; - // response.camera_orientation = camera_pose.orientation; - // } - //}; - RenderRequest render_request{ nullptr, nullptr }; //gameViewport, std::move(query_camera_pose_cb) }; - - //render_request.getScreenshot(render_params.data(), render_results, render_params.size(), use_safe_method); - render_request.fast_param_ = render_params.at(0).get(); - render_request.fast_result_ = new RenderRequest::RenderResult(); //TODO: MEMORY LEAK //std::make_shared(); - - //auto param = render_params.at(0); - //auto result = std::make_shared(); - //UAirBlueprintLib::RunCommandOnGameThread([this, &render_request]() { - render_request.fastScreenshot(nullptr, nullptr); - //}, true); - ////// - - //for (unsigned int i = 0; i < requests.size(); ++i) { - // const ImageRequest& request = requests.at(i); - // ImageResponse& response = responses.at(i); - const ImageRequest &request = requests.at(0); - //ImageResponse &response = responses.at(i); - //response.camera_name = request.camera_name; - response.time_stamp = render_request.fast_result_->time_stamp; - response.image_data_uint8 = std::vector(render_request.fast_result_->image_data_uint8.GetData(), render_request.fast_result_->image_data_uint8.GetData() + render_request.fast_result_->image_data_uint8.Num()); - //response.image_data_float = std::vector(result->image_data_float.GetData(), result->image_data_float.GetData() + render_results[i]->image_data_float.Num()); - - /*if (use_safe_method) { - // Currently, we don't have a way to synthronize image capturing and camera pose when safe method is used, - APIPCamera* camera = cameras_->at(request.camera_name); - msr::airlib::Pose pose = camera->getPose(); - response.camera_position = pose.position; - response.camera_orientation = pose.orientation; - }*/ - response.pixels_as_float = request.pixels_as_float; - response.compress = request.compress; - response.width = render_request.fast_result_->width; - response.height = render_request.fast_result_->height; - response.image_type = request.image_type; - //} + getSceneCaptureImage(request.camera_name, request.image_type, response); } - -bool UnrealImageCapture::updateCameraVisibility(APIPCamera* camera, const msr::airlib::ImageCaptureBase::ImageRequest& request) +void UnrealImageCapture::getSceneCaptureImage(const std::string& camera_name, msr::airlib::ImageCaptureBase::ImageType image_type, msr::airlib::ImageCaptureBase::ImageResponse& response) const { - bool visibilityChanged = false; - if (!camera->getCameraTypeEnabled(request.image_type)) { - camera->setCameraTypeEnabled(request.image_type, true); - visibilityChanged = true; - } + APIPCamera* camera = cameras_->at(camera_name); + camera->setCameraTypeEnabled(image_type, true); + + USceneCaptureComponent2D* capture = camera->getCaptureComponent(image_type, false); + UTextureRenderTarget2D* textureTarget = capture->TextureTarget; + + RenderRequest render_request(response.image_data_uint8); + render_request.fast_param_ = RenderRequest::RenderParams{ capture, textureTarget, false, false }; //render_params.at(0).get(); + render_request.FastScreenshot(); - return visibilityChanged; + //response.time_stamp = result->time_stamp; + //response.image_data_uint8 = std::vector(result->image_data_uint8.GetData(), result->image_data_uint8.GetData() + result->image_data_uint8.Num()); + //response.width = result->width; + //response.height = result->height; + response.image_type = image_type; } bool UnrealImageCapture::getScreenshotScreen(ImageType image_type, std::vector& compressedPng) diff --git a/Unreal/Plugins/AirSim/Source/UnrealImageCapture.h b/Unreal/Plugins/AirSim/Source/UnrealImageCapture.h index f160375bcb..bb1b5c61c7 100644 --- a/Unreal/Plugins/AirSim/Source/UnrealImageCapture.h +++ b/Unreal/Plugins/AirSim/Source/UnrealImageCapture.h @@ -14,17 +14,15 @@ class UnrealImageCapture : public msr::airlib::ImageCaptureBase UnrealImageCapture(const common_utils::UniqueValueMap* cameras); virtual ~UnrealImageCapture(); - virtual void getImages(const std::vector& requests, std::vector& responses) const override; + virtual void getImages(const std::vector& requests, std::vector& responses) const override; + virtual void getImage(const ImageRequest& request, ImageResponse& response) const override; private: - void getSceneCaptureImage(const std::vector& requests, - std::vector& responses, bool use_safe_method) const; + void getSceneCaptureImage(const std::string& camera_name, ImageCaptureBase::ImageType image_type, ImageResponse &response) const; void addScreenCaptureHandler(UWorld *world); bool getScreenshotScreen(ImageType image_type, std::vector& compressedPng); - bool updateCameraVisibility(APIPCamera* camera, const msr::airlib::ImageCaptureBase::ImageRequest& request); - private: const common_utils::UniqueValueMap* cameras_; std::vector last_compressed_png_; From e899c94c6dfafdab56f911c0b99f8eaca5a7ce90 Mon Sep 17 00:00:00 2001 From: "Nicholas Gyde (Collabera)" Date: Tue, 10 Mar 2020 11:49:44 -0700 Subject: [PATCH 05/29] remove comments for PR --- Unreal/Plugins/AirSim/Source/RenderRequest.cpp | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/Unreal/Plugins/AirSim/Source/RenderRequest.cpp b/Unreal/Plugins/AirSim/Source/RenderRequest.cpp index 168683eab7..fc25505235 100644 --- a/Unreal/Plugins/AirSim/Source/RenderRequest.cpp +++ b/Unreal/Plugins/AirSim/Source/RenderRequest.cpp @@ -28,13 +28,11 @@ void RenderRequest::FastScreenshot() This->RenderThreadScreenshotTask(); } ); - //Reserve a default amount of space while the other threads run. If it's sufficient, it will save the render thread some time. - rgb_output_.reserve(126 * 126); }, false); //Try to wait just long enough for the render thread to finish the capture. - //Start with a long-ish wait, then check for completion more frequently. - for (int best_guess_cap_time_microseconds = 500; !fast_cap_done_; best_guess_cap_time_microseconds = 500) + //Start with a long wait, then check for completion more frequently. + for (int best_guess_cap_time_microseconds = 500; !fast_cap_done_; best_guess_cap_time_microseconds = 200) std::this_thread::sleep_for(std::chrono::microseconds(best_guess_cap_time_microseconds)); } @@ -46,11 +44,10 @@ void RenderRequest::RenderThreadScreenshotTask() uint32 height = fast_cap_texture->GetSizeY(); uint32 stride; auto *src = (const unsigned char*)RHILockTexture2D(fast_cap_texture, 0, RLM_ReadOnly, stride, false); // needs to be on render thread - //fast_result_->image_data_uint8.Reset(fast_result_->image_data_uint8.Num()); - //fast_result_->image_data_uint8.Append(src, height * stride); - //void *dest = static_cast(fast_result_->image_data_uint8.GetData()); + if (src) - rgba_output_->insert(rgba_output_->begin(), &src[0], &src[height * stride]);//FMemory::BigBlockMemcpy(rgb_output, src, height * stride); + rgba_output_->insert(rgba_output_->begin(), &src[0], &src[height * stride]); + RHIUnlockTexture2D(fast_cap_texture, 0, false); fast_cap_done_ = true; } From 205ae5babf300125b2d80c1e2b39f4670379fe8c Mon Sep 17 00:00:00 2001 From: "Nicholas Gyde (Collabera)" Date: Thu, 12 Mar 2020 15:29:10 -0700 Subject: [PATCH 06/29] Added buffer pool object and used for image capture. Increases speed more. Buffer pool might be useful for other things. --- AirLib/include/api/RpcLibAdapatorsBase.hpp | 4 +- AirLib/include/api/RpcLibClientBase.hpp | 2 +- AirLib/include/api/VehicleSimApiBase.hpp | 4 +- AirLib/include/common/ImageCaptureBase.hpp | 5 +- .../include/common/common_utils/BufferPool.h | 36 ++++++++++++ AirLib/src/api/RpcLibClientBase.cpp | 5 +- AirLib/src/api/RpcLibServerBase.cpp | 28 ++++++---- AirLib/src/common/common_utils/BufferPool.cpp | 55 +++++++++++++++++++ .../AirSim/Source/Recording/RecordingFile.cpp | 2 +- .../Plugins/AirSim/Source/RenderRequest.cpp | 9 ++- Unreal/Plugins/AirSim/Source/RenderRequest.h | 2 +- .../AirSim/Source/UnrealImageCapture.cpp | 14 +++-- .../AirSim/Source/UnrealImageCapture.h | 4 ++ Unreal/Plugins/AirSim/Source/WorldSimApi.cpp | 1 - 14 files changed, 142 insertions(+), 29 deletions(-) create mode 100644 AirLib/include/common/common_utils/BufferPool.h create mode 100644 AirLib/src/common/common_utils/BufferPool.cpp diff --git a/AirLib/include/api/RpcLibAdapatorsBase.hpp b/AirLib/include/api/RpcLibAdapatorsBase.hpp index ca860d121a..1416a848bd 100644 --- a/AirLib/include/api/RpcLibAdapatorsBase.hpp +++ b/AirLib/include/api/RpcLibAdapatorsBase.hpp @@ -377,7 +377,7 @@ class RpcLibAdapatorsBase { return request; } }; - + /* struct ImageResponse { std::vector image_data_uint8; std::vector image_data_float; @@ -464,7 +464,7 @@ class RpcLibAdapatorsBase { return response_adapter; } - }; + };*/ struct LidarData { diff --git a/AirLib/include/api/RpcLibClientBase.hpp b/AirLib/include/api/RpcLibClientBase.hpp index 54c30d671a..1ae78335e0 100644 --- a/AirLib/include/api/RpcLibClientBase.hpp +++ b/AirLib/include/api/RpcLibClientBase.hpp @@ -51,7 +51,7 @@ class RpcLibClientBase { vector simListSceneObjects(const string& name_regex = string(".*")) const; Pose simGetObjectPose(const std::string& object_name) const; bool simSetObjectPose(const std::string& object_name, const Pose& pose, bool teleport = true); - + //task management APIs void cancelLastTask(const std::string& vehicle_name = ""); virtual RpcLibClientBase* waitOnLastTask(bool* task_result = nullptr, float timeout_sec = Utils::nan()); diff --git a/AirLib/include/api/VehicleSimApiBase.hpp b/AirLib/include/api/VehicleSimApiBase.hpp index c913c2eac5..962f9c215c 100644 --- a/AirLib/include/api/VehicleSimApiBase.hpp +++ b/AirLib/include/api/VehicleSimApiBase.hpp @@ -45,8 +45,8 @@ class VehicleSimApiBase : public msr::airlib::UpdatableObject { virtual void initialize() = 0; - virtual std::vector getImages(const std::vector& request) const = 0; - virtual std::vector getImage(const std::string& camera_name, ImageCaptureBase::ImageType image_type) const = 0; + virtual void getImages(const std::vector& request, std::vector &responses) const = 0; + virtual void getImage(const ImageCaptureBase::ImageRequest& request, ImageCaptureBase::ImageResponse &response) const = 0; virtual Pose getPose() const = 0; virtual void setPose(const Pose& pose, bool ignore_collision) = 0; diff --git a/AirLib/include/common/ImageCaptureBase.hpp b/AirLib/include/common/ImageCaptureBase.hpp index 1c16848f02..8be6a78e37 100644 --- a/AirLib/include/common/ImageCaptureBase.hpp +++ b/AirLib/include/common/ImageCaptureBase.hpp @@ -4,8 +4,10 @@ #ifndef air_ImageCaptureBase_hpp #define air_ImageCaptureBase_hpp +#pragma once #include "common/Common.hpp" #include "common/common_utils/EnumFlags.hpp" +#include namespace msr { namespace airlib { @@ -44,7 +46,7 @@ class ImageCaptureBase }; struct ImageResponse { - vector image_data_uint8; + std::unique_ptr, std::function*)>> image_data_uint8 = nullptr; vector image_data_float; std::string camera_name; @@ -60,6 +62,7 @@ class ImageCaptureBase public: //methods virtual void getImages(const std::vector& requests, std::vector& responses) const = 0; + virtual void getImage(const ImageRequest& request, ImageResponse& response) const = 0; }; diff --git a/AirLib/include/common/common_utils/BufferPool.h b/AirLib/include/common/common_utils/BufferPool.h new file mode 100644 index 0000000000..bb79912ac0 --- /dev/null +++ b/AirLib/include/common/common_utils/BufferPool.h @@ -0,0 +1,36 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +#pragma once +#include +#include +#include +#include +#include + +typedef std::vector Buffer; +typedef std::function Deleter; +typedef std::unique_ptr BufferPtr; + +class BufferPool +{ +public: + BufferPtr GetBufferExactSize(size_t size); + BufferPtr GetBufferAtLeastSize(size_t size, size_t max_size = _CRT_SIZE_MAX); + +private: + class BufferCollection + { + public: + BufferCollection(size_t size) : Size(size) {} + BufferPtr DemandBuffer(); + BufferPtr GetBufferIfAvailable(); + + private: + size_t Size; + std::unordered_set AvailableBuffers; + BufferPtr MakeBufferPtr(Buffer *underlyingBuffer = nullptr); + void ReturnToCollection(Buffer *buffer); + }; + std::map CollectionsBySize; +}; \ No newline at end of file diff --git a/AirLib/src/api/RpcLibClientBase.cpp b/AirLib/src/api/RpcLibClientBase.cpp index a7b8dba397..9237cbf101 100644 --- a/AirLib/src/api/RpcLibClientBase.cpp +++ b/AirLib/src/api/RpcLibClientBase.cpp @@ -219,14 +219,15 @@ void RpcLibClientBase::simSetVehiclePose(const Pose& pose, bool ignore_collision pimpl_->client.call("simSetVehiclePose", RpcLibAdapatorsBase::Pose(pose), ignore_collision, vehicle_name); } -vector RpcLibClientBase::simGetImages(vector request, const std::string& vehicle_name) +/*vector RpcLibClientBase::simGetImages(vector request, const std::string& vehicle_name) { const auto& response_adaptor = pimpl_->client.call("simGetImages", RpcLibAdapatorsBase::ImageRequest::from(request), vehicle_name) .as>(); return RpcLibAdapatorsBase::ImageResponse::to(response_adaptor); -} +}*/ + vector RpcLibClientBase::simGetImage(const std::string& camera_name, ImageCaptureBase::ImageType type, const std::string& vehicle_name) { vector result = pimpl_->client.call("simGetImage", camera_name, type, vehicle_name).as>(); diff --git a/AirLib/src/api/RpcLibServerBase.cpp b/AirLib/src/api/RpcLibServerBase.cpp index ffa06f197d..bdd99d85d2 100644 --- a/AirLib/src/api/RpcLibServerBase.cpp +++ b/AirLib/src/api/RpcLibServerBase.cpp @@ -123,18 +123,24 @@ RpcLibServerBase::RpcLibServerBase(ApiProvider* api_provider, const std::string& return getVehicleApi(vehicle_name)->armDisarm(arm); }); - pimpl_->server.bind("simGetImages", [&](const std::vector& request_adapter, const std::string& vehicle_name) -> - vector { - const auto& response = getVehicleSimApi(vehicle_name)->getImages(RpcLibAdapatorsBase::ImageRequest::to(request_adapter)); - return RpcLibAdapatorsBase::ImageResponse::from(response); - }); + /*pimpl_->server.bind("simGetImages", [&](const std::vector& request_adapter, const std::string& vehicle_name) -> vector { + vector responses; + getVehicleSimApi(vehicle_name)->getImages(RpcLibAdapatorsBase::ImageRequest::to(request_adapter), responses); + return RpcLibAdapatorsBase::ImageResponse::from(response); + });*/ + pimpl_->server.bind("simGetImage", [&](const std::string& camera_name, ImageCaptureBase::ImageType type, const std::string& vehicle_name) -> vector { - auto result = getVehicleSimApi(vehicle_name)->getImage(camera_name, type); - if (result.size() == 0) { - // rpclib has a bug with serializing empty vectors, so we return a 1 byte vector instead. - result.push_back(0); - } - return result; + + ImageCaptureBase::ImageRequest request(camera_name, type); + ImageCaptureBase::ImageResponse response; + + getVehicleSimApi(vehicle_name)->getImage(request, response); + + // rpclib has a bug with serializing empty vectors, so we return a 1 byte vector instead. + if (response.image_data_uint8->size() == 0) + response.image_data_uint8->push_back(0); + + return *response.image_data_uint8; }); pimpl_->server. diff --git a/AirLib/src/common/common_utils/BufferPool.cpp b/AirLib/src/common/common_utils/BufferPool.cpp new file mode 100644 index 0000000000..fb8e1a89d2 --- /dev/null +++ b/AirLib/src/common/common_utils/BufferPool.cpp @@ -0,0 +1,55 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +#include "common/common_utils/BufferPool.h" + +BufferPtr BufferPool::GetBufferExactSize(size_t size) +{ + if (CollectionsBySize.count(size) == 0) + CollectionsBySize.insert(std::pair(size, BufferCollection(size))); + + return CollectionsBySize.at(size).DemandBuffer(); +} + +BufferPtr BufferPool::GetBufferAtLeastSize(size_t size, size_t max_size) +{ + BufferPtr buffer = nullptr; + auto closestOffering = CollectionsBySize.lower_bound(size); + if (closestOffering != CollectionsBySize.end() && closestOffering->first < max_size) + buffer = closestOffering->second.GetBufferIfAvailable(); + + if (buffer != nullptr) + return buffer; + return GetBufferExactSize(size); +} + +BufferPtr BufferPool::BufferCollection::DemandBuffer() +{ + BufferPtr buf = GetBufferIfAvailable(); + if (buf != nullptr) + return buf; + return MakeBufferPtr(); +} + +BufferPtr BufferPool::BufferCollection::GetBufferIfAvailable() +{ + if (AvailableBuffers.size() == 0) + return nullptr; + + Buffer *buffer = *AvailableBuffers.begin(); + AvailableBuffers.erase(buffer); + return MakeBufferPtr(buffer); +} + +BufferPtr BufferPool::BufferCollection::MakeBufferPtr(Buffer *underlyingBuffer) +{ + if (underlyingBuffer == nullptr) + return std::unique_ptr(new Buffer(Size), std::bind(&BufferPool::BufferCollection::ReturnToCollection, this, std::placeholders::_1)); + else + return std::unique_ptr(underlyingBuffer, std::bind(&BufferPool::BufferCollection::ReturnToCollection, this, std::placeholders::_1)); +} + +void BufferPool::BufferCollection::ReturnToCollection(Buffer *buffer) +{ + AvailableBuffers.insert(buffer); +} \ No newline at end of file diff --git a/Unreal/Plugins/AirSim/Source/Recording/RecordingFile.cpp b/Unreal/Plugins/AirSim/Source/Recording/RecordingFile.cpp index c9d3d61f91..774e0049af 100644 --- a/Unreal/Plugins/AirSim/Source/Recording/RecordingFile.cpp +++ b/Unreal/Plugins/AirSim/Source/Recording/RecordingFile.cpp @@ -34,7 +34,7 @@ void RecordingFile::appendRecord(const std::vector(response.image_data_uint8.data()), response.image_data_uint8.size()); + file.write(reinterpret_cast(response.image_data_uint8->data()), response.image_data_uint8->size()); file.close(); } diff --git a/Unreal/Plugins/AirSim/Source/RenderRequest.cpp b/Unreal/Plugins/AirSim/Source/RenderRequest.cpp index fc25505235..b835b18d05 100644 --- a/Unreal/Plugins/AirSim/Source/RenderRequest.cpp +++ b/Unreal/Plugins/AirSim/Source/RenderRequest.cpp @@ -9,7 +9,7 @@ #include "AirBlueprintLib.h" #include "Async/Async.h" -RenderRequest::RenderRequest(std::vector& rgb_output) : rgba_output_(&rgb_output) +RenderRequest::RenderRequest(std::vector& rgba_output) : rgba_output_(&rgba_output) {} RenderRequest::~RenderRequest() @@ -44,10 +44,13 @@ void RenderRequest::RenderThreadScreenshotTask() uint32 height = fast_cap_texture->GetSizeY(); uint32 stride; auto *src = (const unsigned char*)RHILockTexture2D(fast_cap_texture, 0, RLM_ReadOnly, stride, false); // needs to be on render thread + //fast_result_->image_data_uint8.Reset(fast_result_->image_data_uint8.Num()); + //fast_result_->image_data_uint8.Append(src, height * stride); + //void *dest = static_cast(fast_result_->image_data_uint8.GetData()); if (src) - rgba_output_->insert(rgba_output_->begin(), &src[0], &src[height * stride]); - + //rgba_output_->insert(rgba_output_->begin(), &src[0], &src[height * stride]); + FMemory::BigBlockMemcpy(rgba_output_->data(), src, height * stride); //TODO MAYBE THIS IS THE SLOW PART RHIUnlockTexture2D(fast_cap_texture, 0, false); fast_cap_done_ = true; } diff --git a/Unreal/Plugins/AirSim/Source/RenderRequest.h b/Unreal/Plugins/AirSim/Source/RenderRequest.h index 2bd22b604d..49ad5de829 100644 --- a/Unreal/Plugins/AirSim/Source/RenderRequest.h +++ b/Unreal/Plugins/AirSim/Source/RenderRequest.h @@ -50,7 +50,7 @@ class RenderRequest : public FRenderCommand std::function query_camera_pose_cb_; public: - RenderRequest(std::vector& rgb_output); + RenderRequest(std::vector &rgba_output); ~RenderRequest(); FORCEINLINE TStatId GetStatId() const diff --git a/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp b/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp index 57706bad28..fcadae29ce 100644 --- a/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp +++ b/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp @@ -1,7 +1,6 @@ #include "UnrealImageCapture.h" #include "Engine/World.h" #include "ImageUtils.h" - #include "RenderRequest.h" #include "common/ClockFactory.hpp" @@ -34,14 +33,21 @@ void UnrealImageCapture::getSceneCaptureImage(const std::string& camera_name, ms USceneCaptureComponent2D* capture = camera->getCaptureComponent(image_type, false); UTextureRenderTarget2D* textureTarget = capture->TextureTarget; - RenderRequest render_request(response.image_data_uint8); + int height = capture->TextureTarget->SizeY; + int width = capture->TextureTarget->SizeX; + unsigned long log2; + _BitScanReverse(&log2, width - 1); + unsigned long long stride = 1ULL << (log2 + 1); //Round up to nearest power of 2. + response.image_data_uint8 = std::move(BufferPool_->GetBufferExactSize(height * stride * 4)); //TODO get resolution, figure out stride, figure out buffer size + //TODO check not nullptr + RenderRequest render_request(*response.image_data_uint8); render_request.fast_param_ = RenderRequest::RenderParams{ capture, textureTarget, false, false }; //render_params.at(0).get(); render_request.FastScreenshot(); //response.time_stamp = result->time_stamp; //response.image_data_uint8 = std::vector(result->image_data_uint8.GetData(), result->image_data_uint8.GetData() + result->image_data_uint8.Num()); - //response.width = result->width; - //response.height = result->height; + response.width = width; + response.height = height; response.image_type = image_type; } diff --git a/Unreal/Plugins/AirSim/Source/UnrealImageCapture.h b/Unreal/Plugins/AirSim/Source/UnrealImageCapture.h index bb1b5c61c7..e41747cdec 100644 --- a/Unreal/Plugins/AirSim/Source/UnrealImageCapture.h +++ b/Unreal/Plugins/AirSim/Source/UnrealImageCapture.h @@ -4,6 +4,8 @@ #include "PIPCamera.h" #include "common/ImageCaptureBase.hpp" #include "common/common_utils/UniqueValueMap.hpp" +#include "common/common_utils/BufferPool.h" + class UnrealImageCapture : public msr::airlib::ImageCaptureBase @@ -18,6 +20,8 @@ class UnrealImageCapture : public msr::airlib::ImageCaptureBase virtual void getImage(const ImageRequest& request, ImageResponse& response) const override; private: + BufferPool *BufferPool_ = new BufferPool(); + void getSceneCaptureImage(const std::string& camera_name, ImageCaptureBase::ImageType image_type, ImageResponse &response) const; void addScreenCaptureHandler(UWorld *world); diff --git a/Unreal/Plugins/AirSim/Source/WorldSimApi.cpp b/Unreal/Plugins/AirSim/Source/WorldSimApi.cpp index 5120219f46..a0868ebfe7 100644 --- a/Unreal/Plugins/AirSim/Source/WorldSimApi.cpp +++ b/Unreal/Plugins/AirSim/Source/WorldSimApi.cpp @@ -1,6 +1,5 @@ #include "WorldSimApi.h" #include "AirBlueprintLib.h" -#include "TextureShuffleActor.h" #include "common/common_utils/Utils.hpp" #include "Weather/WeatherLib.h" From 33e73f809d9456ec073e4fa7401e30b64db72e75 Mon Sep 17 00:00:00 2001 From: Nicholas Gyde Date: Tue, 17 Mar 2020 17:38:05 -0700 Subject: [PATCH 07/29] Closer to fixing build issues --- AirLib/include/api/RpcLibAdapatorsBase.hpp | 176 +++++++++--------- AirLib/src/api/RpcLibClientBase.cpp | 4 +- AirLib/src/api/RpcLibServerBase.cpp | 10 +- Examples/DataCollection/DataCollectorSGM.h | 4 +- .../DataCollection/StereoImageGenerator.hpp | 6 +- Examples/DepthNav/DepthNav.hpp | 150 +++++++-------- HelloCar/main.cpp | 4 +- HelloDrone/main.cpp | 4 +- .../Plugins/AirSim/Source/RenderRequest.cpp | 6 +- .../AirSim/Source/UnrealImageCapture.cpp | 2 +- 10 files changed, 183 insertions(+), 183 deletions(-) diff --git a/AirLib/include/api/RpcLibAdapatorsBase.hpp b/AirLib/include/api/RpcLibAdapatorsBase.hpp index 1416a848bd..0cf0db60e2 100644 --- a/AirLib/include/api/RpcLibAdapatorsBase.hpp +++ b/AirLib/include/api/RpcLibAdapatorsBase.hpp @@ -377,94 +377,94 @@ class RpcLibAdapatorsBase { return request; } }; - /* - struct ImageResponse { - std::vector image_data_uint8; - std::vector image_data_float; - - std::string camera_name; - Vector3r camera_position; - Quaternionr camera_orientation; - msr::airlib::TTimePoint time_stamp; - std::string message; - bool pixels_as_float; - bool compress; - int width, height; - msr::airlib::ImageCaptureBase::ImageType image_type; - - MSGPACK_DEFINE_MAP(image_data_uint8, image_data_float, camera_position, camera_name, - camera_orientation, time_stamp, message, pixels_as_float, compress, width, height, image_type); - - ImageResponse() - {} - - ImageResponse(const msr::airlib::ImageCaptureBase::ImageResponse& s) - { - pixels_as_float = s.pixels_as_float; - - image_data_uint8 = s.image_data_uint8; - image_data_float = s.image_data_float; - - //TODO: remove bug workaround for https://github.com/rpclib/rpclib/issues/152 - if (image_data_uint8.size() == 0) - image_data_uint8.push_back(0); - if (image_data_float.size() == 0) - image_data_float.push_back(0); - - camera_name = s.camera_name; - camera_position = Vector3r(s.camera_position); - camera_orientation = Quaternionr(s.camera_orientation); - time_stamp = s.time_stamp; - message = s.message; - compress = s.compress; - width = s.width; - height = s.height; - image_type = s.image_type; - } - - msr::airlib::ImageCaptureBase::ImageResponse to() const - { - msr::airlib::ImageCaptureBase::ImageResponse d; - - d.pixels_as_float = pixels_as_float; - - if (! pixels_as_float) - d.image_data_uint8 = image_data_uint8; - else - d.image_data_float = image_data_float; - - d.camera_name = camera_name; - d.camera_position = camera_position.to(); - d.camera_orientation = camera_orientation.to(); - d.time_stamp = time_stamp; - d.message = message; - d.compress = compress; - d.width = width; - d.height = height; - d.image_type = image_type; - - return d; - } - - static std::vector to( - const std::vector& response_adapter - ) { - std::vector response; - for (const auto& item : response_adapter) - response.push_back(item.to()); - - return response; - } - static std::vector from( - const std::vector& response - ) { - std::vector response_adapter; - for (const auto& item : response) - response_adapter.push_back(ImageResponse(item)); - - return response_adapter; - } - };*/ + + struct ImageResponse { + std::vector image_data_uint8; + std::vector image_data_float; + + std::string camera_name; + Vector3r camera_position; + Quaternionr camera_orientation; + msr::airlib::TTimePoint time_stamp; + std::string message; + bool pixels_as_float; + bool compress; + int width, height; + msr::airlib::ImageCaptureBase::ImageType image_type; + + MSGPACK_DEFINE_MAP(image_data_uint8, image_data_float, camera_position, camera_name, + camera_orientation, time_stamp, message, pixels_as_float, compress, width, height, image_type); + + ImageResponse() + {} + + ImageResponse(const msr::airlib::ImageCaptureBase::ImageResponse& s) + { + pixels_as_float = s.pixels_as_float; + + image_data_uint8.insert(image_data_uint8.begin(), s.image_data_uint8->front(), s.image_data_uint8->back()); + image_data_float = s.image_data_float; + + //TODO: remove bug workaround for https://github.com/rpclib/rpclib/issues/152 + if (image_data_uint8.size() == 0) + image_data_uint8.push_back(0); + if (image_data_float.size() == 0) + image_data_float.push_back(0); + + camera_name = s.camera_name; + camera_position = Vector3r(s.camera_position); + camera_orientation = Quaternionr(s.camera_orientation); + time_stamp = s.time_stamp; + message = s.message; + compress = s.compress; + width = s.width; + height = s.height; + image_type = s.image_type; + } + + msr::airlib::ImageCaptureBase::ImageResponse to() const + { + msr::airlib::ImageCaptureBase::ImageResponse d; + + d.pixels_as_float = pixels_as_float; + + if (!pixels_as_float) + d.image_data_uint8->insert(d.image_data_uint8->begin(), image_data_uint8.front(), image_data_uint8.back()); + else + d.image_data_float = image_data_float; + + d.camera_name = camera_name; + d.camera_position = camera_position.to(); + d.camera_orientation = camera_orientation.to(); + d.time_stamp = time_stamp; + d.message = message; + d.compress = compress; + d.width = width; + d.height = height; + d.image_type = image_type; + + return d; + } + + static std::vector to( + const std::vector& response_adapter + ) { + std::vector response; + for (const auto& item : response_adapter) + response.push_back(item.to()); + + return response; + } + static std::vector from( + const std::vector& response + ) { + std::vector response_adapter; + for (const auto& item : response) + response_adapter.push_back(ImageResponse(item)); + + return response_adapter; + } + }; struct LidarData { diff --git a/AirLib/src/api/RpcLibClientBase.cpp b/AirLib/src/api/RpcLibClientBase.cpp index 9237cbf101..8ec73fb9b4 100644 --- a/AirLib/src/api/RpcLibClientBase.cpp +++ b/AirLib/src/api/RpcLibClientBase.cpp @@ -219,14 +219,14 @@ void RpcLibClientBase::simSetVehiclePose(const Pose& pose, bool ignore_collision pimpl_->client.call("simSetVehiclePose", RpcLibAdapatorsBase::Pose(pose), ignore_collision, vehicle_name); } -/*vector RpcLibClientBase::simGetImages(vector request, const std::string& vehicle_name) +vector RpcLibClientBase::simGetImages(vector request, const std::string& vehicle_name) { const auto& response_adaptor = pimpl_->client.call("simGetImages", RpcLibAdapatorsBase::ImageRequest::from(request), vehicle_name) .as>(); return RpcLibAdapatorsBase::ImageResponse::to(response_adaptor); -}*/ +} vector RpcLibClientBase::simGetImage(const std::string& camera_name, ImageCaptureBase::ImageType type, const std::string& vehicle_name) { diff --git a/AirLib/src/api/RpcLibServerBase.cpp b/AirLib/src/api/RpcLibServerBase.cpp index bdd99d85d2..230fbf22ed 100644 --- a/AirLib/src/api/RpcLibServerBase.cpp +++ b/AirLib/src/api/RpcLibServerBase.cpp @@ -123,11 +123,11 @@ RpcLibServerBase::RpcLibServerBase(ApiProvider* api_provider, const std::string& return getVehicleApi(vehicle_name)->armDisarm(arm); }); - /*pimpl_->server.bind("simGetImages", [&](const std::vector& request_adapter, const std::string& vehicle_name) -> vector { - vector responses; - getVehicleSimApi(vehicle_name)->getImages(RpcLibAdapatorsBase::ImageRequest::to(request_adapter), responses); - return RpcLibAdapatorsBase::ImageResponse::from(response); - });*/ + pimpl_->server.bind("simGetImages", [&](const std::vector& request_adapter, const std::string& vehicle_name) -> vector { + std::vector responses; + getVehicleSimApi(vehicle_name)->getImages(RpcLibAdapatorsBase::ImageRequest::to(request_adapter), responses); + return RpcLibAdapatorsBase::ImageResponse::from(responses); + }); pimpl_->server.bind("simGetImage", [&](const std::string& camera_name, ImageCaptureBase::ImageType type, const std::string& vehicle_name) -> vector { diff --git a/Examples/DataCollection/DataCollectorSGM.h b/Examples/DataCollection/DataCollectorSGM.h index b5e228db67..5087f5ae52 100644 --- a/Examples/DataCollection/DataCollectorSGM.h +++ b/Examples/DataCollection/DataCollectorSGM.h @@ -204,8 +204,8 @@ class DataCollectorSGM { counter++; continue; } - left_img[idx-counter] = result->response.at(0).image_data_uint8 [idx]; - right_img[idx-counter] = result->response.at(1).image_data_uint8 [idx]; + //left_img[idx-counter] = result->response.at(0).image_data_uint8 [idx]; + //right_img[idx-counter] = result->response.at(1).image_data_uint8 [idx]; } //Get SGM disparity and confidence diff --git a/Examples/DataCollection/StereoImageGenerator.hpp b/Examples/DataCollection/StereoImageGenerator.hpp index 414ad70f0b..5a5a43c7e5 100644 --- a/Examples/DataCollection/StereoImageGenerator.hpp +++ b/Examples/DataCollection/StereoImageGenerator.hpp @@ -144,9 +144,9 @@ class StereoImageGenerator { static void processImages(common_utils::ProsumerQueue* results) { while (!results->getIsDone()) { - msr::airlib::ClockBase* clock = msr::airlib::ClockFactory::get(); + //msr::airlib::ClockBase* clock = msr::airlib::ClockFactory::get(); - ImagesResult result; + /*ImagesResult result; if (!results->tryPop(result)) { clock->sleep_for(1); continue; @@ -184,7 +184,7 @@ class StereoImageGenerator { << " ori:" << VectorMath::toString(result.orientation) << " render time " << result.render_time * 1E3f << "ms" << " process time " << clock->elapsedSince(process_time) * 1E3f << " ms" - << std::endl; + << std::endl;*/ } } diff --git a/Examples/DepthNav/DepthNav.hpp b/Examples/DepthNav/DepthNav.hpp index 3733e13abf..871497b333 100644 --- a/Examples/DepthNav/DepthNav.hpp +++ b/Examples/DepthNav/DepthNav.hpp @@ -143,82 +143,82 @@ class DepthNav { std::vector sgm_depth_image(params_.depth_height*params_.depth_width); - do { - const Pose current_pose = client.simGetVehiclePose(); - - const std::vector& response = client.simGetImages(request); - - if (response.size() == 0) - throw std::length_error("No images received!"); - /* - if (response.at(0).height != params_.depth_height || response.at(0).width != params_.depth_height) - throw DepthNavException("Image Dimension mismatch. Please check left camera in the AirSim config file."); - - if (response.at(1).height != params_.depth_height || response.at(1).width != params_.depth_height) - throw DepthNavException("Image Dimension mismatch. Please check right camera in the AirSim config file."); - */ - const std::vector& left_image = response.at(0).image_data_uint8; - const std::vector& right_image = response.at(1).image_data_uint8; - - //baseline * focal_length = depth * disparity - float f = params_.depth_width / (2 * tan(params_.fov/2)); - float B = 0.25; + //do { + // const Pose current_pose = client.simGetVehiclePose(); + + // const std::vector& response = client.simGetImages(request); + + // if (response.size() == 0) + // throw std::length_error("No images received!"); + // /* + // if (response.at(0).height != params_.depth_height || response.at(0).width != params_.depth_height) + // throw DepthNavException("Image Dimension mismatch. Please check left camera in the AirSim config file."); + + // if (response.at(1).height != params_.depth_height || response.at(1).width != params_.depth_height) + // throw DepthNavException("Image Dimension mismatch. Please check right camera in the AirSim config file."); + // */ + // const std::vector& left_image = response.at(0).image_data_uint8; + // const std::vector& right_image = response.at(1).image_data_uint8; + + // //baseline * focal_length = depth * disparity + // float f = params_.depth_width / (2 * tan(params_.fov/2)); + // float B = 0.25; - p_state->ProcessFrameAirSim(counter, dtime, left_image, right_image); - - for (unsigned int idx = 0; idx < (params_.depth_height*params_.depth_width); idx++) - { - float d = p_state->dispMap[idx]; - if (d < FLT_MAX) - { - //float dn = (d - dmin)/drange; - sgm_depth_image[idx] = -(B*f/d); - - } - } - - counter++; - - const Pose next_pose = getNextPose(sgm_depth_image, goal_pose.position, - current_pose, params_.control_loop_period); - - if (VectorMath::hasNan(next_pose)) - throw DepthNavException("No further path can be found."); - else { - client.simSetVehiclePose(next_pose, true); - /* - //convert pose to velocity commands - //obey max linear speed constraint - Vector3r linear_vel = (next_pose.position - current_pose.position) / params_.control_loop_period; - if (linear_vel.norm() > params_.max_linear_speed) { - linear_vel = linear_vel.normalized() * params_.max_linear_speed; - } - - //obey max angular speed constraint - Quaternionr to_orientation = next_pose.orientation; - Vector3r angular_vel = VectorMath::toAngularVelocity(current_pose.orientation, - next_pose.orientation, params_.control_loop_period); - real_T angular_vel_norm = angular_vel.norm(); - if (angular_vel_norm > params_.max_angular_speed) { - real_T slerp_alpha = params_.max_angular_speed / angular_vel_norm; - to_orientation = VectorMath::slerp(current_pose.orientation, to_orientation, slerp_alpha); - } - - //Now we can use (linear_vel, to_orientation) for vehicle commands - - //For ComputerVision mode, we will just create new pose - Pose contrained_next_pose(current_pose.position + linear_vel * params_.control_loop_period, - to_orientation); - client.simSetVehiclePose(contrained_next_pose, true); - */ - } - - real_T dist2goal = getDistanceToGoal(next_pose.position, goal_pose.position); - if (dist2goal <= params_.min_exit_dist_from_goal) - return; - Utils::log(Utils::stringf("Distance to target: %f", dist2goal)); - - } while (true); + // p_state->ProcessFrameAirSim(counter, dtime, left_image, right_image); + // + // for (unsigned int idx = 0; idx < (params_.depth_height*params_.depth_width); idx++) + // { + // float d = p_state->dispMap[idx]; + // if (d < FLT_MAX) + // { + // //float dn = (d - dmin)/drange; + // sgm_depth_image[idx] = -(B*f/d); + + // } + // } + + // counter++; + + // const Pose next_pose = getNextPose(sgm_depth_image, goal_pose.position, + // current_pose, params_.control_loop_period); + + // if (VectorMath::hasNan(next_pose)) + // throw DepthNavException("No further path can be found."); + // else { + // client.simSetVehiclePose(next_pose, true); + // /* + // //convert pose to velocity commands + // //obey max linear speed constraint + // Vector3r linear_vel = (next_pose.position - current_pose.position) / params_.control_loop_period; + // if (linear_vel.norm() > params_.max_linear_speed) { + // linear_vel = linear_vel.normalized() * params_.max_linear_speed; + // } + + // //obey max angular speed constraint + // Quaternionr to_orientation = next_pose.orientation; + // Vector3r angular_vel = VectorMath::toAngularVelocity(current_pose.orientation, + // next_pose.orientation, params_.control_loop_period); + // real_T angular_vel_norm = angular_vel.norm(); + // if (angular_vel_norm > params_.max_angular_speed) { + // real_T slerp_alpha = params_.max_angular_speed / angular_vel_norm; + // to_orientation = VectorMath::slerp(current_pose.orientation, to_orientation, slerp_alpha); + // } + + // //Now we can use (linear_vel, to_orientation) for vehicle commands + // + // //For ComputerVision mode, we will just create new pose + // Pose contrained_next_pose(current_pose.position + linear_vel * params_.control_loop_period, + // to_orientation); + // client.simSetVehiclePose(contrained_next_pose, true); + // */ + // } + + // real_T dist2goal = getDistanceToGoal(next_pose.position, goal_pose.position); + // if (dist2goal <= params_.min_exit_dist_from_goal) + // return; + // Utils::log(Utils::stringf("Distance to target: %f", dist2goal)); + + //} while (true); } protected: diff --git a/HelloCar/main.cpp b/HelloCar/main.cpp index 31cfea6775..bfdf5031c8 100644 --- a/HelloCar/main.cpp +++ b/HelloCar/main.cpp @@ -44,7 +44,7 @@ int main() std::getline(std::cin, path); for (const ImageResponse& image_info : response) { - std::cout << "Image uint8 size: " << image_info.image_data_uint8.size() << std::endl; + std::cout << "Image uint8 size: " << image_info.image_data_uint8->size() << std::endl; std::cout << "Image float size: " << image_info.image_data_float.size() << std::endl; if (path != "") { @@ -55,7 +55,7 @@ int main() } else { std::ofstream file(file_path + ".png", std::ios::binary); - file.write(reinterpret_cast(image_info.image_data_uint8.data()), image_info.image_data_uint8.size()); + file.write(reinterpret_cast(image_info.image_data_uint8->data()), image_info.image_data_uint8->size()); file.close(); } } diff --git a/HelloDrone/main.cpp b/HelloDrone/main.cpp index 936ec77855..6cbfa811f0 100644 --- a/HelloDrone/main.cpp +++ b/HelloDrone/main.cpp @@ -38,7 +38,7 @@ int main() std::getline(std::cin, path); for (const ImageResponse& image_info : response) { - std::cout << "Image uint8 size: " << image_info.image_data_uint8.size() << std::endl; + std::cout << "Image uint8 size: " << image_info.image_data_uint8->size() << std::endl; std::cout << "Image float size: " << image_info.image_data_float.size() << std::endl; if (path != "") { @@ -49,7 +49,7 @@ int main() } else { std::ofstream file(file_path + ".png", std::ios::binary); - file.write(reinterpret_cast(image_info.image_data_uint8.data()), image_info.image_data_uint8.size()); + file.write(reinterpret_cast(image_info.image_data_uint8->data()), image_info.image_data_uint8->size()); file.close(); } } diff --git a/Unreal/Plugins/AirSim/Source/RenderRequest.cpp b/Unreal/Plugins/AirSim/Source/RenderRequest.cpp index b835b18d05..9973ddf304 100644 --- a/Unreal/Plugins/AirSim/Source/RenderRequest.cpp +++ b/Unreal/Plugins/AirSim/Source/RenderRequest.cpp @@ -44,9 +44,9 @@ void RenderRequest::RenderThreadScreenshotTask() uint32 height = fast_cap_texture->GetSizeY(); uint32 stride; auto *src = (const unsigned char*)RHILockTexture2D(fast_cap_texture, 0, RLM_ReadOnly, stride, false); // needs to be on render thread - //fast_result_->image_data_uint8.Reset(fast_result_->image_data_uint8.Num()); - //fast_result_->image_data_uint8.Append(src, height * stride); - //void *dest = static_cast(fast_result_->image_data_uint8.GetData()); + //fast_result_->image_data_uint8->Reset(fast_result_->image_data_uint8->Num()); + //fast_result_->image_data_uint8->Append(src, height * stride); + //void *dest = static_cast(fast_result_->image_data_uint8->GetData()); if (src) //rgba_output_->insert(rgba_output_->begin(), &src[0], &src[height * stride]); diff --git a/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp b/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp index fcadae29ce..b450b6721d 100644 --- a/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp +++ b/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp @@ -45,7 +45,7 @@ void UnrealImageCapture::getSceneCaptureImage(const std::string& camera_name, ms render_request.FastScreenshot(); //response.time_stamp = result->time_stamp; - //response.image_data_uint8 = std::vector(result->image_data_uint8.GetData(), result->image_data_uint8.GetData() + result->image_data_uint8.Num()); + //response.image_data_uint8 = std::vector(result->image_data_uint8->GetData(), result->image_data_uint8->GetData() + result->image_data_uint8->Num()); response.width = width; response.height = height; response.image_type = image_type; From 82dbb3eaabfa8d7afd87df046ee8f378b65b3742 Mon Sep 17 00:00:00 2001 From: Nicholas Gyde Date: Thu, 19 Mar 2020 11:39:09 -0700 Subject: [PATCH 08/29] Reinstate commented out DepthNav code --- Examples/DepthNav/DepthNav.hpp | 150 ++++++++++++++++----------------- 1 file changed, 75 insertions(+), 75 deletions(-) diff --git a/Examples/DepthNav/DepthNav.hpp b/Examples/DepthNav/DepthNav.hpp index 871497b333..fee4414e88 100644 --- a/Examples/DepthNav/DepthNav.hpp +++ b/Examples/DepthNav/DepthNav.hpp @@ -143,82 +143,82 @@ class DepthNav { std::vector sgm_depth_image(params_.depth_height*params_.depth_width); - //do { - // const Pose current_pose = client.simGetVehiclePose(); - - // const std::vector& response = client.simGetImages(request); - - // if (response.size() == 0) - // throw std::length_error("No images received!"); - // /* - // if (response.at(0).height != params_.depth_height || response.at(0).width != params_.depth_height) - // throw DepthNavException("Image Dimension mismatch. Please check left camera in the AirSim config file."); - - // if (response.at(1).height != params_.depth_height || response.at(1).width != params_.depth_height) - // throw DepthNavException("Image Dimension mismatch. Please check right camera in the AirSim config file."); - // */ - // const std::vector& left_image = response.at(0).image_data_uint8; - // const std::vector& right_image = response.at(1).image_data_uint8; - - // //baseline * focal_length = depth * disparity - // float f = params_.depth_width / (2 * tan(params_.fov/2)); - // float B = 0.25; + do { + const Pose current_pose = client.simGetVehiclePose(); + + const std::vector& response = client.simGetImages(request); + + if (response.size() == 0) + throw std::length_error("No images received!"); + /* + if (response.at(0).height != params_.depth_height || response.at(0).width != params_.depth_height) + throw DepthNavException("Image Dimension mismatch. Please check left camera in the AirSim config file."); + + if (response.at(1).height != params_.depth_height || response.at(1).width != params_.depth_height) + throw DepthNavException("Image Dimension mismatch. Please check right camera in the AirSim config file."); + */ + const std::vector left_image(response.at(0).image_data_uint8->begin(), response.at(0).image_data_uint8->end()); + const std::vector right_image(response.at(1).image_data_uint8->begin(), response.at(1).image_data_uint8->end()); + + //baseline * focal_length = depth * disparity + float f = params_.depth_width / (2 * tan(params_.fov/2)); + float B = 0.25; - // p_state->ProcessFrameAirSim(counter, dtime, left_image, right_image); - // - // for (unsigned int idx = 0; idx < (params_.depth_height*params_.depth_width); idx++) - // { - // float d = p_state->dispMap[idx]; - // if (d < FLT_MAX) - // { - // //float dn = (d - dmin)/drange; - // sgm_depth_image[idx] = -(B*f/d); - - // } - // } - - // counter++; - - // const Pose next_pose = getNextPose(sgm_depth_image, goal_pose.position, - // current_pose, params_.control_loop_period); - - // if (VectorMath::hasNan(next_pose)) - // throw DepthNavException("No further path can be found."); - // else { - // client.simSetVehiclePose(next_pose, true); - // /* - // //convert pose to velocity commands - // //obey max linear speed constraint - // Vector3r linear_vel = (next_pose.position - current_pose.position) / params_.control_loop_period; - // if (linear_vel.norm() > params_.max_linear_speed) { - // linear_vel = linear_vel.normalized() * params_.max_linear_speed; - // } - - // //obey max angular speed constraint - // Quaternionr to_orientation = next_pose.orientation; - // Vector3r angular_vel = VectorMath::toAngularVelocity(current_pose.orientation, - // next_pose.orientation, params_.control_loop_period); - // real_T angular_vel_norm = angular_vel.norm(); - // if (angular_vel_norm > params_.max_angular_speed) { - // real_T slerp_alpha = params_.max_angular_speed / angular_vel_norm; - // to_orientation = VectorMath::slerp(current_pose.orientation, to_orientation, slerp_alpha); - // } - - // //Now we can use (linear_vel, to_orientation) for vehicle commands - // - // //For ComputerVision mode, we will just create new pose - // Pose contrained_next_pose(current_pose.position + linear_vel * params_.control_loop_period, - // to_orientation); - // client.simSetVehiclePose(contrained_next_pose, true); - // */ - // } - - // real_T dist2goal = getDistanceToGoal(next_pose.position, goal_pose.position); - // if (dist2goal <= params_.min_exit_dist_from_goal) - // return; - // Utils::log(Utils::stringf("Distance to target: %f", dist2goal)); - - //} while (true); + p_state->ProcessFrameAirSim(counter, dtime, left_image, right_image); + + for (unsigned int idx = 0; idx < (params_.depth_height*params_.depth_width); idx++) + { + float d = p_state->dispMap[idx]; + if (d < FLT_MAX) + { + //float dn = (d - dmin)/drange; + sgm_depth_image[idx] = -(B*f/d); + + } + } + + counter++; + + const Pose next_pose = getNextPose(sgm_depth_image, goal_pose.position, + current_pose, params_.control_loop_period); + + if (VectorMath::hasNan(next_pose)) + throw DepthNavException("No further path can be found."); + else { + client.simSetVehiclePose(next_pose, true); + /* + //convert pose to velocity commands + //obey max linear speed constraint + Vector3r linear_vel = (next_pose.position - current_pose.position) / params_.control_loop_period; + if (linear_vel.norm() > params_.max_linear_speed) { + linear_vel = linear_vel.normalized() * params_.max_linear_speed; + } + + //obey max angular speed constraint + Quaternionr to_orientation = next_pose.orientation; + Vector3r angular_vel = VectorMath::toAngularVelocity(current_pose.orientation, + next_pose.orientation, params_.control_loop_period); + real_T angular_vel_norm = angular_vel.norm(); + if (angular_vel_norm > params_.max_angular_speed) { + real_T slerp_alpha = params_.max_angular_speed / angular_vel_norm; + to_orientation = VectorMath::slerp(current_pose.orientation, to_orientation, slerp_alpha); + } + + //Now we can use (linear_vel, to_orientation) for vehicle commands + + //For ComputerVision mode, we will just create new pose + Pose contrained_next_pose(current_pose.position + linear_vel * params_.control_loop_period, + to_orientation); + client.simSetVehiclePose(contrained_next_pose, true); + */ + } + + real_T dist2goal = getDistanceToGoal(next_pose.position, goal_pose.position); + if (dist2goal <= params_.min_exit_dist_from_goal) + return; + Utils::log(Utils::stringf("Distance to target: %f", dist2goal)); + + } while (true); } protected: From 83a60043a791b2f361d75e83ebef9c9d25c10cc0 Mon Sep 17 00:00:00 2001 From: Nicholas Gyde Date: Thu, 19 Mar 2020 13:41:38 -0700 Subject: [PATCH 09/29] Removed remaining build errors. --- AirLib/include/common/ImageCaptureBase.hpp | 38 ++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/AirLib/include/common/ImageCaptureBase.hpp b/AirLib/include/common/ImageCaptureBase.hpp index 8be6a78e37..c13467e0de 100644 --- a/AirLib/include/common/ImageCaptureBase.hpp +++ b/AirLib/include/common/ImageCaptureBase.hpp @@ -58,6 +58,44 @@ class ImageCaptureBase bool compress = true; int width = 0, height = 0; ImageType image_type; + + ImageResponse() : image_data_uint8(nullptr), camera_name(""), camera_position(Vector3r::Zero()), camera_orientation(Quaternionr::Identity()), time_stamp(0), message(""), pixels_as_float(false), compress(true), width(0), height(0), image_type(ImageType::Scene) {} + + ImageResponse(const ImageResponse& other) + { + image_data_uint8 = std::unique_ptr, std::function*)>>(other.image_data_uint8.get(), std::bind(&ImageResponse::CopyDeleter, this, std::placeholders::_1)); + camera_name = other.camera_name; + camera_position = other.camera_position; + camera_orientation = other.camera_orientation; + time_stamp = other.time_stamp; + message = other.message; + pixels_as_float = other.pixels_as_float; + compress = other.compress; + width = other.width; + height = other.height; + image_type = other.image_type; + } + + ImageResponse& operator=(const ImageResponse& other) + { + image_data_uint8 = std::unique_ptr, std::function*)>>(other.image_data_uint8.get(), std::bind(&ImageResponse::CopyDeleter, this, std::placeholders::_1)); + camera_name = other.camera_name; + camera_position = other.camera_position; + camera_orientation = other.camera_orientation; + time_stamp = other.time_stamp; + message = other.message; + pixels_as_float = other.pixels_as_float; + compress = other.compress; + width = other.width; + height = other.height; + image_type = other.image_type; + return *this; + } + + private: + void CopyDeleter(vector* buf) { + buf = nullptr; //Avoid error for unreferenced formal parameter. + } //Copies of an ImageResponse effectively contain weak pointers. The original response handles deleting the buffer. Ultimately, response copying should be removed from everywhere. }; public: //methods From b245d5c80b288bca3ebe576bca03dc8bc6ba7a7c Mon Sep 17 00:00:00 2001 From: Nicholas Gyde Date: Tue, 24 Mar 2020 12:32:37 -0700 Subject: [PATCH 10/29] Replaced non-portable expression _CRT_SIZE_MAX --- AirLib/include/common/common_utils/BufferPool.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/AirLib/include/common/common_utils/BufferPool.h b/AirLib/include/common/common_utils/BufferPool.h index bb79912ac0..8d49d74531 100644 --- a/AirLib/include/common/common_utils/BufferPool.h +++ b/AirLib/include/common/common_utils/BufferPool.h @@ -7,6 +7,7 @@ #include #include #include +#include typedef std::vector Buffer; typedef std::function Deleter; @@ -16,7 +17,7 @@ class BufferPool { public: BufferPtr GetBufferExactSize(size_t size); - BufferPtr GetBufferAtLeastSize(size_t size, size_t max_size = _CRT_SIZE_MAX); + BufferPtr GetBufferAtLeastSize(size_t size, size_t max_size = std::numeric_limits::max()); private: class BufferCollection From 4a502b0d2386c73393d2f7c6379a2141189a83ef Mon Sep 17 00:00:00 2001 From: Nicholas Gyde Date: Tue, 24 Mar 2020 13:47:44 -0700 Subject: [PATCH 11/29] Restored height, width, and time_stamp data in image responses. --- Unreal/Plugins/AirSim/Source/RenderRequest.cpp | 9 ++++++--- Unreal/Plugins/AirSim/Source/RenderRequest.h | 7 +------ Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp | 4 ++-- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/Unreal/Plugins/AirSim/Source/RenderRequest.cpp b/Unreal/Plugins/AirSim/Source/RenderRequest.cpp index 9973ddf304..180919d735 100644 --- a/Unreal/Plugins/AirSim/Source/RenderRequest.cpp +++ b/Unreal/Plugins/AirSim/Source/RenderRequest.cpp @@ -32,6 +32,7 @@ void RenderRequest::FastScreenshot() //Try to wait just long enough for the render thread to finish the capture. //Start with a long wait, then check for completion more frequently. + //TODO: Optimize these numbers. for (int best_guess_cap_time_microseconds = 500; !fast_cap_done_; best_guess_cap_time_microseconds = 200) std::this_thread::sleep_for(std::chrono::microseconds(best_guess_cap_time_microseconds)); } @@ -44,13 +45,15 @@ void RenderRequest::RenderThreadScreenshotTask() uint32 height = fast_cap_texture->GetSizeY(); uint32 stride; auto *src = (const unsigned char*)RHILockTexture2D(fast_cap_texture, 0, RLM_ReadOnly, stride, false); // needs to be on render thread - //fast_result_->image_data_uint8->Reset(fast_result_->image_data_uint8->Num()); - //fast_result_->image_data_uint8->Append(src, height * stride); - //void *dest = static_cast(fast_result_->image_data_uint8->GetData()); + + latest_result_.time_stamp = msr::airlib::ClockFactory::get()->nowNanos(); + latest_result_.width = width; + latest_result_.height = height; if (src) //rgba_output_->insert(rgba_output_->begin(), &src[0], &src[height * stride]); FMemory::BigBlockMemcpy(rgba_output_->data(), src, height * stride); //TODO MAYBE THIS IS THE SLOW PART RHIUnlockTexture2D(fast_cap_texture, 0, false); + fast_cap_done_ = true; } diff --git a/Unreal/Plugins/AirSim/Source/RenderRequest.h b/Unreal/Plugins/AirSim/Source/RenderRequest.h index 49ad5de829..21e73fd9aa 100644 --- a/Unreal/Plugins/AirSim/Source/RenderRequest.h +++ b/Unreal/Plugins/AirSim/Source/RenderRequest.h @@ -19,12 +19,6 @@ class RenderRequest : public FRenderCommand bool compress; }; struct RenderResult { - TArray image_data_uint8; - TArray image_data_float; - - TArray bmp; - TArray bmp_float; - int width; int height; @@ -36,6 +30,7 @@ class RenderRequest : public FRenderCommand std::shared_ptr* results_; public: RenderParams fast_param_{ nullptr, nullptr, false, false }; + volatile RenderResult latest_result_{}; std::vector *rgba_output_ = nullptr; private: diff --git a/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp b/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp index b450b6721d..2a9463b934 100644 --- a/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp +++ b/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp @@ -38,13 +38,13 @@ void UnrealImageCapture::getSceneCaptureImage(const std::string& camera_name, ms unsigned long log2; _BitScanReverse(&log2, width - 1); unsigned long long stride = 1ULL << (log2 + 1); //Round up to nearest power of 2. - response.image_data_uint8 = std::move(BufferPool_->GetBufferExactSize(height * stride * 4)); //TODO get resolution, figure out stride, figure out buffer size + response.image_data_uint8 = std::move(BufferPool_->GetBufferExactSize(height * stride * 4)); //TODO check not nullptr RenderRequest render_request(*response.image_data_uint8); render_request.fast_param_ = RenderRequest::RenderParams{ capture, textureTarget, false, false }; //render_params.at(0).get(); render_request.FastScreenshot(); - //response.time_stamp = result->time_stamp; + response.time_stamp = render_request.latest_result_.time_stamp; //response.image_data_uint8 = std::vector(result->image_data_uint8->GetData(), result->image_data_uint8->GetData() + result->image_data_uint8->Num()); response.width = width; response.height = height; From de9cf5bb2a2687ca4a92a14c722e6952580147d9 Mon Sep 17 00:00:00 2001 From: Nicholas Gyde Date: Wed, 25 Mar 2020 13:26:17 -0700 Subject: [PATCH 12/29] Removed extraneous std:move() and made a portable bit strober to fix linux issues. --- AirLib/include/common/common_utils/Utils.hpp | 11 +++++++++++ Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp | 11 ++++------- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/AirLib/include/common/common_utils/Utils.hpp b/AirLib/include/common/common_utils/Utils.hpp index f93d193847..b398e2b210 100644 --- a/AirLib/include/common/common_utils/Utils.hpp +++ b/AirLib/include/common/common_utils/Utils.hpp @@ -126,6 +126,17 @@ class Utils { return static_cast(radians * 180.0f / M_PI); } + static int nextPowerOfTwo(unsigned long long number) { + --number; + number |= number >> 1; + number |= number >> 2; + number |= number >> 4; + number |= number >> 8; + number |= number >> 16; + number |= number >> 32; + return ++number; + } + static bool startsWith(const string& s, const string& prefix) { return s.size() >= prefix.size() && s.compare(0, prefix.size(), prefix) == 0; } diff --git a/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp b/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp index 2a9463b934..d3421fffa7 100644 --- a/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp +++ b/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp @@ -1,6 +1,7 @@ #include "UnrealImageCapture.h" #include "Engine/World.h" #include "ImageUtils.h" +#include "AirLib/include/common/common_utils/Utils.hpp" #include "RenderRequest.h" #include "common/ClockFactory.hpp" @@ -35,17 +36,13 @@ void UnrealImageCapture::getSceneCaptureImage(const std::string& camera_name, ms int height = capture->TextureTarget->SizeY; int width = capture->TextureTarget->SizeX; - unsigned long log2; - _BitScanReverse(&log2, width - 1); - unsigned long long stride = 1ULL << (log2 + 1); //Round up to nearest power of 2. - response.image_data_uint8 = std::move(BufferPool_->GetBufferExactSize(height * stride * 4)); - //TODO check not nullptr + int stride = Utils::nextPowerOfTwo(width); //Round up to nearest power of 2. + response.image_data_uint8 = BufferPool_->GetBufferExactSize(height * stride * 4); RenderRequest render_request(*response.image_data_uint8); - render_request.fast_param_ = RenderRequest::RenderParams{ capture, textureTarget, false, false }; //render_params.at(0).get(); + render_request.fast_param_ = RenderRequest::RenderParams{ capture, textureTarget, false, false }; render_request.FastScreenshot(); response.time_stamp = render_request.latest_result_.time_stamp; - //response.image_data_uint8 = std::vector(result->image_data_uint8->GetData(), result->image_data_uint8->GetData() + result->image_data_uint8->Num()); response.width = width; response.height = height; response.image_type = image_type; From 142f8604f7a0adb643c54cfe25067d82fb3aeedd Mon Sep 17 00:00:00 2001 From: madratman Date: Wed, 25 Mar 2020 17:03:49 -0700 Subject: [PATCH 13/29] add image_benchmarker script --- .../computer_vision/image_benchmarker.py | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 PythonClient/computer_vision/image_benchmarker.py diff --git a/PythonClient/computer_vision/image_benchmarker.py b/PythonClient/computer_vision/image_benchmarker.py new file mode 100644 index 0000000000..7dc6c878fd --- /dev/null +++ b/PythonClient/computer_vision/image_benchmarker.py @@ -0,0 +1,88 @@ +from argparse import ArgumentParser +import airsim +import time +import threading +import numpy as np +import cv2 + +class ImageBenchmarker(): + def __init__(self, + img_benchmark_type = 'simGetImage', + viz_image_cv2 = False): + self.airsim_client = airsim.VehicleClient() + self.airsim_client.confirmConnection() + self.image_benchmark_num_images = 0 + self.image_benchmark_total_time = 0.0 + self.image_callback_thread = None + self.viz_image_cv2 = viz_image_cv2 + if img_benchmark_type == "simGetImage": + self.image_callback_thread = threading.Thread(target=self.repeat_timer_img, args=(self.image_callback_benchmark_simGetImage, 0.05)) + if img_benchmark_type == "simGetImages": + self.image_callback_thread = threading.Thread(target=self.repeat_timer_img, args=(self.image_callback_benchmark_simGetImages, 0.05)) + self.is_image_thread_active = False + + def start_img_benchmark_thread(self): + if not self.is_image_thread_active: + self.is_image_thread_active = True + self.image_callback_thread.start() + print("Started img image_callback thread") + + def stop_img_benchmark_thread(self): + if self.is_image_thread_active: + self.is_image_thread_active = False + self.image_callback_thread.join() + print("Stopped image callback thread.") + + def repeat_timer_img(self, task, period): + while self.is_image_thread_active: + task() + time.sleep(period) + + def print_benchmark_results(self): + avg_fps = 1.0 / ((self.image_benchmark_total_time) / float(self.image_benchmark_num_images)) + print("result: {} avg_fps for {} num of images".format(avg_fps, self.image_benchmark_num_images)) + + def image_callback_benchmark_simGetImage(self): + self.image_benchmark_num_images += 1 + iter_start_time = time.time() + image = self.airsim_client.simGetImage("fpv_cam", airsim.ImageType.Scene) + np_arr = np.frombuffer(image, dtype=np.uint8) + img_rgb = np_arr.reshape(240, 512, 4) + self.image_benchmark_total_time += time.time() - iter_start_time + avg_fps = 1.0 / ((self.image_benchmark_total_time) / float(self.image_benchmark_num_images)) + print("result: {} avg_fps for {} num of images".format(avg_fps, self.image_benchmark_num_images)) + # uncomment following lines to viz image + if self.viz_image_cv2: + cv2.imshow("img_rgb", img_rgb) + cv2.waitKey(1) + + def image_callback_benchmark_simGetImages(self): + self.image_benchmark_num_images += 1 + iter_start_time = time.time() + request = [airsim.ImageRequest("fpv_cam", airsim.ImageType.Scene, False, False)] + response = self.airsim_client.simGetImages(request) + np_arr = np.frombuffer(response[0].image_data_uint8, dtype=np.uint8) + img_rgb = np_arr.reshape(response[0].height, 512, 4) + self.image_benchmark_total_time += time.time() - iter_start_time + avg_fps = 1.0 / ((self.image_benchmark_total_time) / float(self.image_benchmark_num_images)) + print("result + {} avg_fps for {} num of images".format(avg_fps, self.image_benchmark_num_images)) + # uncomment following lines to viz image + if self.viz_image_cv2: + cv2.imshow("img_rgb", img_rgb) + cv2.waitKey(1) + +def main(args): + baseline_racer = ImageBenchmarker(img_benchmark_type=args.img_benchmark_type, viz_image_cv2=args.viz_image_cv2) + + baseline_racer.start_img_benchmark_thread() + time.sleep(30) + baseline_racer.stop_img_benchmark_thread() + baseline_racer.print_benchmark_results() + +if __name__ == "__main__": + parser = ArgumentParser() + parser.add_argument('--img_benchmark_type', type=str, choices=["simGetImage", "simGetImages"], default="simGetImages") + parser.add_argument('--enable_viz_image_cv2', dest='viz_image_cv2', action='store_true', default=False) + + args = parser.parse_args() + main(args) \ No newline at end of file From 1f89018fef0bdef3eaae6464305de6c8be1f9d3b Mon Sep 17 00:00:00 2001 From: madratman Date: Wed, 25 Mar 2020 20:30:42 -0700 Subject: [PATCH 14/29] [formatting] maintain whitespacing consistency with AirSim code --- AirLib/include/api/RpcLibAdapatorsBase.hpp | 176 +++++++++--------- AirLib/include/api/RpcLibClientBase.hpp | 2 +- AirLib/include/api/VehicleSimApiBase.hpp | 4 +- AirLib/include/common/ImageCaptureBase.hpp | 76 ++++---- .../include/common/common_utils/BufferPool.h | 30 +-- AirLib/include/common/common_utils/Utils.hpp | 46 ++--- AirLib/src/api/RpcLibServerBase.cpp | 24 +-- AirLib/src/common/common_utils/BufferPool.cpp | 50 ++--- Examples/DepthNav/DepthNav.hpp | 2 +- .../Plugins/AirSim/Source/RenderRequest.cpp | 64 +++---- Unreal/Plugins/AirSim/Source/RenderRequest.h | 14 +- .../AirSim/Source/UnrealImageCapture.cpp | 80 ++++---- .../AirSim/Source/UnrealImageCapture.h | 8 +- 13 files changed, 287 insertions(+), 289 deletions(-) diff --git a/AirLib/include/api/RpcLibAdapatorsBase.hpp b/AirLib/include/api/RpcLibAdapatorsBase.hpp index 0cf0db60e2..5770454db6 100644 --- a/AirLib/include/api/RpcLibAdapatorsBase.hpp +++ b/AirLib/include/api/RpcLibAdapatorsBase.hpp @@ -377,94 +377,94 @@ class RpcLibAdapatorsBase { return request; } }; - - struct ImageResponse { - std::vector image_data_uint8; - std::vector image_data_float; - - std::string camera_name; - Vector3r camera_position; - Quaternionr camera_orientation; - msr::airlib::TTimePoint time_stamp; - std::string message; - bool pixels_as_float; - bool compress; - int width, height; - msr::airlib::ImageCaptureBase::ImageType image_type; - - MSGPACK_DEFINE_MAP(image_data_uint8, image_data_float, camera_position, camera_name, - camera_orientation, time_stamp, message, pixels_as_float, compress, width, height, image_type); - - ImageResponse() - {} - - ImageResponse(const msr::airlib::ImageCaptureBase::ImageResponse& s) - { - pixels_as_float = s.pixels_as_float; - - image_data_uint8.insert(image_data_uint8.begin(), s.image_data_uint8->front(), s.image_data_uint8->back()); - image_data_float = s.image_data_float; - - //TODO: remove bug workaround for https://github.com/rpclib/rpclib/issues/152 - if (image_data_uint8.size() == 0) - image_data_uint8.push_back(0); - if (image_data_float.size() == 0) - image_data_float.push_back(0); - - camera_name = s.camera_name; - camera_position = Vector3r(s.camera_position); - camera_orientation = Quaternionr(s.camera_orientation); - time_stamp = s.time_stamp; - message = s.message; - compress = s.compress; - width = s.width; - height = s.height; - image_type = s.image_type; - } - - msr::airlib::ImageCaptureBase::ImageResponse to() const - { - msr::airlib::ImageCaptureBase::ImageResponse d; - - d.pixels_as_float = pixels_as_float; - - if (!pixels_as_float) - d.image_data_uint8->insert(d.image_data_uint8->begin(), image_data_uint8.front(), image_data_uint8.back()); - else - d.image_data_float = image_data_float; - - d.camera_name = camera_name; - d.camera_position = camera_position.to(); - d.camera_orientation = camera_orientation.to(); - d.time_stamp = time_stamp; - d.message = message; - d.compress = compress; - d.width = width; - d.height = height; - d.image_type = image_type; - - return d; - } - - static std::vector to( - const std::vector& response_adapter - ) { - std::vector response; - for (const auto& item : response_adapter) - response.push_back(item.to()); - - return response; - } - static std::vector from( - const std::vector& response - ) { - std::vector response_adapter; - for (const auto& item : response) - response_adapter.push_back(ImageResponse(item)); - - return response_adapter; - } - }; + + struct ImageResponse { + std::vector image_data_uint8; + std::vector image_data_float; + + std::string camera_name; + Vector3r camera_position; + Quaternionr camera_orientation; + msr::airlib::TTimePoint time_stamp; + std::string message; + bool pixels_as_float; + bool compress; + int width, height; + msr::airlib::ImageCaptureBase::ImageType image_type; + + MSGPACK_DEFINE_MAP(image_data_uint8, image_data_float, camera_position, camera_name, + camera_orientation, time_stamp, message, pixels_as_float, compress, width, height, image_type); + + ImageResponse() + {} + + ImageResponse(const msr::airlib::ImageCaptureBase::ImageResponse& s) + { + pixels_as_float = s.pixels_as_float; + + image_data_uint8.insert(image_data_uint8.begin(), s.image_data_uint8->front(), s.image_data_uint8->back()); + image_data_float = s.image_data_float; + + //TODO: remove bug workaround for https://github.com/rpclib/rpclib/issues/152 + if (image_data_uint8.size() == 0) + image_data_uint8.push_back(0); + if (image_data_float.size() == 0) + image_data_float.push_back(0); + + camera_name = s.camera_name; + camera_position = Vector3r(s.camera_position); + camera_orientation = Quaternionr(s.camera_orientation); + time_stamp = s.time_stamp; + message = s.message; + compress = s.compress; + width = s.width; + height = s.height; + image_type = s.image_type; + } + + msr::airlib::ImageCaptureBase::ImageResponse to() const + { + msr::airlib::ImageCaptureBase::ImageResponse d; + + d.pixels_as_float = pixels_as_float; + + if (!pixels_as_float) + d.image_data_uint8->insert(d.image_data_uint8->begin(), image_data_uint8.front(), image_data_uint8.back()); + else + d.image_data_float = image_data_float; + + d.camera_name = camera_name; + d.camera_position = camera_position.to(); + d.camera_orientation = camera_orientation.to(); + d.time_stamp = time_stamp; + d.message = message; + d.compress = compress; + d.width = width; + d.height = height; + d.image_type = image_type; + + return d; + } + + static std::vector to( + const std::vector& response_adapter + ) { + std::vector response; + for (const auto& item : response_adapter) + response.push_back(item.to()); + + return response; + } + static std::vector from( + const std::vector& response + ) { + std::vector response_adapter; + for (const auto& item : response) + response_adapter.push_back(ImageResponse(item)); + + return response_adapter; + } + }; struct LidarData { diff --git a/AirLib/include/api/RpcLibClientBase.hpp b/AirLib/include/api/RpcLibClientBase.hpp index 1ae78335e0..54c30d671a 100644 --- a/AirLib/include/api/RpcLibClientBase.hpp +++ b/AirLib/include/api/RpcLibClientBase.hpp @@ -51,7 +51,7 @@ class RpcLibClientBase { vector simListSceneObjects(const string& name_regex = string(".*")) const; Pose simGetObjectPose(const std::string& object_name) const; bool simSetObjectPose(const std::string& object_name, const Pose& pose, bool teleport = true); - + //task management APIs void cancelLastTask(const std::string& vehicle_name = ""); virtual RpcLibClientBase* waitOnLastTask(bool* task_result = nullptr, float timeout_sec = Utils::nan()); diff --git a/AirLib/include/api/VehicleSimApiBase.hpp b/AirLib/include/api/VehicleSimApiBase.hpp index 962f9c215c..3b82f633f2 100644 --- a/AirLib/include/api/VehicleSimApiBase.hpp +++ b/AirLib/include/api/VehicleSimApiBase.hpp @@ -45,8 +45,8 @@ class VehicleSimApiBase : public msr::airlib::UpdatableObject { virtual void initialize() = 0; - virtual void getImages(const std::vector& request, std::vector &responses) const = 0; - virtual void getImage(const ImageCaptureBase::ImageRequest& request, ImageCaptureBase::ImageResponse &response) const = 0; + virtual void getImages(const std::vector& request, std::vector &responses) const = 0; + virtual void getImage(const ImageCaptureBase::ImageRequest& request, ImageCaptureBase::ImageResponse &response) const = 0; virtual Pose getPose() const = 0; virtual void setPose(const Pose& pose, bool ignore_collision) = 0; diff --git a/AirLib/include/common/ImageCaptureBase.hpp b/AirLib/include/common/ImageCaptureBase.hpp index c13467e0de..f6feb070f1 100644 --- a/AirLib/include/common/ImageCaptureBase.hpp +++ b/AirLib/include/common/ImageCaptureBase.hpp @@ -59,48 +59,48 @@ class ImageCaptureBase int width = 0, height = 0; ImageType image_type; - ImageResponse() : image_data_uint8(nullptr), camera_name(""), camera_position(Vector3r::Zero()), camera_orientation(Quaternionr::Identity()), time_stamp(0), message(""), pixels_as_float(false), compress(true), width(0), height(0), image_type(ImageType::Scene) {} - - ImageResponse(const ImageResponse& other) - { - image_data_uint8 = std::unique_ptr, std::function*)>>(other.image_data_uint8.get(), std::bind(&ImageResponse::CopyDeleter, this, std::placeholders::_1)); - camera_name = other.camera_name; - camera_position = other.camera_position; - camera_orientation = other.camera_orientation; - time_stamp = other.time_stamp; - message = other.message; - pixels_as_float = other.pixels_as_float; - compress = other.compress; - width = other.width; - height = other.height; - image_type = other.image_type; - } - - ImageResponse& operator=(const ImageResponse& other) - { - image_data_uint8 = std::unique_ptr, std::function*)>>(other.image_data_uint8.get(), std::bind(&ImageResponse::CopyDeleter, this, std::placeholders::_1)); - camera_name = other.camera_name; - camera_position = other.camera_position; - camera_orientation = other.camera_orientation; - time_stamp = other.time_stamp; - message = other.message; - pixels_as_float = other.pixels_as_float; - compress = other.compress; - width = other.width; - height = other.height; - image_type = other.image_type; - return *this; - } - - private: - void CopyDeleter(vector* buf) { - buf = nullptr; //Avoid error for unreferenced formal parameter. - } //Copies of an ImageResponse effectively contain weak pointers. The original response handles deleting the buffer. Ultimately, response copying should be removed from everywhere. + ImageResponse() : image_data_uint8(nullptr), camera_name(""), camera_position(Vector3r::Zero()), camera_orientation(Quaternionr::Identity()), time_stamp(0), message(""), pixels_as_float(false), compress(true), width(0), height(0), image_type(ImageType::Scene) {} + + ImageResponse(const ImageResponse& other) + { + image_data_uint8 = std::unique_ptr, std::function*)>>(other.image_data_uint8.get(), std::bind(&ImageResponse::CopyDeleter, this, std::placeholders::_1)); + camera_name = other.camera_name; + camera_position = other.camera_position; + camera_orientation = other.camera_orientation; + time_stamp = other.time_stamp; + message = other.message; + pixels_as_float = other.pixels_as_float; + compress = other.compress; + width = other.width; + height = other.height; + image_type = other.image_type; + } + + ImageResponse& operator=(const ImageResponse& other) + { + image_data_uint8 = std::unique_ptr, std::function*)>>(other.image_data_uint8.get(), std::bind(&ImageResponse::CopyDeleter, this, std::placeholders::_1)); + camera_name = other.camera_name; + camera_position = other.camera_position; + camera_orientation = other.camera_orientation; + time_stamp = other.time_stamp; + message = other.message; + pixels_as_float = other.pixels_as_float; + compress = other.compress; + width = other.width; + height = other.height; + image_type = other.image_type; + return *this; + } + + private: + void CopyDeleter(vector* buf) { + buf = nullptr; //Avoid error for unreferenced formal parameter. + } //Copies of an ImageResponse effectively contain weak pointers. The original response handles deleting the buffer. Ultimately, response copying should be removed from everywhere. }; public: //methods virtual void getImages(const std::vector& requests, std::vector& responses) const = 0; - virtual void getImage(const ImageRequest& request, ImageResponse& response) const = 0; + virtual void getImage(const ImageRequest& request, ImageResponse& response) const = 0; }; diff --git a/AirLib/include/common/common_utils/BufferPool.h b/AirLib/include/common/common_utils/BufferPool.h index 8d49d74531..cb7ec7caf3 100644 --- a/AirLib/include/common/common_utils/BufferPool.h +++ b/AirLib/include/common/common_utils/BufferPool.h @@ -16,22 +16,22 @@ typedef std::unique_ptr BufferPtr; class BufferPool { public: - BufferPtr GetBufferExactSize(size_t size); - BufferPtr GetBufferAtLeastSize(size_t size, size_t max_size = std::numeric_limits::max()); + BufferPtr GetBufferExactSize(size_t size); + BufferPtr GetBufferAtLeastSize(size_t size, size_t max_size = std::numeric_limits::max()); private: - class BufferCollection - { - public: - BufferCollection(size_t size) : Size(size) {} - BufferPtr DemandBuffer(); - BufferPtr GetBufferIfAvailable(); + class BufferCollection + { + public: + BufferCollection(size_t size) : Size(size) {} + BufferPtr DemandBuffer(); + BufferPtr GetBufferIfAvailable(); - private: - size_t Size; - std::unordered_set AvailableBuffers; - BufferPtr MakeBufferPtr(Buffer *underlyingBuffer = nullptr); - void ReturnToCollection(Buffer *buffer); - }; - std::map CollectionsBySize; + private: + size_t Size; + std::unordered_set AvailableBuffers; + BufferPtr MakeBufferPtr(Buffer *underlyingBuffer = nullptr); + void ReturnToCollection(Buffer *buffer); + }; + std::map CollectionsBySize; }; \ No newline at end of file diff --git a/AirLib/include/common/common_utils/Utils.hpp b/AirLib/include/common/common_utils/Utils.hpp index b398e2b210..9885577aec 100644 --- a/AirLib/include/common/common_utils/Utils.hpp +++ b/AirLib/include/common/common_utils/Utils.hpp @@ -126,16 +126,16 @@ class Utils { return static_cast(radians * 180.0f / M_PI); } - static int nextPowerOfTwo(unsigned long long number) { - --number; - number |= number >> 1; - number |= number >> 2; - number |= number >> 4; - number |= number >> 8; - number |= number >> 16; - number |= number >> 32; - return ++number; - } + static int nextPowerOfTwo(unsigned long long number) { + --number; + number |= number >> 1; + number |= number >> 2; + number |= number >> 4; + number |= number >> 8; + number |= number >> 16; + number |= number >> 32; + return ++number; + } static bool startsWith(const string& s, const string& prefix) { return s.size() >= prefix.size() && s.compare(0, prefix.size(), prefix) == 0; @@ -354,7 +354,7 @@ class Utils { } it++; start = it; - for (; it != end; it++) { + for (; it != end; it++) { if (*it == ch) { break; } @@ -606,20 +606,20 @@ class Utils { return std::numeric_limits::epsilon(); } - //implements relative method - do not use for comparing with zero - //use this most of the time, tolerance needs to be meaningful in your context - template - static bool isApproximatelyEqual(TReal a, TReal b, TReal tolerance = epsilon()) - { - TReal diff = std::fabs(a - b); - if (diff <= tolerance) - return true; + //implements relative method - do not use for comparing with zero + //use this most of the time, tolerance needs to be meaningful in your context + template + static bool isApproximatelyEqual(TReal a, TReal b, TReal tolerance = epsilon()) + { + TReal diff = std::fabs(a - b); + if (diff <= tolerance) + return true; - if (diff < std::fmax(std::fabs(a), std::fabs(b)) * tolerance) - return true; + if (diff < std::fmax(std::fabs(a), std::fabs(b)) * tolerance) + return true; - return false; - } + return false; + } //supply tolerance that is meaningful in your context //for example, default tolerance may not work if you are comparing double with float diff --git a/AirLib/src/api/RpcLibServerBase.cpp b/AirLib/src/api/RpcLibServerBase.cpp index 230fbf22ed..fa2ff8e95b 100644 --- a/AirLib/src/api/RpcLibServerBase.cpp +++ b/AirLib/src/api/RpcLibServerBase.cpp @@ -124,21 +124,21 @@ RpcLibServerBase::RpcLibServerBase(ApiProvider* api_provider, const std::string& }); pimpl_->server.bind("simGetImages", [&](const std::vector& request_adapter, const std::string& vehicle_name) -> vector { - std::vector responses; - getVehicleSimApi(vehicle_name)->getImages(RpcLibAdapatorsBase::ImageRequest::to(request_adapter), responses); - return RpcLibAdapatorsBase::ImageResponse::from(responses); + std::vector responses; + getVehicleSimApi(vehicle_name)->getImages(RpcLibAdapatorsBase::ImageRequest::to(request_adapter), responses); + return RpcLibAdapatorsBase::ImageResponse::from(responses); }); pimpl_->server.bind("simGetImage", [&](const std::string& camera_name, ImageCaptureBase::ImageType type, const std::string& vehicle_name) -> vector { - ImageCaptureBase::ImageRequest request(camera_name, type); - ImageCaptureBase::ImageResponse response; + ImageCaptureBase::ImageRequest request(camera_name, type); + ImageCaptureBase::ImageResponse response; - getVehicleSimApi(vehicle_name)->getImage(request, response); - - // rpclib has a bug with serializing empty vectors, so we return a 1 byte vector instead. + getVehicleSimApi(vehicle_name)->getImage(request, response); + + // rpclib has a bug with serializing empty vectors, so we return a 1 byte vector instead. if (response.image_data_uint8->size() == 0) - response.image_data_uint8->push_back(0); + response.image_data_uint8->push_back(0); return *response.image_data_uint8; }); @@ -325,9 +325,9 @@ RpcLibServerBase::RpcLibServerBase(ApiProvider* api_provider, const std::string& return r; }); - pimpl_->server.bind("simSwapTextures", [&](const std::string tag, int tex_id, int component_id, int material_id) -> std::vector { - return *getWorldSimApi()->swapTextures(tag, tex_id, component_id, material_id); - }); + pimpl_->server.bind("simSwapTextures", [&](const std::string tag, int tex_id, int component_id, int material_id) -> std::vector { + return *getWorldSimApi()->swapTextures(tag, tex_id, component_id, material_id); + }); //if we don't suppress then server will bomb out for exceptions raised by any method pimpl_->server.suppress_exceptions(true); diff --git a/AirLib/src/common/common_utils/BufferPool.cpp b/AirLib/src/common/common_utils/BufferPool.cpp index fb8e1a89d2..5911eecad6 100644 --- a/AirLib/src/common/common_utils/BufferPool.cpp +++ b/AirLib/src/common/common_utils/BufferPool.cpp @@ -5,51 +5,51 @@ BufferPtr BufferPool::GetBufferExactSize(size_t size) { - if (CollectionsBySize.count(size) == 0) - CollectionsBySize.insert(std::pair(size, BufferCollection(size))); + if (CollectionsBySize.count(size) == 0) + CollectionsBySize.insert(std::pair(size, BufferCollection(size))); - return CollectionsBySize.at(size).DemandBuffer(); + return CollectionsBySize.at(size).DemandBuffer(); } BufferPtr BufferPool::GetBufferAtLeastSize(size_t size, size_t max_size) { - BufferPtr buffer = nullptr; - auto closestOffering = CollectionsBySize.lower_bound(size); - if (closestOffering != CollectionsBySize.end() && closestOffering->first < max_size) - buffer = closestOffering->second.GetBufferIfAvailable(); - - if (buffer != nullptr) - return buffer; - return GetBufferExactSize(size); + BufferPtr buffer = nullptr; + auto closestOffering = CollectionsBySize.lower_bound(size); + if (closestOffering != CollectionsBySize.end() && closestOffering->first < max_size) + buffer = closestOffering->second.GetBufferIfAvailable(); + + if (buffer != nullptr) + return buffer; + return GetBufferExactSize(size); } BufferPtr BufferPool::BufferCollection::DemandBuffer() { - BufferPtr buf = GetBufferIfAvailable(); - if (buf != nullptr) - return buf; - return MakeBufferPtr(); + BufferPtr buf = GetBufferIfAvailable(); + if (buf != nullptr) + return buf; + return MakeBufferPtr(); } BufferPtr BufferPool::BufferCollection::GetBufferIfAvailable() { - if (AvailableBuffers.size() == 0) - return nullptr; + if (AvailableBuffers.size() == 0) + return nullptr; - Buffer *buffer = *AvailableBuffers.begin(); - AvailableBuffers.erase(buffer); - return MakeBufferPtr(buffer); + Buffer *buffer = *AvailableBuffers.begin(); + AvailableBuffers.erase(buffer); + return MakeBufferPtr(buffer); } BufferPtr BufferPool::BufferCollection::MakeBufferPtr(Buffer *underlyingBuffer) { - if (underlyingBuffer == nullptr) - return std::unique_ptr(new Buffer(Size), std::bind(&BufferPool::BufferCollection::ReturnToCollection, this, std::placeholders::_1)); - else - return std::unique_ptr(underlyingBuffer, std::bind(&BufferPool::BufferCollection::ReturnToCollection, this, std::placeholders::_1)); + if (underlyingBuffer == nullptr) + return std::unique_ptr(new Buffer(Size), std::bind(&BufferPool::BufferCollection::ReturnToCollection, this, std::placeholders::_1)); + else + return std::unique_ptr(underlyingBuffer, std::bind(&BufferPool::BufferCollection::ReturnToCollection, this, std::placeholders::_1)); } void BufferPool::BufferCollection::ReturnToCollection(Buffer *buffer) { - AvailableBuffers.insert(buffer); + AvailableBuffers.insert(buffer); } \ No newline at end of file diff --git a/Examples/DepthNav/DepthNav.hpp b/Examples/DepthNav/DepthNav.hpp index fee4414e88..44286dc702 100644 --- a/Examples/DepthNav/DepthNav.hpp +++ b/Examples/DepthNav/DepthNav.hpp @@ -158,7 +158,7 @@ class DepthNav { throw DepthNavException("Image Dimension mismatch. Please check right camera in the AirSim config file."); */ const std::vector left_image(response.at(0).image_data_uint8->begin(), response.at(0).image_data_uint8->end()); - const std::vector right_image(response.at(1).image_data_uint8->begin(), response.at(1).image_data_uint8->end()); + const std::vector right_image(response.at(1).image_data_uint8->begin(), response.at(1).image_data_uint8->end()); //baseline * focal_length = depth * disparity float f = params_.depth_width / (2 * tan(params_.fov/2)); diff --git a/Unreal/Plugins/AirSim/Source/RenderRequest.cpp b/Unreal/Plugins/AirSim/Source/RenderRequest.cpp index 180919d735..607e79e55c 100644 --- a/Unreal/Plugins/AirSim/Source/RenderRequest.cpp +++ b/Unreal/Plugins/AirSim/Source/RenderRequest.cpp @@ -17,43 +17,43 @@ RenderRequest::~RenderRequest() void RenderRequest::FastScreenshot() { - UAirBlueprintLib::RunCommandOnGameThread([this]() { - fast_cap_done_ = false; - fast_rt_resource_ = fast_param_.render_component->TextureTarget->GameThread_GetRenderTargetResource(); - fast_param_.render_component->CaptureScene(); - ENQUEUE_UNIQUE_RENDER_COMMAND_ONEPARAMETER( - SceneDrawCompletion, - RenderRequest *, This, this, - { - This->RenderThreadScreenshotTask(); - } - ); - }, false); + UAirBlueprintLib::RunCommandOnGameThread([this]() { + fast_cap_done_ = false; + fast_rt_resource_ = fast_param_.render_component->TextureTarget->GameThread_GetRenderTargetResource(); + fast_param_.render_component->CaptureScene(); + ENQUEUE_UNIQUE_RENDER_COMMAND_ONEPARAMETER( + SceneDrawCompletion, + RenderRequest *, This, this, + { + This->RenderThreadScreenshotTask(); + } + ); + }, false); - //Try to wait just long enough for the render thread to finish the capture. - //Start with a long wait, then check for completion more frequently. - //TODO: Optimize these numbers. - for (int best_guess_cap_time_microseconds = 500; !fast_cap_done_; best_guess_cap_time_microseconds = 200) - std::this_thread::sleep_for(std::chrono::microseconds(best_guess_cap_time_microseconds)); + //Try to wait just long enough for the render thread to finish the capture. + //Start with a long wait, then check for completion more frequently. + //TODO: Optimize these numbers. + for (int best_guess_cap_time_microseconds = 500; !fast_cap_done_; best_guess_cap_time_microseconds = 200) + std::this_thread::sleep_for(std::chrono::microseconds(best_guess_cap_time_microseconds)); } void RenderRequest::RenderThreadScreenshotTask() { - FRHITexture2D *fast_cap_texture = fast_rt_resource_->TextureRHI->GetTexture2D(); - EPixelFormat pixelFormat = fast_cap_texture->GetFormat(); - uint32 width = fast_cap_texture->GetSizeX(); - uint32 height = fast_cap_texture->GetSizeY(); - uint32 stride; - auto *src = (const unsigned char*)RHILockTexture2D(fast_cap_texture, 0, RLM_ReadOnly, stride, false); // needs to be on render thread - - latest_result_.time_stamp = msr::airlib::ClockFactory::get()->nowNanos(); - latest_result_.width = width; - latest_result_.height = height; + FRHITexture2D *fast_cap_texture = fast_rt_resource_->TextureRHI->GetTexture2D(); + EPixelFormat pixelFormat = fast_cap_texture->GetFormat(); + uint32 width = fast_cap_texture->GetSizeX(); + uint32 height = fast_cap_texture->GetSizeY(); + uint32 stride; + auto *src = (const unsigned char*)RHILockTexture2D(fast_cap_texture, 0, RLM_ReadOnly, stride, false); // needs to be on render thread + + latest_result_.time_stamp = msr::airlib::ClockFactory::get()->nowNanos(); + latest_result_.width = width; + latest_result_.height = height; - if (src) - //rgba_output_->insert(rgba_output_->begin(), &src[0], &src[height * stride]); - FMemory::BigBlockMemcpy(rgba_output_->data(), src, height * stride); //TODO MAYBE THIS IS THE SLOW PART - RHIUnlockTexture2D(fast_cap_texture, 0, false); + if (src) + //rgba_output_->insert(rgba_output_->begin(), &src[0], &src[height * stride]); + FMemory::BigBlockMemcpy(rgba_output_->data(), src, height * stride); //TODO MAYBE THIS IS THE SLOW PART + RHIUnlockTexture2D(fast_cap_texture, 0, false); - fast_cap_done_ = true; + fast_cap_done_ = true; } diff --git a/Unreal/Plugins/AirSim/Source/RenderRequest.h b/Unreal/Plugins/AirSim/Source/RenderRequest.h index 21e73fd9aa..a5f6841949 100644 --- a/Unreal/Plugins/AirSim/Source/RenderRequest.h +++ b/Unreal/Plugins/AirSim/Source/RenderRequest.h @@ -29,13 +29,13 @@ class RenderRequest : public FRenderCommand std::shared_ptr* params_; std::shared_ptr* results_; public: - RenderParams fast_param_{ nullptr, nullptr, false, false }; - volatile RenderResult latest_result_{}; - std::vector *rgba_output_ = nullptr; + RenderParams fast_param_{ nullptr, nullptr, false, false }; + volatile RenderResult latest_result_{}; + std::vector *rgba_output_ = nullptr; private: - volatile bool fast_cap_done_ = false; - FTextureRenderTargetResource* fast_rt_resource_; + volatile bool fast_cap_done_ = false; + FTextureRenderTargetResource* fast_rt_resource_; std::shared_ptr wait_signal_; @@ -53,6 +53,6 @@ class RenderRequest : public FRenderCommand RETURN_QUICK_DECLARE_CYCLE_STAT(RenderRequest, STATGROUP_RenderThreadCommands); } - void FastScreenshot(); - void RenderThreadScreenshotTask(); + void FastScreenshot(); + void RenderThreadScreenshotTask(); }; diff --git a/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp b/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp index d3421fffa7..ab05c24f8f 100644 --- a/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp +++ b/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp @@ -6,10 +6,10 @@ #include "common/ClockFactory.hpp" UnrealImageCapture::UnrealImageCapture(const common_utils::UniqueValueMap* cameras) - : cameras_(cameras) + : cameras_(cameras) { - //TODO: explore screenshot option - //addScreenCaptureHandler(camera->GetWorld()); + //TODO: explore screenshot option + //addScreenCaptureHandler(camera->GetWorld()); } UnrealImageCapture::~UnrealImageCapture() @@ -17,63 +17,63 @@ UnrealImageCapture::~UnrealImageCapture() void UnrealImageCapture::getImages(const std::vector& requests, std::vector& responses) const { - for (int i = 0; i < requests.size() && i < responses.size(); ++i) - getImage(requests[i], responses[i]); + for (int i = 0; i < requests.size() && i < responses.size(); ++i) + getImage(requests[i], responses[i]); } void UnrealImageCapture::getImage(const msr::airlib::ImageCaptureBase::ImageRequest& request, msr::airlib::ImageCaptureBase::ImageResponse& response) const { - getSceneCaptureImage(request.camera_name, request.image_type, response); + getSceneCaptureImage(request.camera_name, request.image_type, response); } void UnrealImageCapture::getSceneCaptureImage(const std::string& camera_name, msr::airlib::ImageCaptureBase::ImageType image_type, msr::airlib::ImageCaptureBase::ImageResponse& response) const { - APIPCamera* camera = cameras_->at(camera_name); - camera->setCameraTypeEnabled(image_type, true); + APIPCamera* camera = cameras_->at(camera_name); + camera->setCameraTypeEnabled(image_type, true); - USceneCaptureComponent2D* capture = camera->getCaptureComponent(image_type, false); - UTextureRenderTarget2D* textureTarget = capture->TextureTarget; + USceneCaptureComponent2D* capture = camera->getCaptureComponent(image_type, false); + UTextureRenderTarget2D* textureTarget = capture->TextureTarget; - int height = capture->TextureTarget->SizeY; - int width = capture->TextureTarget->SizeX; - int stride = Utils::nextPowerOfTwo(width); //Round up to nearest power of 2. - response.image_data_uint8 = BufferPool_->GetBufferExactSize(height * stride * 4); - RenderRequest render_request(*response.image_data_uint8); - render_request.fast_param_ = RenderRequest::RenderParams{ capture, textureTarget, false, false }; - render_request.FastScreenshot(); + int height = capture->TextureTarget->SizeY; + int width = capture->TextureTarget->SizeX; + int stride = Utils::nextPowerOfTwo(width); //Round up to nearest power of 2. + response.image_data_uint8 = BufferPool_->GetBufferExactSize(height * stride * 4); + RenderRequest render_request(*response.image_data_uint8); + render_request.fast_param_ = RenderRequest::RenderParams{ capture, textureTarget, false, false }; + render_request.FastScreenshot(); - response.time_stamp = render_request.latest_result_.time_stamp; - response.width = width; - response.height = height; - response.image_type = image_type; + response.time_stamp = render_request.latest_result_.time_stamp; + response.width = width; + response.height = height; + response.image_type = image_type; } bool UnrealImageCapture::getScreenshotScreen(ImageType image_type, std::vector& compressedPng) { - FScreenshotRequest::RequestScreenshot(false); // This is an async operation - return true; + FScreenshotRequest::RequestScreenshot(false); // This is an async operation + return true; } void UnrealImageCapture::addScreenCaptureHandler(UWorld *world) { - static bool is_installed = false; + static bool is_installed = false; - if (!is_installed) { - UGameViewportClient* ViewportClient = world->GetGameViewport(); - ViewportClient->OnScreenshotCaptured().Clear(); - ViewportClient->OnScreenshotCaptured().AddLambda( - [this](int32 SizeX, int32 SizeY, const TArray& Bitmap) - { - // Make sure that all alpha values are opaque. - TArray& RefBitmap = const_cast&>(Bitmap); - for (auto& Color : RefBitmap) - Color.A = 255; + if (!is_installed) { + UGameViewportClient* ViewportClient = world->GetGameViewport(); + ViewportClient->OnScreenshotCaptured().Clear(); + ViewportClient->OnScreenshotCaptured().AddLambda( + [this](int32 SizeX, int32 SizeY, const TArray& Bitmap) + { + // Make sure that all alpha values are opaque. + TArray& RefBitmap = const_cast&>(Bitmap); + for (auto& Color : RefBitmap) + Color.A = 255; - TArray last_compressed_png; - FImageUtils::CompressImageArray(SizeX, SizeY, RefBitmap, last_compressed_png); - last_compressed_png_ = std::vector(last_compressed_png.GetData(), last_compressed_png.GetData() + last_compressed_png.Num()); - }); + TArray last_compressed_png; + FImageUtils::CompressImageArray(SizeX, SizeY, RefBitmap, last_compressed_png); + last_compressed_png_ = std::vector(last_compressed_png.GetData(), last_compressed_png.GetData() + last_compressed_png.Num()); + }); - is_installed = true; - } + is_installed = true; + } } diff --git a/Unreal/Plugins/AirSim/Source/UnrealImageCapture.h b/Unreal/Plugins/AirSim/Source/UnrealImageCapture.h index e41747cdec..b03c20b78f 100644 --- a/Unreal/Plugins/AirSim/Source/UnrealImageCapture.h +++ b/Unreal/Plugins/AirSim/Source/UnrealImageCapture.h @@ -6,8 +6,6 @@ #include "common/common_utils/UniqueValueMap.hpp" #include "common/common_utils/BufferPool.h" - - class UnrealImageCapture : public msr::airlib::ImageCaptureBase { public: @@ -16,11 +14,11 @@ class UnrealImageCapture : public msr::airlib::ImageCaptureBase UnrealImageCapture(const common_utils::UniqueValueMap* cameras); virtual ~UnrealImageCapture(); - virtual void getImages(const std::vector& requests, std::vector& responses) const override; - virtual void getImage(const ImageRequest& request, ImageResponse& response) const override; + virtual void getImages(const std::vector& requests, std::vector& responses) const override; + virtual void getImage(const ImageRequest& request, ImageResponse& response) const override; private: - BufferPool *BufferPool_ = new BufferPool(); + BufferPool *BufferPool_ = new BufferPool(); void getSceneCaptureImage(const std::string& camera_name, ImageCaptureBase::ImageType image_type, ImageResponse &response) const; From 220ad4b7cf834cc717b03d37b8cf592ab956a19e Mon Sep 17 00:00:00 2001 From: ironclownfish Date: Fri, 27 Mar 2020 13:26:54 -0700 Subject: [PATCH 15/29] Rather than assume width is rounded up to power of two, pass the buffer pool to the render thread so it can ask for the correct size of dest buffer when src buffer is known. --- AirLib/include/common/common_utils/Utils.hpp | 11 -------- .../Plugins/AirSim/Source/RenderRequest.cpp | 28 +++++++++---------- Unreal/Plugins/AirSim/Source/RenderRequest.h | 18 ++++++++---- .../AirSim/Source/UnrealImageCapture.cpp | 16 ++++++----- 4 files changed, 36 insertions(+), 37 deletions(-) diff --git a/AirLib/include/common/common_utils/Utils.hpp b/AirLib/include/common/common_utils/Utils.hpp index 9885577aec..c41be1166d 100644 --- a/AirLib/include/common/common_utils/Utils.hpp +++ b/AirLib/include/common/common_utils/Utils.hpp @@ -126,17 +126,6 @@ class Utils { return static_cast(radians * 180.0f / M_PI); } - static int nextPowerOfTwo(unsigned long long number) { - --number; - number |= number >> 1; - number |= number >> 2; - number |= number >> 4; - number |= number >> 8; - number |= number >> 16; - number |= number >> 32; - return ++number; - } - static bool startsWith(const string& s, const string& prefix) { return s.size() >= prefix.size() && s.compare(0, prefix.size(), prefix) == 0; } diff --git a/Unreal/Plugins/AirSim/Source/RenderRequest.cpp b/Unreal/Plugins/AirSim/Source/RenderRequest.cpp index 607e79e55c..d37a8fb4b1 100644 --- a/Unreal/Plugins/AirSim/Source/RenderRequest.cpp +++ b/Unreal/Plugins/AirSim/Source/RenderRequest.cpp @@ -6,10 +6,11 @@ #include "UnrealString.h" #include #include +#include "common/common_utils/BufferPool.h" #include "AirBlueprintLib.h" #include "Async/Async.h" -RenderRequest::RenderRequest(std::vector& rgba_output) : rgba_output_(&rgba_output) +RenderRequest::RenderRequest(BufferPool *buffer_pool) : buffer_pool_(buffer_pool) {} RenderRequest::~RenderRequest() @@ -21,13 +22,10 @@ void RenderRequest::FastScreenshot() fast_cap_done_ = false; fast_rt_resource_ = fast_param_.render_component->TextureTarget->GameThread_GetRenderTargetResource(); fast_param_.render_component->CaptureScene(); - ENQUEUE_UNIQUE_RENDER_COMMAND_ONEPARAMETER( - SceneDrawCompletion, - RenderRequest *, This, this, - { - This->RenderThreadScreenshotTask(); - } - ); + ENQUEUE_RENDER_COMMAND(SceneDrawCompletion)([this](FRHICommandListImmediate& RHICmdList) + { + this->RenderThreadScreenshotTask(this->latest_result_); + }); }, false); //Try to wait just long enough for the render thread to finish the capture. @@ -37,7 +35,7 @@ void RenderRequest::FastScreenshot() std::this_thread::sleep_for(std::chrono::microseconds(best_guess_cap_time_microseconds)); } -void RenderRequest::RenderThreadScreenshotTask() +void RenderRequest::RenderThreadScreenshotTask(RenderRequest::RenderResult &result) { FRHITexture2D *fast_cap_texture = fast_rt_resource_->TextureRHI->GetTexture2D(); EPixelFormat pixelFormat = fast_cap_texture->GetFormat(); @@ -46,13 +44,15 @@ void RenderRequest::RenderThreadScreenshotTask() uint32 stride; auto *src = (const unsigned char*)RHILockTexture2D(fast_cap_texture, 0, RLM_ReadOnly, stride, false); // needs to be on render thread - latest_result_.time_stamp = msr::airlib::ClockFactory::get()->nowNanos(); - latest_result_.width = width; - latest_result_.height = height; + result.time_stamp = msr::airlib::ClockFactory::get()->nowNanos(); + result.pixels = buffer_pool_->GetBufferExactSize(height*stride); + result.stride = stride; + result.width = width; + result.height = height; if (src) - //rgba_output_->insert(rgba_output_->begin(), &src[0], &src[height * stride]); - FMemory::BigBlockMemcpy(rgba_output_->data(), src, height * stride); //TODO MAYBE THIS IS THE SLOW PART + FMemory::BigBlockMemcpy(latest_result_.pixels->data(), src, height * stride); + RHIUnlockTexture2D(fast_cap_texture, 0, false); fast_cap_done_ = true; diff --git a/Unreal/Plugins/AirSim/Source/RenderRequest.h b/Unreal/Plugins/AirSim/Source/RenderRequest.h index a5f6841949..55a9d1c88a 100644 --- a/Unreal/Plugins/AirSim/Source/RenderRequest.h +++ b/Unreal/Plugins/AirSim/Source/RenderRequest.h @@ -8,21 +8,30 @@ #include #include "common/Common.hpp" +class BufferPool; class RenderRequest : public FRenderCommand { public: - struct RenderParams { + struct RenderParams + { USceneCaptureComponent2D *render_component; UTextureRenderTarget2D* render_target; bool pixels_as_float; bool compress; }; + struct RenderResult { + RenderResult() = default; + RenderResult(RenderResult&) = default; + RenderResult(RenderResult&&) = default; + RenderResult &operator=(RenderResult &&) = default; + int width; int height; - + int stride; msr::airlib::TTimePoint time_stamp; + std::unique_ptr, std::function*)>> pixels = nullptr; }; private: @@ -31,7 +40,6 @@ class RenderRequest : public FRenderCommand public: RenderParams fast_param_{ nullptr, nullptr, false, false }; volatile RenderResult latest_result_{}; - std::vector *rgba_output_ = nullptr; private: volatile bool fast_cap_done_ = false; @@ -45,7 +53,7 @@ class RenderRequest : public FRenderCommand std::function query_camera_pose_cb_; public: - RenderRequest(std::vector &rgba_output); + RenderRequest(BufferPool *buffer_pool); ~RenderRequest(); FORCEINLINE TStatId GetStatId() const @@ -54,5 +62,5 @@ class RenderRequest : public FRenderCommand } void FastScreenshot(); - void RenderThreadScreenshotTask(); + void RenderThreadScreenshotTask(RenderResult &result); }; diff --git a/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp b/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp index ab05c24f8f..18d769bff5 100644 --- a/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp +++ b/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp @@ -1,7 +1,6 @@ #include "UnrealImageCapture.h" #include "Engine/World.h" #include "ImageUtils.h" -#include "AirLib/include/common/common_utils/Utils.hpp" #include "RenderRequest.h" #include "common/ClockFactory.hpp" @@ -34,18 +33,21 @@ void UnrealImageCapture::getSceneCaptureImage(const std::string& camera_name, ms USceneCaptureComponent2D* capture = camera->getCaptureComponent(image_type, false); UTextureRenderTarget2D* textureTarget = capture->TextureTarget; - int height = capture->TextureTarget->SizeY; - int width = capture->TextureTarget->SizeX; - int stride = Utils::nextPowerOfTwo(width); //Round up to nearest power of 2. - response.image_data_uint8 = BufferPool_->GetBufferExactSize(height * stride * 4); - RenderRequest render_request(*response.image_data_uint8); + RenderRequest render_request(BufferPool_); render_request.fast_param_ = RenderRequest::RenderParams{ capture, textureTarget, false, false }; render_request.FastScreenshot(); + int height = capture->TextureTarget->SizeY; + int stride = render_request.latest_result_.stride; + int bytes = render_request.latest_result_.pixels->size(); + int bytes_per_pixel = bytes / (height * stride); + int padded_width = stride / bytes_per_pixel; + response.time_stamp = render_request.latest_result_.time_stamp; - response.width = width; + response.width = padded_width; response.height = height; response.image_type = image_type; + response.image_data_uint8 = std::move(render_request.latest_result_.pixels); } bool UnrealImageCapture::getScreenshotScreen(ImageType image_type, std::vector& compressedPng) From 03494a51c8e560e6721432df461ad6eef5011954 Mon Sep 17 00:00:00 2001 From: Nicholas Gyde Date: Tue, 5 May 2020 19:15:45 -0700 Subject: [PATCH 16/29] Get simGetImages working --- AirLib/include/api/RpcLibAdapatorsBase.hpp | 2 +- AirLib/src/api/RpcLibServerBase.cpp | 2 ++ Unreal/Plugins/AirSim/Source/RenderRequest.h | 3 ++- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/AirLib/include/api/RpcLibAdapatorsBase.hpp b/AirLib/include/api/RpcLibAdapatorsBase.hpp index 5770454db6..9035c388f8 100644 --- a/AirLib/include/api/RpcLibAdapatorsBase.hpp +++ b/AirLib/include/api/RpcLibAdapatorsBase.hpp @@ -402,7 +402,7 @@ class RpcLibAdapatorsBase { { pixels_as_float = s.pixels_as_float; - image_data_uint8.insert(image_data_uint8.begin(), s.image_data_uint8->front(), s.image_data_uint8->back()); + image_data_uint8 = std::move(*(s.image_data_uint8)); image_data_float = s.image_data_float; //TODO: remove bug workaround for https://github.com/rpclib/rpclib/issues/152 diff --git a/AirLib/src/api/RpcLibServerBase.cpp b/AirLib/src/api/RpcLibServerBase.cpp index fa2ff8e95b..e26c7dd6b2 100644 --- a/AirLib/src/api/RpcLibServerBase.cpp +++ b/AirLib/src/api/RpcLibServerBase.cpp @@ -125,6 +125,8 @@ RpcLibServerBase::RpcLibServerBase(ApiProvider* api_provider, const std::string& pimpl_->server.bind("simGetImages", [&](const std::vector& request_adapter, const std::string& vehicle_name) -> vector { std::vector responses; + for (request : request_adapter) + responses.push_back(ImageCapbureBase::ImageResponse()); getVehicleSimApi(vehicle_name)->getImages(RpcLibAdapatorsBase::ImageRequest::to(request_adapter), responses); return RpcLibAdapatorsBase::ImageResponse::from(responses); }); diff --git a/Unreal/Plugins/AirSim/Source/RenderRequest.h b/Unreal/Plugins/AirSim/Source/RenderRequest.h index 55a9d1c88a..8d7fc31711 100644 --- a/Unreal/Plugins/AirSim/Source/RenderRequest.h +++ b/Unreal/Plugins/AirSim/Source/RenderRequest.h @@ -39,7 +39,7 @@ class RenderRequest : public FRenderCommand std::shared_ptr* results_; public: RenderParams fast_param_{ nullptr, nullptr, false, false }; - volatile RenderResult latest_result_{}; + RenderResult latest_result_{}; private: volatile bool fast_cap_done_ = false; @@ -52,6 +52,7 @@ class RenderRequest : public FRenderCommand FDelegateHandle end_draw_handle_; std::function query_camera_pose_cb_; + BufferPool* buffer_pool_ = nullptr; public: RenderRequest(BufferPool *buffer_pool); ~RenderRequest(); From 9b74b56a350aec013ae639120fd197c3c4fc5579 Mon Sep 17 00:00:00 2001 From: Nicholas Gyde Date: Sun, 10 May 2020 22:11:04 -0700 Subject: [PATCH 17/29] A memcopy is necessary in RpcLibAdaptorsBase. A swap would send a size-0 buffer back into the response's image_data_uint8, which then returns that useless buffer to the buffer pool. Since RPC can't take over the unique_ptr that manages our buffer, we should send RPC a copy. --- AirLib/include/api/RpcLibAdapatorsBase.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AirLib/include/api/RpcLibAdapatorsBase.hpp b/AirLib/include/api/RpcLibAdapatorsBase.hpp index 9035c388f8..e0e0a7d5c1 100644 --- a/AirLib/include/api/RpcLibAdapatorsBase.hpp +++ b/AirLib/include/api/RpcLibAdapatorsBase.hpp @@ -402,7 +402,7 @@ class RpcLibAdapatorsBase { { pixels_as_float = s.pixels_as_float; - image_data_uint8 = std::move(*(s.image_data_uint8)); + image_data_uint8 = *(s.image_data_uint8); image_data_float = s.image_data_float; //TODO: remove bug workaround for https://github.com/rpclib/rpclib/issues/152 From 0b94b8aa5dc19f5bf6d467f5fe7b05e524171c2a Mon Sep 17 00:00:00 2001 From: Rajat Singhal Date: Wed, 6 May 2020 21:06:11 +0530 Subject: [PATCH 18/29] Compilation fixes --- AirLib/src/api/RpcLibServerBase.cpp | 4 ++-- Unreal/Plugins/AirSim/Source/RenderRequest.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/AirLib/src/api/RpcLibServerBase.cpp b/AirLib/src/api/RpcLibServerBase.cpp index e26c7dd6b2..970dd1917c 100644 --- a/AirLib/src/api/RpcLibServerBase.cpp +++ b/AirLib/src/api/RpcLibServerBase.cpp @@ -125,8 +125,8 @@ RpcLibServerBase::RpcLibServerBase(ApiProvider* api_provider, const std::string& pimpl_->server.bind("simGetImages", [&](const std::vector& request_adapter, const std::string& vehicle_name) -> vector { std::vector responses; - for (request : request_adapter) - responses.push_back(ImageCapbureBase::ImageResponse()); + for (RpcLibAdapatorsBase::ImageRequest request : request_adapter) + responses.push_back(ImageCaptureBase::ImageResponse()); getVehicleSimApi(vehicle_name)->getImages(RpcLibAdapatorsBase::ImageRequest::to(request_adapter), responses); return RpcLibAdapatorsBase::ImageResponse::from(responses); }); diff --git a/Unreal/Plugins/AirSim/Source/RenderRequest.h b/Unreal/Plugins/AirSim/Source/RenderRequest.h index 8d7fc31711..957e36bed6 100644 --- a/Unreal/Plugins/AirSim/Source/RenderRequest.h +++ b/Unreal/Plugins/AirSim/Source/RenderRequest.h @@ -23,7 +23,7 @@ class RenderRequest : public FRenderCommand struct RenderResult { RenderResult() = default; - RenderResult(RenderResult&) = default; + // RenderResult(RenderResult&) = default; RenderResult(RenderResult&&) = default; RenderResult &operator=(RenderResult &&) = default; From 6d7f40526262f431be930ecd9ad9fa5d07d1d145 Mon Sep 17 00:00:00 2001 From: Rajat Singhal Date: Sun, 17 May 2020 00:03:33 +0530 Subject: [PATCH 19/29] Fix camera name in benchmark script --- PythonClient/computer_vision/image_benchmarker.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/PythonClient/computer_vision/image_benchmarker.py b/PythonClient/computer_vision/image_benchmarker.py index 7dc6c878fd..17767805a4 100644 --- a/PythonClient/computer_vision/image_benchmarker.py +++ b/PythonClient/computer_vision/image_benchmarker.py @@ -7,7 +7,7 @@ class ImageBenchmarker(): def __init__(self, - img_benchmark_type = 'simGetImage', + img_benchmark_type = 'simGetImages', viz_image_cv2 = False): self.airsim_client = airsim.VehicleClient() self.airsim_client.confirmConnection() @@ -45,7 +45,7 @@ def print_benchmark_results(self): def image_callback_benchmark_simGetImage(self): self.image_benchmark_num_images += 1 iter_start_time = time.time() - image = self.airsim_client.simGetImage("fpv_cam", airsim.ImageType.Scene) + image = self.airsim_client.simGetImage("front_center", airsim.ImageType.Scene) np_arr = np.frombuffer(image, dtype=np.uint8) img_rgb = np_arr.reshape(240, 512, 4) self.image_benchmark_total_time += time.time() - iter_start_time @@ -59,10 +59,10 @@ def image_callback_benchmark_simGetImage(self): def image_callback_benchmark_simGetImages(self): self.image_benchmark_num_images += 1 iter_start_time = time.time() - request = [airsim.ImageRequest("fpv_cam", airsim.ImageType.Scene, False, False)] + request = [airsim.ImageRequest("front_center", airsim.ImageType.Scene, False, False)] response = self.airsim_client.simGetImages(request) np_arr = np.frombuffer(response[0].image_data_uint8, dtype=np.uint8) - img_rgb = np_arr.reshape(response[0].height, 512, 4) + img_rgb = np_arr.reshape(response[0].height, response[0].width, 4) self.image_benchmark_total_time += time.time() - iter_start_time avg_fps = 1.0 / ((self.image_benchmark_total_time) / float(self.image_benchmark_num_images)) print("result + {} avg_fps for {} num of images".format(avg_fps, self.image_benchmark_num_images)) From 6b169768baf763ceade2f1ae857f0a8ee5f2c6aa Mon Sep 17 00:00:00 2001 From: Rajat Singhal Date: Sat, 23 May 2020 20:18:36 +0530 Subject: [PATCH 20/29] Fix compile error --- Unreal/Plugins/AirSim/Source/RenderRequest.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Unreal/Plugins/AirSim/Source/RenderRequest.cpp b/Unreal/Plugins/AirSim/Source/RenderRequest.cpp index d37a8fb4b1..373610310d 100644 --- a/Unreal/Plugins/AirSim/Source/RenderRequest.cpp +++ b/Unreal/Plugins/AirSim/Source/RenderRequest.cpp @@ -3,7 +3,7 @@ #include "Engine/TextureRenderTarget2D.h" #include "Async/TaskGraphInterfaces.h" #include "ImageUtils.h" -#include "UnrealString.h" +#include "Containers/UnrealString.h" #include #include #include "common/common_utils/BufferPool.h" From 4603bf3febcd80778038d64096c95794b7dd3de0 Mon Sep 17 00:00:00 2001 From: Rajat Singhal Date: Sat, 23 May 2020 22:08:54 +0530 Subject: [PATCH 21/29] Fix image width calculation --- Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp b/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp index 18d769bff5..5ae8b80829 100644 --- a/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp +++ b/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp @@ -38,11 +38,13 @@ void UnrealImageCapture::getSceneCaptureImage(const std::string& camera_name, ms render_request.FastScreenshot(); int height = capture->TextureTarget->SizeY; + int width = capture->TextureTarget->SizeX; int stride = render_request.latest_result_.stride; int bytes = render_request.latest_result_.pixels->size(); - int bytes_per_pixel = bytes / (height * stride); + int bytes_per_pixel = bytes / (height * width); int padded_width = stride / bytes_per_pixel; + response.camera_name = camera_name; response.time_stamp = render_request.latest_result_.time_stamp; response.width = padded_width; response.height = height; From e85fee6f186f368eab20251fc1613e1466f6d971 Mon Sep 17 00:00:00 2001 From: Rajat Singhal Date: Sun, 24 May 2020 02:46:26 +0530 Subject: [PATCH 22/29] [Unreal] Use WriteOnly LockMode to avoid crash on Linux using Vulkan --- Unreal/Plugins/AirSim/Source/RenderRequest.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Unreal/Plugins/AirSim/Source/RenderRequest.cpp b/Unreal/Plugins/AirSim/Source/RenderRequest.cpp index 373610310d..37a7931e7a 100644 --- a/Unreal/Plugins/AirSim/Source/RenderRequest.cpp +++ b/Unreal/Plugins/AirSim/Source/RenderRequest.cpp @@ -42,7 +42,9 @@ void RenderRequest::RenderThreadScreenshotTask(RenderRequest::RenderResult &resu uint32 width = fast_cap_texture->GetSizeX(); uint32 height = fast_cap_texture->GetSizeY(); uint32 stride; - auto *src = (const unsigned char*)RHILockTexture2D(fast_cap_texture, 0, RLM_ReadOnly, stride, false); // needs to be on render thread + // Vulkan doesn't allow Locks for ReadOnly, so using RLM_WriteOnly as LockMode + // TODO: Can this be done better? + auto *src = (const unsigned char*)RHILockTexture2D(fast_cap_texture, 0, RLM_WriteOnly, stride, false); // needs to be on render thread result.time_stamp = msr::airlib::ClockFactory::get()->nowNanos(); result.pixels = buffer_pool_->GetBufferExactSize(height*stride); From b5f79e5211940a87b301d779971811c24338602f Mon Sep 17 00:00:00 2001 From: Rajat Singhal Date: Sun, 24 May 2020 13:38:37 +0530 Subject: [PATCH 23/29] Make no. of channles depend on image, allows it to be used on both PR and master --- PythonClient/computer_vision/image_benchmarker.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PythonClient/computer_vision/image_benchmarker.py b/PythonClient/computer_vision/image_benchmarker.py index 17767805a4..8e96ddb4ce 100644 --- a/PythonClient/computer_vision/image_benchmarker.py +++ b/PythonClient/computer_vision/image_benchmarker.py @@ -62,7 +62,7 @@ def image_callback_benchmark_simGetImages(self): request = [airsim.ImageRequest("front_center", airsim.ImageType.Scene, False, False)] response = self.airsim_client.simGetImages(request) np_arr = np.frombuffer(response[0].image_data_uint8, dtype=np.uint8) - img_rgb = np_arr.reshape(response[0].height, response[0].width, 4) + img_rgb = np_arr.reshape(response[0].height, response[0].width, -1) self.image_benchmark_total_time += time.time() - iter_start_time avg_fps = 1.0 / ((self.image_benchmark_total_time) / float(self.image_benchmark_num_images)) print("result + {} avg_fps for {} num of images".format(avg_fps, self.image_benchmark_num_images)) From 92c977c47f48ad1e262247512e71c837d42fd95b Mon Sep 17 00:00:00 2001 From: Rajat Singhal Date: Mon, 25 May 2020 01:50:55 +0530 Subject: [PATCH 24/29] Revert "[Unreal] Use WriteOnly LockMode to avoid crash on Linux using Vulkan" With this modification, garbage data is returned This reverts commit e85fee6f186f368eab20251fc1613e1466f6d971. --- Unreal/Plugins/AirSim/Source/RenderRequest.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Unreal/Plugins/AirSim/Source/RenderRequest.cpp b/Unreal/Plugins/AirSim/Source/RenderRequest.cpp index 37a7931e7a..373610310d 100644 --- a/Unreal/Plugins/AirSim/Source/RenderRequest.cpp +++ b/Unreal/Plugins/AirSim/Source/RenderRequest.cpp @@ -42,9 +42,7 @@ void RenderRequest::RenderThreadScreenshotTask(RenderRequest::RenderResult &resu uint32 width = fast_cap_texture->GetSizeX(); uint32 height = fast_cap_texture->GetSizeY(); uint32 stride; - // Vulkan doesn't allow Locks for ReadOnly, so using RLM_WriteOnly as LockMode - // TODO: Can this be done better? - auto *src = (const unsigned char*)RHILockTexture2D(fast_cap_texture, 0, RLM_WriteOnly, stride, false); // needs to be on render thread + auto *src = (const unsigned char*)RHILockTexture2D(fast_cap_texture, 0, RLM_ReadOnly, stride, false); // needs to be on render thread result.time_stamp = msr::airlib::ClockFactory::get()->nowNanos(); result.pixels = buffer_pool_->GetBufferExactSize(height*stride); From d5724112057c8512df8366c022c8bcabc5f0f150 Mon Sep 17 00:00:00 2001 From: Rajat Singhal Date: Mon, 25 May 2020 19:51:12 +0530 Subject: [PATCH 25/29] Updated benchmark script, add save_images option --- .../computer_vision/image_benchmarker.py | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/PythonClient/computer_vision/image_benchmarker.py b/PythonClient/computer_vision/image_benchmarker.py index 8e96ddb4ce..b529e9d974 100644 --- a/PythonClient/computer_vision/image_benchmarker.py +++ b/PythonClient/computer_vision/image_benchmarker.py @@ -4,22 +4,37 @@ import threading import numpy as np import cv2 +import tempfile +import os class ImageBenchmarker(): def __init__(self, img_benchmark_type = 'simGetImages', - viz_image_cv2 = False): + viz_image_cv2 = False, + save_images = False): self.airsim_client = airsim.VehicleClient() self.airsim_client.confirmConnection() self.image_benchmark_num_images = 0 self.image_benchmark_total_time = 0.0 self.image_callback_thread = None self.viz_image_cv2 = viz_image_cv2 + self.save_images = save_images + if img_benchmark_type == "simGetImage": self.image_callback_thread = threading.Thread(target=self.repeat_timer_img, args=(self.image_callback_benchmark_simGetImage, 0.05)) if img_benchmark_type == "simGetImages": self.image_callback_thread = threading.Thread(target=self.repeat_timer_img, args=(self.image_callback_benchmark_simGetImages, 0.05)) self.is_image_thread_active = False + self.image_callback_thread.daemon = True + + if self.save_images: + self.tmp_dir = os.path.join(tempfile.gettempdir(), "airsim_img_bm") + print ("Saving images to %s" % self.tmp_dir) + try: + os.makedirs(self.tmp_dir) + except OSError: + if not os.path.isdir(self.tmp_dir): + raise def start_img_benchmark_thread(self): if not self.is_image_thread_active: @@ -70,9 +85,13 @@ def image_callback_benchmark_simGetImages(self): if self.viz_image_cv2: cv2.imshow("img_rgb", img_rgb) cv2.waitKey(1) + if self.save_images: + filename = os.path.join(self.tmp_dir, str(self.image_benchmark_num_images)) + cv2.imwrite(os.path.normpath(filename + '.png'), img_rgb) # write to png def main(args): - baseline_racer = ImageBenchmarker(img_benchmark_type=args.img_benchmark_type, viz_image_cv2=args.viz_image_cv2) + baseline_racer = ImageBenchmarker(img_benchmark_type=args.img_benchmark_type, viz_image_cv2=args.viz_image_cv2, + save_images=args.save_images) baseline_racer.start_img_benchmark_thread() time.sleep(30) @@ -83,6 +102,7 @@ def main(args): parser = ArgumentParser() parser.add_argument('--img_benchmark_type', type=str, choices=["simGetImage", "simGetImages"], default="simGetImages") parser.add_argument('--enable_viz_image_cv2', dest='viz_image_cv2', action='store_true', default=False) + parser.add_argument('--save_images', dest='save_images', action='store_true', default=False) args = parser.parse_args() main(args) \ No newline at end of file From 3de9156fca8889bf59e3a2383e038f32d2f36ffd Mon Sep 17 00:00:00 2001 From: Rajat Singhal Date: Thu, 28 May 2020 14:14:02 +0530 Subject: [PATCH 26/29] [Unreal] Disable camera after capturing image --- Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp b/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp index 5ae8b80829..b08fb448b4 100644 --- a/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp +++ b/Unreal/Plugins/AirSim/Source/UnrealImageCapture.cpp @@ -50,6 +50,10 @@ void UnrealImageCapture::getSceneCaptureImage(const std::string& camera_name, ms response.height = height; response.image_type = image_type; response.image_data_uint8 = std::move(render_request.latest_result_.pixels); + + // Disable camera after capturing image, this reduces resource consumption when images are not being taken + // Particulary when a high-resolution camera is used occasionally + camera->setCameraTypeEnabled(image_type, false); } bool UnrealImageCapture::getScreenshotScreen(ImageType image_type, std::vector& compressedPng) From 41dcd849acdac11f4b325163f1aa7437e2b371e8 Mon Sep 17 00:00:00 2001 From: Rajat Singhal Date: Thu, 28 May 2020 14:15:08 +0530 Subject: [PATCH 27/29] [Pythonclient] Add high resolution camera benchmark script --- .../computer_vision/high_res_camera_bm.py | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 PythonClient/computer_vision/high_res_camera_bm.py diff --git a/PythonClient/computer_vision/high_res_camera_bm.py b/PythonClient/computer_vision/high_res_camera_bm.py new file mode 100644 index 0000000000..9564b1ee65 --- /dev/null +++ b/PythonClient/computer_vision/high_res_camera_bm.py @@ -0,0 +1,62 @@ +import setup_path +import airsim +from datetime import datetime + +''' +Example file for benchmarking and observing the affect of a high-resolution camera + +Settings used- +{ + "SettingsVersion": 1.2, + "SimMode": "Multirotor", + "Vehicles" : { + "Drone" : { + "VehicleType" : "SimpleFlight", + "AutoCreate" : true, + "Cameras" : { + "high_res": { + "CaptureSettings" : [ + { + "ImageType" : 0, + "Width" : 4320, + "Height" : 2160 + } + ], + "X": 0.50, "Y": 0.00, "Z": 0.10, + "Pitch": 0.0, "Roll": 0.0, "Yaw": 0.0 + }, + "low_res": { + "CaptureSettings" : [ + { + "ImageType" : 0, + "Width" : 256, + "Height" : 144 + } + ], + "X": 0.50, "Y": 0.00, "Z": 0.10, + "Pitch": 0.0, "Roll": 0.0, "Yaw": 0.0 + } + } + } + } +} +''' + +client = airsim.MultirotorClient() +client.confirmConnection() +framecounter = 1 + +prevtimestamp = datetime.now() + +while(framecounter <= 1500): + if framecounter%50 == 0: + now = datetime.now() + print("Time spent for 50 frames: " + str(now-prevtimestamp)) + prevtimestamp = now + + if framecounter%250 == 0: + client.simGetImages([airsim.ImageRequest("high_res", airsim.ImageType.Scene, False, False)]) + print("High resolution image captured.") + + client.simGetImages([airsim.ImageRequest("low_res", airsim.ImageType.Scene, False, False)]) + framecounter += 1 From 6612ea41deae3731b16f6818c444f5403c8fd9b6 Mon Sep 17 00:00:00 2001 From: madratman Date: Sun, 31 May 2020 21:00:50 -0700 Subject: [PATCH 28/29] restore BP_FlyingPawn.uasset, fixes to benchmarking script --- .../computer_vision/image_benchmarker.py | 43 +++++------------- .../Content/Blueprints/BP_FlyingPawn.uasset | Bin 150741 -> 153281 bytes 2 files changed, 12 insertions(+), 31 deletions(-) diff --git a/PythonClient/computer_vision/image_benchmarker.py b/PythonClient/computer_vision/image_benchmarker.py index b529e9d974..b32ea05e5d 100644 --- a/PythonClient/computer_vision/image_benchmarker.py +++ b/PythonClient/computer_vision/image_benchmarker.py @@ -10,35 +10,25 @@ class ImageBenchmarker(): def __init__(self, img_benchmark_type = 'simGetImages', - viz_image_cv2 = False, - save_images = False): + viz_image_cv2 = False): self.airsim_client = airsim.VehicleClient() self.airsim_client.confirmConnection() self.image_benchmark_num_images = 0 self.image_benchmark_total_time = 0.0 self.image_callback_thread = None self.viz_image_cv2 = viz_image_cv2 - self.save_images = save_images if img_benchmark_type == "simGetImage": - self.image_callback_thread = threading.Thread(target=self.repeat_timer_img, args=(self.image_callback_benchmark_simGetImage, 0.05)) + self.image_callback_thread = threading.Thread(target=self.repeat_timer_img, args=(self.image_callback_benchmark_simGetImage, 0.001)) if img_benchmark_type == "simGetImages": - self.image_callback_thread = threading.Thread(target=self.repeat_timer_img, args=(self.image_callback_benchmark_simGetImages, 0.05)) + self.image_callback_thread = threading.Thread(target=self.repeat_timer_img, args=(self.image_callback_benchmark_simGetImages, 0.001)) self.is_image_thread_active = False self.image_callback_thread.daemon = True - if self.save_images: - self.tmp_dir = os.path.join(tempfile.gettempdir(), "airsim_img_bm") - print ("Saving images to %s" % self.tmp_dir) - try: - os.makedirs(self.tmp_dir) - except OSError: - if not os.path.isdir(self.tmp_dir): - raise - def start_img_benchmark_thread(self): if not self.is_image_thread_active: self.is_image_thread_active = True + self.benchmark_start_time = time.time() self.image_callback_thread.start() print("Started img image_callback thread") @@ -59,50 +49,41 @@ def print_benchmark_results(self): def image_callback_benchmark_simGetImage(self): self.image_benchmark_num_images += 1 - iter_start_time = time.time() image = self.airsim_client.simGetImage("front_center", airsim.ImageType.Scene) np_arr = np.frombuffer(image, dtype=np.uint8) img_rgb = np_arr.reshape(240, 512, 4) - self.image_benchmark_total_time += time.time() - iter_start_time - avg_fps = 1.0 / ((self.image_benchmark_total_time) / float(self.image_benchmark_num_images)) + self.image_benchmark_total_time = time.time() - self.benchmark_start_time + avg_fps = self.image_benchmark_num_images / self.image_benchmark_total_time print("result: {} avg_fps for {} num of images".format(avg_fps, self.image_benchmark_num_images)) - # uncomment following lines to viz image if self.viz_image_cv2: cv2.imshow("img_rgb", img_rgb) cv2.waitKey(1) def image_callback_benchmark_simGetImages(self): self.image_benchmark_num_images += 1 - iter_start_time = time.time() request = [airsim.ImageRequest("front_center", airsim.ImageType.Scene, False, False)] response = self.airsim_client.simGetImages(request) np_arr = np.frombuffer(response[0].image_data_uint8, dtype=np.uint8) img_rgb = np_arr.reshape(response[0].height, response[0].width, -1) - self.image_benchmark_total_time += time.time() - iter_start_time - avg_fps = 1.0 / ((self.image_benchmark_total_time) / float(self.image_benchmark_num_images)) + self.image_benchmark_total_time = time.time() - self.benchmark_start_time + avg_fps = self.image_benchmark_num_images / self.image_benchmark_total_time print("result + {} avg_fps for {} num of images".format(avg_fps, self.image_benchmark_num_images)) - # uncomment following lines to viz image if self.viz_image_cv2: cv2.imshow("img_rgb", img_rgb) cv2.waitKey(1) - if self.save_images: - filename = os.path.join(self.tmp_dir, str(self.image_benchmark_num_images)) - cv2.imwrite(os.path.normpath(filename + '.png'), img_rgb) # write to png def main(args): - baseline_racer = ImageBenchmarker(img_benchmark_type=args.img_benchmark_type, viz_image_cv2=args.viz_image_cv2, - save_images=args.save_images) + image_benchmarker = ImageBenchmarker(img_benchmark_type=args.img_benchmark_type, viz_image_cv2=args.viz_image_cv2) - baseline_racer.start_img_benchmark_thread() + image_benchmarker.start_img_benchmark_thread() time.sleep(30) - baseline_racer.stop_img_benchmark_thread() - baseline_racer.print_benchmark_results() + image_benchmarker.stop_img_benchmark_thread() + image_benchmarker.print_benchmark_results() if __name__ == "__main__": parser = ArgumentParser() parser.add_argument('--img_benchmark_type', type=str, choices=["simGetImage", "simGetImages"], default="simGetImages") parser.add_argument('--enable_viz_image_cv2', dest='viz_image_cv2', action='store_true', default=False) - parser.add_argument('--save_images', dest='save_images', action='store_true', default=False) args = parser.parse_args() main(args) \ No newline at end of file diff --git a/Unreal/Plugins/AirSim/Content/Blueprints/BP_FlyingPawn.uasset b/Unreal/Plugins/AirSim/Content/Blueprints/BP_FlyingPawn.uasset index 41ff672653159a18450e71d97a72579cd89fafe9..0f4b2616d7668aeb476e00f70ac54af5503c344d 100644 GIT binary patch literal 153281 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

~7l@hD4egx6)Uc|7q2y$;5 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�XoSo#P`xlgD0md>{4?xI5k}79uItyFu}}$6j8@n+`NiRqCE+W) z7k$)Uo3@B~-OZNG+Y)TM=4*E?(75-4YaLt3$EM02cMTU2FBkob?L|$;#+|j5qTgQDIC&F}?n+Ro zWUu|S^X+_v3TLsv+H_;h=ks{)r5nZw@!xpD&sVQx#Y1>CM~2RW{^=DVOOb~)_?FSH zvaDx^+3Z;Q`kBquGHs`JBi7hTU63a>QB76aqf-B15W1aD<7Y~e}_4>J5`r( z$lJ!qmq+aDJh_^SQY@31Z8-NP^`O7wy6+zlQN4InXka(*=DT!HMF|ON@mC}j!tN#J z&^IQXPq({bGnwvwT%qXOgL5^?8f!P(^z_KDSZ8#iIh0AeaTwLyzooF_A4xT zb06OQw$-qRwI$5p@}>^=*cZy9M{i>pdsZTYv86XI>DVqS>&qIAI=dt2V~@Yze>H6V zY3s_4K}96JN`4 zPnZ)zU+n97=a5aq`^E%kzWnVMwO_|3%%2z4^unvUeEQh^d+oN%ytdhUI z`5|6MPDyGo`!{Dy_tEm)e6+Sa_C;x>ZTF0*#S?4BE4sEDotxS{>6xPHi*gaM(nqC> zJ$+7Y;#kyWX#PAy*mLdG&OAn`^QYYJo2=cT+G&tipY>2nYzuQ@z`K*(9orJ(%NatA zN4ePghc_t1YFh^D%g}8<{E#JdQ7f0Nv$Djwtj6YtvCf*}VdY))Y&@=pvo6nIIm?sq zC46O9%c#4J`eoBW7&-wh)pQPB?TgXrkYaw}Nq29OiOMn)q;)(it95**#UEN>ELKQ!~tn#!#Zq8D-uM_t^ z*?Ek0>^8i|c=QTs%SCtZb>}J^X$i0<-M=`oyk$&@8WZ(PVlS#9>rijW-6HTyuGs!FB?K%9u*`w_;I)j3=_-08h zj$^uae74TMe3?73sgX12(_+W?1azES^#s>T#Bm&I7*qs%3qB{yf4 zxxPLB;gVTWYSOMvS|N4Uw)oD{OR|)m&(Nk5#kbVa+?K8BidsU>20M}X;O&tKW0f8$ zFXi6arQ8{`E8^_~iyiseiE3lQQd*CF3E$3e#XETQ9>!L@aO3CK8#;Af*$W)1z5o0u zU24#CvBuucLY1roV))6)G9MnBrf>1ef3|AD_QR|u9oNtLFy@jKR|->Gcqbz0VdmS9Ps)JftjQtthScFh6hGZ0Eq<{CRjG+)4I?fRbav z`PKI%^0HIKm|NQJpAW4*JWY}tMd{ovNOCFx$0|NI>^2>@C0t=;ke36CS#?( zPRU-p)77QDSR(FGg)8f%7j8=hMIMYg&3GW{v-PX`oWfhz&x#!8x_)zZriyZ+8QKz< zUX)~3$?XC8En_i*t>%={m!2|H*8}k?WjV#ZHo?ao5Vt@XsX1cYidf;A(R? zZth-@tlFl2*2n4CmQNXRZ@HW}%_SPjHodheJk6ohI=$=_+p+WA=!Lq1GdZ$fjFReU zpT;1n=e+a!*@ppl&wuimTj1Kmb=;Co!YXC0q@J@~j$4XXy_LGb4tgc^k1BSmsT_%o zlXuAliaRQd@k!4rJ8u8!`u!`JZ6^;sqqEM)pIj-|CbL7Ru*t__jOQr{TtjYkbn7!s znm;vCTHrzJr}rE=hMq?yX0K7qTZadb6b^1N$aCe;%wqQ9V-}1Ue!!dlS(a{ z@0VN5T5ilRJ#S-7&k}}EfwxXo+!2u~8$Px&Z*Q2Fa?-mjT~-=((i!jfZ)53snrF)Sy6y$b()@azOUw1wSS!~W7D{-82uRJW^NGN- z$*f*iaiX!rJX$g4&IQ*;v(DcXGM-)$_);X|aS1nT{iF*^7$$LT_gnh$#mDD!_VYhr z{@S#5)$RT4Dl39KV{;d>om`bReeCD^y7dZ1t0H|)N!XOx=}2>B&8^tatF4}sY$P!C z$(T#2zMj`KtE+3mI}+WwuQpAXG})5nP3+!l>w4PmZrd3&NqqcU5ABedtMz8vw;lW< zEdE}qb?R06{MiNd_t^G_=pPQhumALctACTdyGfNMW7*3ywo8-!BO`5m7>+#InEm;{ z#W1<;Y>XSG?WulIb^oOQ#*VzE(2IKv?yQ_M*EmV=_WN@T@0u)>udh5b=BT2DttNnt{S`lZ?XF`JKBDXZ1;e3Dk%zZyi(H_UK zX{}$L>ZlqYP6@Au9h~=Fz2ibUY|V0tSVnRlPz^qNu5Nr z$ywibCy%7HR;2NJ+ul`7kS^J^JaI+V)`007%N!2l**Pufv_G>-)`rUImxWCKno`3O z+nnU;Wl(Zu>Sv`BjQ2}6FFc~fnY-M-Vs}z-quAzI=8M(3-|-37<=mSUdIdeP>G)## z69%Cr`L!30@70@9tH?3$cD%3J@*`)tSFAdr6{&B>Q^wY;A!20pp+tDboT|*D=G!B$ z$f=&W8~eDkeU-73Z+dWSR`$7^<&yg*D389cG)6qr=H6I~-D8ZLXRVe!(kkkak?`o_ z%HaB!#=&PYyIW4*JI5LoH7n6rh5IzigwIl?*F8(soMJmJ*(Qzi%j2qJjl$Qxs1p=b zeY@q+o{NE(3}B!TzmC zv1|>;`?;&c!(-lxig!NMpS@wtR*|0F*X$E(k7O3O-`@1v=C+!uQj2cp)~sb$Zaz@= z3Fcv(`q@6Pav3kqtNuXRB-5&jImP0OmxKvak1t+X;XYrR?sFS=c+#n-Y@=-URn%AC zyZa@0$>qcJ7bc!a+%vXFR&)vKBEq$(%uxTQ5M;H}M%{naW6c%F+X?R<)s-?U)deyQy7QtI*+ zF0ba+(UlelAM8~#R@~J6Db;bmo07=ks_Vh(`&pweT6`-EiTkEoS6`Lx z-&V0VO0X#0yn|`{Cvf1J>6*wqv`|aw4Y-CR`6z`?4|FPv;50;o4>AJYI6KybEf`i#x9Vd~MmY=EGxDZ0t8~WHf1Ar&p4fge*y?86k(#aNu0<^@drC+Pnf%!}D&tLJ>R8X&ovi0RmOhfm zap0_vTW8j?k5>dY;fkTKOWu84T$tba8drMpv+r>YRU16c{L>kqIB^DJ8_>75%GEvlZ~n|h5Q;Yy(I)y`Ufrt9ow?wjUL31m9IWmSHO`lQ004WU-| z##7x($vK>W@C0ud{mmviJIy-T2Y(S+Y>@{_w{&AtEMYtUROTd$JnlcQ4+-J6+7ZD*wH&CVtgb{RZwvnH<~D z!!mp}4TrPi0`K)SZBVXr+p5f{x9v>l@#lBco03%hKX8k5P7a>5*Hkp@w9?i0FT#|2 z(ks2sKRx;Eu;kj#(XZpmSIx}}lU-eT*q>E3dG# zw~v2ZDJoWZS#Nzv*~W0j&zny~PF6YIBfE0r3Xv_Mr|QPM)K}Z_(7)jg-(-$ajd4Lc zUI<#Bna0cLn7uh>27L{SZi>nq+d~PwU&F?nAM?V%cy4Fs*jx6x?qjZ$y1l=txWnqH zaP(_KrY>kF}2|XiTv@VRSxMxJiC< zRdu)ZS`Aa-ak&*H(!AlX%`;xFG=Ib$reON2yMx9P= z9`i7|bKA}-kGkvCEFAR@%DPTp6Xz1l|3&LE*ET!$3$4o^$h%zhuC%qjyo}diiIIxi z9M#SeRtJuV=B!RT$nf=c}~J zEoXHPh+DkSMdDEDMGmmO<(PDkZcn%PcznLYK1@`Cyeb3dG#Z;PufTK+NU zK;X3xm-FWr&fUJNRW-@-+2y;VB-XY`scwj1RE=pUtarO)=94t{!Gd>jp}Xf*`D}Vs zmctagcBAq!1GOC=pQhZ-Tvp+elG1RnUAf$`vi(-z!#Iu0<6j@|Av8*{o60ROQ2p?E z?D&NK9Tc;_iy?2LZlg_m|+QJE}z;q^3!;#+we zYtk>g)<6EFS;FQ*4Ubtg%b~ICDlA*;gS`~&oL3T_-*aOu+b1sE-qm3I!ac&?rnw{6 z??97k=Avw=9_B+Q^cWJa=3CpXyO7TtD52FDJTbNU6n;jhcfs}sPY?Um-D2_rqj+D= zuNCJ0y3*s)%;L+0p86-PK{a>lnps0KAAjjAGTy;laY!^PVAeQuoMQf3rFXTvKHgAa zd62^6)xK#~bB5j0CXpB=pO~(asfAbHHDxbv%kJ5EG{?6|%QZZ+6UqMz)w&x4U}2K5479S}Stom6N@Y<<&+erjTl5Zdtcu><+UTd0IO? zT~i&{3DTZfy=9#p`x0eXJ=Wg|xfCfxhHX3fY*~-wxEaz@GJ5E4Y9ERE9Pzcx^+ClgS543IPc;_;gp3!l zSUJ2_*dXC$Ei`Ibxm`}(wWSx!-RLD!@B8+=Jf!w!lY?m1L&u2|llBG{t&PQ@7u}rN zUt^Zu;+!fVe-*>`kov)1g2xSM|ejP};nS(S&4CF5*NEgP+mGw%DKV`l%V;iyVu z?zz^5Cw#mkY9{yKS-LNL`>Yz+b-iX&vH)M~>4f*07Tb4DWXjro`I?#bJe#`EhqGDb z-f29Xvt;4clDP|9rFd!-?<^D%E4d@IcGCElGo1oGzA&Y1efXiNpiTADDCXIQ)$ZGo z`ZUIJtq}aMq`6pBpjF)PoMpp}y^UT+aXDhT+;~OLjYgJ{wQ^kB?8nb4T|;;AUa~=v zs*LU)PKDV~_tSSt?K6s5$IP~7@#8OUMQO|FE@YpLn?|3VZFc02*f^ZXG1dAlV@1Ve z#4O8u-35-^(pziqdGsqCPOE;qC4=rws}k0UnicIyckqf|s+U~IQulX%F)gt0>bA10 za_yZ75$xCG-BT6H+Z|&zZZDbmG#sC?U&qR)ZN-z4#){Uiuf4aHr}RXux;)x)TBlE? z%Ym+%z;EBq2EP6}-=v#&`);P(7G?=u97_7yMp~H~R-5tYni(A$Xc61Z!_mbH#|n3g zEOngx99`@eS+94&-BiZm0B&f>_cd7%%s6x`vi2ajcxgIWdwSyd(LM1>M8ed@!_m!4 zLfz5B)X`bIzkLx>!x#cf{M-oSu9mD=q-|;B>fvndgqwsK(sy=qA~>VA3AXy^%frsv zhTw_vaX2<~=n`BA9@eOg)bj$A)koF$Wg=uGB>KudCB7qB{JT3#O%WUyYR$;oc`?Dw z$)mBM)2@*Lx-sfnm+ zAJSR`Pa;blU0qN%4mTDZMA~(ntnEE+RNJ5#mNuHfXZ~N zojeIRCb)9cfD+uJ>%G0Bkf`A!gX1Qi{mJ*FTs&$OyW%2W>EhPnTyX^40`#qkbH@4L z>~QWlPhze&&Iq>#<*&gxpj=N>V;s4b3A%GbaFFYbVC`^TG)w8ob$=BH268*ga5iMD zhUQ>=_+5P&BObV*-tdU`Bo6lHj2=Q4D>=syamI^S&l|S{XNz-0Ex4eT@VIGY2tCBV zHHeRnIBg=VJCeW}oIeh0-3q6JTaRkFA};sC_RE2CDg6+Peoopf?qtSj!IK1e&Rd4hMAYiZdbWE*`ln5;c^{FbQGj{yu)p6JdR55qtGQ`iXI;zkf<) z%w*iglh2q0`_C9h2g+}t9rm~Xt2AJ^V49_eT@9UcwpBz%UJU>=w{{sQE>ayV(6 zB9g5J(nC08kuOm~_wq<)a%hB*Lw8aLLKA%}p>HKrJ{Nr}pn7oh+xM^1iQzoZ2lh*A z_)<(7)am6Q)2o9x*Y7t5_GN_wS>n-XPU7mX(t~*kJ*0d7MDN}2B?jhU9*sKglgSwM z;|)}-MK%exCNaSKTOo0lTOCl$w1G$k ztiPY1Q-2c;7!MYpaasd;Hi&uwcWU`qe2kUT*rUS}9S~K4zR)V4PLp?- zHrpZJ4AB%G$4j#g)+))%`XGJgN6`~$M#YctbVIrZ8cmA&_|YuPjTmde41{FId^G#O zJjwS_3}}xt`V5X1@dyKwHc;0REUu72F@h`_PZdxEA&bT&SrkLSw+uQfpb<+Kr-irih)tz3jA z{+PvhA!#`yi^St*{wCb9Il*AY8;EXoS;5aw=PNJBjl zPy1(c5TRl-YCH~$KSl-(u>yRkTPtS&)Y{`Gu1NIvFGjOPEJpa=qYUP?4$(t-621Fu znr&j9K$qxEp z4$ZzuD`NNobA*BMs01;Z=pXC*<85)8En`#wt{TKSl?*X5ltq}sYzsW15;}km9drg? z3I0$M^$Gq`8$rvXGakj1B)RrmG3F%(a=ky6g)z+=X_Y79IyP7AAJqnyg6AWxY2eXv zCoS#4qQ8N?S|JR-Uyp$Hy-*&+MtDR6tycT_G?zI0)Ihv|2pVRl8pP27=BF~~1LZJQ zXc0LEIT}dbz&9y$#v@LW`s)A2^nIi&8 zL1aA;4v)jQMj9{pao^YAr&tH(rSPF{$r#sQ=B|L~2b+*bnkI|RB+XGoErV^yAucH* zUTPCZT`6=m7jX>c`I_hoR)uNxg~b&E{hkDB6=H_|)fAAr#1L&*fczP0T@dVXc$zRh zC(Wg#P;1f%ODTjaP(hkYL9QI42jU8_tT~7ZN;52Kb16BRSYSFslGpdrq9k8=a*O@e ziOpPoZ0!mgV+XFm^>er1eyNp%1q{z$Y(`C6yYYy#v|7XT+8EipFNzeu=M-hVR-)M| zwmJgiAXu6mMf;dXZij>;tb6uze|X=hhg$STaW$+>_D6;Ns~%7atE}Hc3|w2qdiov$ zR#d55DUPBnI;`5=D62e46cHK0_YyR1R4xcvOhU zWswJgF-RKOnkLbMz{m?_uvVyrJO}s>utKPziTY8Y*%vn7>DOS)6G$M>iOpne(JTi1 zh9gBOtJ3UcsK@AEdyyL8F=P>C*oWjXz>g>qDJJF5K^z$BMC^7`-slkY$K@SZ_3=R6SaKz9cZzGz}n9Oa6F&)f4VVs9G6^p~(|$yn)zL z8Xd4A1oItOA5uVf5VdQdd^w_TmPK|Uhdc=Cn;fvtnq@S`yjk2HyvjbrOb1M80zyQMT+A5L=1Xx7Fgr;Q{8GEzbZ%(y{D zFynwZtS>-rz9-YON&K z!esQHE*)xG4YXL$0NQEExEHbyDfBY0C-mj{~#N?|u2)|_C6ALiGfi84q7VeN^uTCaqt zl}6VvGFy@R`v0OKgS8xdvGs`g1ysuubpqC(;OPj`{0Ddh^CVbvf;ASHGr;PDCV~cy zAg$B^zt+&~YpDGKjy5#wQKAfXmIi+QzuGUXK|y>3pYi1LK)OiRm{!XY#~`ptuw&9L z6Fj{F^Hqo&;E5K{c(7lHFTir=qBE=)!YGDEu^FwtsM{~#YEQF1HT#9yFdrKD`A?VH zV9f&>9LW^WmKJIK9{h_A`oQ`EX~z%N6=2l?*7xMl87xT?$p`!scqZ5*1pkCbb2nPj z8fsI3<2su4C{gA_vlga@pk<(K5Yxg~Pg;8=t(|BfZG%w+bQIR}A@+qa9$-LYK{xSe zZaPp8{{PMgz@}VA%s0}02aLI}3j$si9X`oPYF7V>)fcnIi5vARZ2G3!W?-o?pyl2+%SD+TX?2bMd$hXr)gQ9ZG1Hu?jaET}hGe zphTK@Er6_FfLJC&zLzE6%MtI<3(e3OgOw+jDGl_K{8JwP9%zOY&l@nU&c zFA&{fd8D48F4jJ*O90-GhxH-d*9WYUlj=geL85OUmJn-Tp;)YHq4VTIOtgk zNz)o>oG0QVPyo-{exJJu<$vE(KPJQX)KA4ods>AX+}m6t2LLmSJ1~Y}TqH>vJsJ;BI{(L5YYuzN~^n@iMj&_0Nd zvARE^6C_LSx9d%0+n!6b6tMMy8YxueehHSR_8}~1^Xme-I4POGytBl2HwJ03#%vn*Q9p5 za2_a@ClF&efFN=4d+1GlrNG(2Z9()0HA!UmMtV?CY7tW6JH2%KBj`@d%@URMrnWkcZec21~jJSS*LcWy)Akk^t;?Qm2tr z)^8`!5A+1>llTT)!t{SQi%=M$MZk*npRx#8ZN;?uM=b)@Y_YokeHNiWw0BI0{St|Ndmu0?$zVtdIWhj#}V1_W%0m-{qqf`({GJSp=*@!YU!y-|#l^C*u~t0*ju8 z-;1KOTKnG}xd3kAf+-xZf%TX6w?V(W9XEMsKx%by%A09$Ni`*F+o?;bCJH!z<6 zYZ;^+2$DAc{5*GLQ9W=Si(rNyG5(F~|BdT^HLeG31HFcJXnAXF<#%|k{IhWk;QO=D z{eOELLwc_9UvK@h-g*_$3P^kU@H8s+gcb0W6cv8|+#2L#kq%sw*2uA4b&_S0c97vo zI&5a#zncMd`eTog&dtByO@TJBmj6i{`bVsPh7Y7&Q{ef}aN%b>!}oF^t$+S={exe` z)~5d%4nVKi9P^*S0Dc#O&9r}93x6h-|6T`3yFx#!1HaxsX?^FP>mPLRSA5a0a{%-X zi)MaC2cgdI@W}m<(vR!m@4m=5eX%@!SaBY#f$_FUMw>bI0Qz7 z3xW%jFdf0pkOwcZfdp@inS~C1bQlruR`cYdYe=$VA(~GUb8xs|@)?jJCU`s11@iTfLhv0IsTG1S267AFzM-z55|*GF zOg;d=ms|j%xJ14NE@PSiB(UQ`ai35-1adjX3%DKFA1J_iGR!&h8I$`C^8Jt#)&L*? z$%J$wzLp0r;VnkQWI#S+`a6U-P|i&T5+$GePiM%NgWF$%fh;9ofUQ9)Af3>^%90bX z>$}$?&5`OOe=8Yg2vWfRVMSdspmn&!7>2b(RG?|7z-AC2W*~il;M{r9F&!NWgMcw2 z{K@&mS2k&oZ?=)oLge#0^0`kXp=Eb+CU5~#2A*`r1dW3+0|UY`-N`^kB-o+f#^fxF zh`ug?h-2hJtTl`^WkcH`SP&Dwx7i?HZW>9-P!(A`CfxjGYaOM)#uB)qN_jO%FX2}qS%cBB2YK8FDEx--ZP}2fg zK^j~F|58p$m;^E9aUkapIb~V}x!MPYsmHC$sdh~_QO7t2fS^l?d=cSnJ7$YF?I4M=Mxn&nS3*l@Jw>v5GCzFN*X|=RScNunP(s%K6GGid$48U z&@b6Z3Db29Nvf7Li(z`kcJ(;D%=azn!h7e1{xrhqU5LcghcFDt!swWZ4t{h%PzeYN zphFBDv(X`ljydQMM~4JDV5pHq#}AWH;}p<#ukNEktha*ZsMCMcI}8W;fsvdKZaLm5}gJH1NVayAIdmA??BE&+$#Oe z&2cIp-}DMl%A-ecUJe8obV9wt7ap>HKS9tmBtV)L;`{GwowKFSGR_DgSk#1^JI{ye z49){AJqb>Bq)3+$-5E$5x!MxY3kY$zCDtDH1h0XYC=*A#cU`lVVBioF5CkY=L8dY0vks3u{< z@EIS|3CF{U#y%2)ZYg%#)33-eIDE_8e<+m?%cGj@LaZ-@ZmC?A;Oo90|=#HO>nDOi?=VjRjYtqWLX==D~R|wi^-FFLkpe zz9t!4nT0M$K6Id`fy`IGn?eYJ1ZMBNxk}{Y!eZw6;~Dwg%%P*Bd1eAGqsBeSQ>Qrjb^$UV=* zPl1y20Rt}>JXx$0G4tT$Z6{@|X-O5z z0sp~Hi&EZScRpY|gFQVUJe-7b8Q_t|^mXplWYMsO><^3l*A6OW%48G&` zNPU;#h3PY%E%&A)uHlb_X1#H{qNgc}860u8_$GbIOa^EkocGT=A6WKbk)j)gmu^(w zH+hNw)GbaPC~H`${--$~HzW?Kk&oNYL_Vb@=VK3gJkj6!*u0(3R=;m|0yu+3K49SK z?`r4Gt}ZtS>rySqS8xoZl=n|KA6WP+yHT`s+rteykygQv?&^#^XRxOqDM7p6#=KkUWU8~fU_Nf2N$z|gXmH+tqVs{3*i!)$_v?uIYQ(&rc)Vwd z5OFJLBtne*%*WJn@UC7#$NZ^Ym-cr8&4cs)dFKOb(oN?1)%z`u8gA8QpObQ7qASW8 zR!z+S03~ca_2<`oT9Ie)A~lBo^p%vrScz#b`HY1fFhhhibQN|AsenQW57m+%UUxlk zAkxHiU9wS9Hq#1s_gUYqyV8-nnSstzT&D0Cw7$|wXF5`QwA+0?r93tSXYB3e=Iy0L za3a{FIXAI^UicN#SSoAMIICC%=?dF+|G zJH~sYiU~fiA1GFARHYQ7P|9OK2rTk&bt4hji|%m5CmqQfWN;79>B5;(8rU_Z@_~7M z3-gqsIsl|4R>1#knmyn4+)Y{$>ZWEH6-x<}^1vDV!lodg0?#N>OFu+2)(AD)ApiHN z>mhP?zo4#ah2ZJ3!wR7G2k#<4@3hnv@So&X&18}tV-RvDd}VN#?{Z3c|GVm% z25dy>PpRuqdDvIENA{Lo`=)k|FIu&n%Pf_Wx>DMZqLeq#!w#dezum)v$`0Px14h$Q zS)ifrqKv|$lZy>Qm^us0Y$hsD%KP6{*`2^flzu^F7Y!E_sG+uh*u!e1xo|cqR_i6= zLg#idl%JubvXmZgpp=Js*kJ;K-yXw4Krr}$5R^qzT>*dTrSZOHDxVkZn`vlX`eE}W zN_qdg>Y4#;MCljQ)eVi&RAX4RpNU~J%v~26j6bb;l24>1SZR(sC3U5=>qaSWpog7H zB()d5|9A`wn-PO|G>IKU=WszK0Szq*Ay);Migi-1&U_G|O-Dy5?|)Zi`#L4wCbRm9PQKG>dhP=JEJ`X%X&aSN9_C?(QPQp`KPsOkwyDnxjPl`4O&3rEYP&;84 zC3S^(bnw<9rM!V2mPF*=@vyM4HF%2_Wzkewpkcnrf&;B5_N#~2l-99cN!O*6_y0|0 z2g(pu?O|074b8-#GoTak@p~^1ZvuM#B`J+XCnIYgN3^?#7I=toVD8%FVxXT04~5^ zbh7sJBzQ{bT00YTJkZyASC4fP>NZ}k9^wwTVlreUKn`rlli1R1KC~Ig=jLQ>L*Vmr z<@0p2Uhl$ZgFQ>^$!G0i%V+D#=Zc^__&f<--frT|YA&u`1U@6w6Q8#y!Isa_g-_Fi zfHp+?{s@B4&fA5EFSDAPHA0Dxlnh;Mh>RuQ@-0DKJCXBHvjah~MYe&U9^{2L82r(; z3_372fx&4I>>XVeIa&Mt1am;1+CJ!SE%?@>U!edy{P@;Dd!BrDt{#X*j))UPh9W?c zAmxZxq@Orz5$vqJok)xLAmo3`{yblR&%^QhN9-J6skH@aMy+i0FlAuM)apSvL#+&! z=BSmy9vHQ+ts9-StGswUs`hkz8n&{uS(3ujI^T^N`bu-ELSXVd*m{ifBjt)(9 zXrV(J9YBN{IyBG$jr=gXK8DYfDu=a8 zh|T}9EH9=T>f^?CXq@U5kBThlYN1M{)o-J6%HOBbE85ELLd7Ai)R_~-yV!&tQ>D`4 zw^7OS_o+NR>C||~6-@eDx837kJm>X&s#LE2ZB)Xa*ZgIToj*g*eD_WV?Q{Oh&nxZH zo2XLB@gr0Y8$=oYeJU$5dTZ}>1!$gXxpiG(0eb{hD&u||l?H#G%H*n=)SgQX`aAcn z%V2x1T||}2oxhDrSn2-D8ar{z{3kEp9#%_}wXZUNf9(!cDkFazl?(npmAAHg7-pJY z)eK3r`Fv7z0}oXyqbX3CLe9e`8N@%uLU~x|O5D(a|4>vyhcY_mqXTAyZ0LZ5RfIA~ zeHCE|6)IAjp$u+N4Z&hF7MMIi!W!$FCcuxd2L`BTiC`1}Z=o<8Vi!oFq*LEFp7_Ud zaC?rN=TAPvE(*m2R71i5Va`TO>g2O9`8>2QjH81~aJX=Cogq}-M#y7SVrMcejw;2q zsM2OK6ebi5O{@pvI{7mMh&`P@6saU~6Buhou*O({m{6f!T~#&z_aocz+mS6n$d>#W WWd96j{}8f&hO-papd>^z<^KSmJl?PX literal 150741 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 rqxDX)ZfQx$_+O9g{a=o3E Date: Mon, 8 Jun 2020 22:50:44 +0530 Subject: [PATCH 29/29] Add image_type option to benchmark script --- .../computer_vision/image_benchmarker.py | 32 ++++++++++++++----- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/PythonClient/computer_vision/image_benchmarker.py b/PythonClient/computer_vision/image_benchmarker.py index b32ea05e5d..671f6d613b 100644 --- a/PythonClient/computer_vision/image_benchmarker.py +++ b/PythonClient/computer_vision/image_benchmarker.py @@ -7,10 +7,20 @@ import tempfile import os +cameraTypeMap = { + "depth": airsim.ImageType.DepthVis, + "segmentation": airsim.ImageType.Segmentation, + "seg": airsim.ImageType.Segmentation, + "scene": airsim.ImageType.Scene, + "disparity": airsim.ImageType.DisparityNormalized, + "normals": airsim.ImageType.SurfaceNormals +} + class ImageBenchmarker(): def __init__(self, img_benchmark_type = 'simGetImages', - viz_image_cv2 = False): + viz_image_cv2 = False, + img_type = "scene"): self.airsim_client = airsim.VehicleClient() self.airsim_client.confirmConnection() self.image_benchmark_num_images = 0 @@ -18,6 +28,8 @@ def __init__(self, self.image_callback_thread = None self.viz_image_cv2 = viz_image_cv2 + self.img_type = cameraTypeMap[img_type] + if img_benchmark_type == "simGetImage": self.image_callback_thread = threading.Thread(target=self.repeat_timer_img, args=(self.image_callback_benchmark_simGetImage, 0.001)) if img_benchmark_type == "simGetImages": @@ -49,31 +61,34 @@ def print_benchmark_results(self): def image_callback_benchmark_simGetImage(self): self.image_benchmark_num_images += 1 - image = self.airsim_client.simGetImage("front_center", airsim.ImageType.Scene) + image = self.airsim_client.simGetImage("front_center", self.img_type) np_arr = np.frombuffer(image, dtype=np.uint8) - img_rgb = np_arr.reshape(240, 512, 4) + img = np_arr.reshape(240, 512, 4) + self.image_benchmark_total_time = time.time() - self.benchmark_start_time avg_fps = self.image_benchmark_num_images / self.image_benchmark_total_time print("result: {} avg_fps for {} num of images".format(avg_fps, self.image_benchmark_num_images)) if self.viz_image_cv2: - cv2.imshow("img_rgb", img_rgb) + cv2.imshow("img", img) cv2.waitKey(1) def image_callback_benchmark_simGetImages(self): self.image_benchmark_num_images += 1 - request = [airsim.ImageRequest("front_center", airsim.ImageType.Scene, False, False)] + request = [airsim.ImageRequest("front_center", self.img_type, False, False)] response = self.airsim_client.simGetImages(request) np_arr = np.frombuffer(response[0].image_data_uint8, dtype=np.uint8) - img_rgb = np_arr.reshape(response[0].height, response[0].width, -1) + img = np_arr.reshape(response[0].height, response[0].width, -1) + self.image_benchmark_total_time = time.time() - self.benchmark_start_time avg_fps = self.image_benchmark_num_images / self.image_benchmark_total_time print("result + {} avg_fps for {} num of images".format(avg_fps, self.image_benchmark_num_images)) if self.viz_image_cv2: - cv2.imshow("img_rgb", img_rgb) + cv2.imshow("img", img) cv2.waitKey(1) def main(args): - image_benchmarker = ImageBenchmarker(img_benchmark_type=args.img_benchmark_type, viz_image_cv2=args.viz_image_cv2) + image_benchmarker = ImageBenchmarker(img_benchmark_type=args.img_benchmark_type, viz_image_cv2=args.viz_image_cv2, + img_type=args.img_type) image_benchmarker.start_img_benchmark_thread() time.sleep(30) @@ -84,6 +99,7 @@ def main(args): parser = ArgumentParser() parser.add_argument('--img_benchmark_type', type=str, choices=["simGetImage", "simGetImages"], default="simGetImages") parser.add_argument('--enable_viz_image_cv2', dest='viz_image_cv2', action='store_true', default=False) + parser.add_argument('--img_type', type=str, choices=cameraTypeMap.keys(), default="scene") args = parser.parse_args() main(args) \ No newline at end of file