Location of a mesh change even though I only update the value of rotation

In my project, I got a main mesh, and several other sub mesh which is setting as the child of main mesh.
Also, I have an UDP receiver to receive the new location of the main mesh and rotation of of the sub mesh. Once the data is received, I call on the callback function and update the location of main mesh and rotation of sub mesh.
For this part, dynamic multicast delegate is used in UDP receiver.

However, when I update the rotation value of the sub mesh by using the function “AddRelativeRotation” or “SetRelativeRotation”, the location value of the sub mesh also updated as the same time.
It made the sub mesh goes away from the main mesh.

Below is part of my code:

DroneBase.h

UCLASS()
class PAI0076_DRONE_API ADroneBase : public AActor
{
	GENERATED_BODY()

	bool AllowUDPCommunication;
	TQueue<FDroneRecvData> RecvQueue;
	FTimerHandle RecvUDPHandle;
	static const float UPDATE_RATE;
public:	
	UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Drone")
		TArray<UStaticMeshComponent*> PropellerArray;
	UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Drone")
		FVector StartLocation;

	UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category = "Drone")
	UDroneUDPComponent* DroneUDPComponent;

	// Sets default values for this actor's properties
	ADroneBase();

	// Called when the game starts or when spawned
	virtual void BeginPlay() override;
	virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;
	
	// Called every frame
	virtual void Tick( float DeltaSeconds ) override;

	UFUNCTION(BlueprintCallable, category = "Drone")
	void OnUDPRecvDataReceive(FDroneRecvData RecvData);

	UFUNCTION(BlueprintCallable, category = "Drone")
	void UpdatePosture(FRotator Rotator);

	UFUNCTION(BlueprintCallable, category = "Drone")
	void UpdateLocation(FVector Location);

	UFUNCTION(BlueprintCallable, category = "Drone")
	void UpdatePropeller(TArray<float> Propeller);

	UFUNCTION(BlueprintCallable, category = "Drone")
	void UpdateDrone();
};

DroneBase.cpp

const float ADroneBase::UPDATE_RATE = 0.0167f;

// Sets default values
ADroneBase::ADroneBase()
{
 	// Set this actor to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

	StartLocation = FVector(0.0f, 0.0f, 0.0f);
	PropellerArray.Empty();

	DroneUDPComponent = CreateDefaultSubobject<UDroneUDPComponent>(TEXT("DroneUDPComponent"));
	if (DroneUDPComponent) {
		this->AddOwnedComponent(DroneUDPComponent);
	}
}

// Called when the game starts or when spawned
void ADroneBase::BeginPlay()
{
	
	Super::BeginPlay();

	UDroneFunctionLibrary::ExecuteMiniSv();

	RecvQueue.Empty();
	DroneUDPComponent->OnDataReceived.AddUniqueDynamic(this, &ADroneBase::OnUDPRecvDataReceive);
	DroneUDPComponent->Connect();

	const auto World = this->GetWorld();
	World->GetTimerManager().SetTimer(RecvUDPHandle, this, &ADroneBase::UpdateDrone, UPDATE_RATE, true);
}

void ADroneBase::EndPlay(const EEndPlayReason::Type EndPlayReason)
{
	Super::EndPlay(EndPlayReason);

	DroneUDPComponent->Close();
	UDroneFunctionLibrary::TerminateMiniSv();
}

// Called every frame
void ADroneBase::Tick( float DeltaTime )
{
	Super::Tick( DeltaTime );
}

void ADroneBase::OnUDPRecvDataReceive(FDroneRecvData RecvData) {
	RecvQueue.Enqueue(RecvData);
}

void ADroneBase::UpdatePosture(FRotator Rotator) {
	this->SetActorRotation(Rotator);
}

void ADroneBase::UpdateLocation(FVector Location) {
	FVector LocationInCM = Location * 100.0f + StartLocation;

	this->SetActorLocation(LocationInCM);
}

void ADroneBase::UpdatePropeller(TArray<float> Propeller) {
	for (int i = 0; i < PropellerArray.Num(); i++) {
		FRotator currentRotator = PropellerArray[i]->RelativeRotation;

		float rps = Propeller[i] / 60.0f; //Rotate Per Second
		float dps = 360.0 * rps; //Degree Rotate Per Second
		float dpr = dps * UPDATE_RATE; //Degree Rotate Per Update Rate

		FRotator newRotator = FRotator(currentRotator.Pitch, currentRotator.Yaw + dpr, currentRotator.Roll);

		PropellerArray[i]->AddRelativeRotation(FRotator(0.0f, dpr, 0.0f));
	}
}

void ADroneBase::UpdateDrone() {
	if (RecvQueue.IsEmpty())
	{
		return;
	}

	while (!RecvQueue.IsEmpty())
	{
		FDroneRecvData RecvData;
		RecvQueue.Dequeue(RecvData);

		if (RecvData.PacketID == 1) {
			UpdateLocation(RecvData.Location);
			UpdatePosture(RecvData.Rotator);
			UpdatePropeller(RecvData.Propeller);
		}
	}
}