From bf58329dc443d396c13deae4f8335873446a98d2 Mon Sep 17 00:00:00 2001 From: JB Briant Date: Tue, 6 May 2025 19:13:41 +0700 Subject: [PATCH] FT - Primitive WebSocket Actuators Control + Optionally allow remote control of the robot + Direct set of actuators, this should pass by the layer controler for proper interpolation --- .../Levels/kitchenLevel/kitchenLevel1.umap | Bin 154913 -> 155104 bytes .../PilotComponent/RobotPilotComponent.cpp | 4 ++++ .../RobotPilotSO100Component.cpp | 10 ++++++++++ .../LuckyWorldV2/Private/Robot/RobotPawn.cpp | 17 +++++++++++++++++ .../PilotComponent/RobotPilotComponent.h | 5 +++++ .../PilotComponent/RobotPilotSO100Component.h | 3 +++ Source/LuckyWorldV2/Public/Robot/RobotPawn.h | 2 ++ 7 files changed, 41 insertions(+) diff --git a/Content/Levels/kitchenLevel/kitchenLevel1.umap b/Content/Levels/kitchenLevel/kitchenLevel1.umap index 62a4b7f5a8e9fd638702162becebdaa5332abcb0..471da775335e40763ea5edbe8bcc13ae82739bd1 100644 GIT binary patch delta 32318 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 z-#|fHFRpk&iD4j%>pXRobotActor->GetActorRotation().Quaternion().GetRightVector(), DirectionToTarget) > 0.f; } +void URobotPilotSO100Component::ReceiveRemoteCommand(const FRemoteControlPayload& RemoteRobotPayload) +{ + for (const auto& [ActuatorName, ActuatorValue] : RemoteRobotPayload.Commands) + { + // Will print an error message if it doesn't exists + RobotOwner->PhysicsSceneProxy->SetActuatorValue(ActuatorName, ActuatorValue); + } +} void URobotPilotSO100Component::PrintCurrentActuators() const { diff --git a/Source/LuckyWorldV2/Private/Robot/RobotPawn.cpp b/Source/LuckyWorldV2/Private/Robot/RobotPawn.cpp index 8335967b..587adb17 100644 --- a/Source/LuckyWorldV2/Private/Robot/RobotPawn.cpp +++ b/Source/LuckyWorldV2/Private/Robot/RobotPawn.cpp @@ -1,5 +1,6 @@ #include "Robot/RobotPawn.h" +#include "LuckyDataTransferSubsystem.h" #include "LuckySensorPawnBase.h" #include "Kismet/GameplayStatics.h" #include "Kismet/KismetMathLibrary.h" @@ -69,3 +70,19 @@ void ARobotPawn::InitPilotComponent() } } +void ARobotPawn::EnableRemoteControl() +{ + // Get subsystem + if (ULuckyDataTransferSubsystem* DataTransfer = GetWorld()->GetSubsystem()) + { + // Connect first if necessary + if (!DataTransfer->Socket->IsConnected()) + { + DataTransfer->ConnectToWebsocket("ws://127.0.0.1:3000", ""); + } + + // TODO Should we wait for connection to be successful before binding OnCommandReady? + DataTransfer->OnCommandReady.AddDynamic(this->RobotPilotComponent, &URobotPilotComponent::ReceiveRemoteCommand); + } +} + diff --git a/Source/LuckyWorldV2/Public/Robot/PilotComponent/RobotPilotComponent.h b/Source/LuckyWorldV2/Public/Robot/PilotComponent/RobotPilotComponent.h index 4b610192..b1b82568 100644 --- a/Source/LuckyWorldV2/Public/Robot/PilotComponent/RobotPilotComponent.h +++ b/Source/LuckyWorldV2/Public/Robot/PilotComponent/RobotPilotComponent.h @@ -2,6 +2,8 @@ #include "CoreMinimal.h" #include "RobotPilotComponent.generated.h" +struct FRemoteControlPayload; + USTRUCT(BlueprintType) struct FRobotActuators { @@ -33,6 +35,9 @@ public: UFUNCTION(BlueprintCallable) virtual void SetRobotTarget(const FTransform& TargetTransformIn); virtual void SetRobotCurrentRewardZone(const FTransform& RewardTransformIn); + + UFUNCTION() + virtual void ReceiveRemoteCommand(const FRemoteControlPayload& RemoteRobotPayload); protected: // Child class need access diff --git a/Source/LuckyWorldV2/Public/Robot/PilotComponent/RobotPilotSO100Component.h b/Source/LuckyWorldV2/Public/Robot/PilotComponent/RobotPilotSO100Component.h index 14ae6c7c..768f7e47 100644 --- a/Source/LuckyWorldV2/Public/Robot/PilotComponent/RobotPilotSO100Component.h +++ b/Source/LuckyWorldV2/Public/Robot/PilotComponent/RobotPilotSO100Component.h @@ -3,6 +3,8 @@ #include "Robot/PilotComponent/RobotPilotComponent.h" #include "RobotPilotSO100Component.generated.h" +struct FRemoteControlPayload; + USTRUCT(BlueprintType) struct FSo100Actuators { @@ -42,6 +44,7 @@ public: virtual void SetRobotTarget(const FTransform& TargetTransformIn) override; virtual void SetRobotCurrentRewardZone(const FTransform& RewardTransformIn) override; + virtual void ReceiveRemoteCommand(const FRemoteControlPayload& RemoteRobotPayload) override; private: diff --git a/Source/LuckyWorldV2/Public/Robot/RobotPawn.h b/Source/LuckyWorldV2/Public/Robot/RobotPawn.h index 1d1df691..e2bd9240 100644 --- a/Source/LuckyWorldV2/Public/Robot/RobotPawn.h +++ b/Source/LuckyWorldV2/Public/Robot/RobotPawn.h @@ -40,4 +40,6 @@ public: URobotPilotComponent* RobotPilotComponent = nullptr; UFUNCTION(BlueprintCallable) void InitPilotComponent(); // This should have Robot type as parameter? + + void EnableRemoteControl(); };