Bone Transformation Mismatch Fix

Carrying over the changes from UE4
This commit is contained in:
Jorge Virgos 2025-02-07 12:42:29 +01:00 committed by Blyron
parent 42f9fea5fe
commit 5d7245aa2b
10 changed files with 72 additions and 0 deletions

View File

@ -103,6 +103,10 @@ namespace client {
return GetEpisode().Lock()->GetVehicleLightState(*this).GetLightStateEnum();
}
std::vector<geom::Transform> Vehicle::GetVehicleBoneWorldTransforms() const {
return GetEpisode().Lock()->GetVehicleBoneWorldTransforms(*this);
}
float Vehicle::GetSpeedLimit() const {
return GetEpisode().Lock()->GetActorSnapshot(*this).state.vehicle_data.speed_limit;
}

View File

@ -106,6 +106,8 @@ namespace client {
/// received in the last tick.
float GetSpeedLimit() const;
std::vector<geom::Transform> GetVehicleBoneWorldTransforms() const;
/// Return the state of the traffic light currently affecting this vehicle.
///
/// @return Green If no traffic light is affecting the vehicle.

View File

@ -559,6 +559,11 @@ namespace detail {
return _pimpl->CallAndWait<std::vector<std::pair<carla::ActorId, uint32_t>>>("get_vehicle_light_states");
}
std::vector<geom::Transform> Client::GetVehicleBoneWorldTransforms(rpc::ActorId actor) {
using return_t = std::vector<geom::Transform>;
return _pimpl->CallAndWait<return_t>("get_vehicle_bone_world_transforms", actor);
}
std::vector<ActorId> Client::GetGroupTrafficLights(rpc::ActorId traffic_light) {
using return_t = std::vector<ActorId>;
return _pimpl->CallAndWait<return_t>("get_group_traffic_lights", traffic_light);

View File

@ -166,6 +166,8 @@ namespace detail {
rpc::VehiclePhysicsControl GetVehiclePhysicsControl(rpc::ActorId vehicle) const;
rpc::VehicleLightState GetVehicleLightState(rpc::ActorId vehicle) const;
std::vector<geom::Transform> GetVehicleBoneWorldTransforms(rpc::ActorId actor);
void ApplyPhysicsControlToVehicle(
rpc::ActorId vehicle,

View File

@ -14,6 +14,8 @@
#include <exception>
class FPoseSnapShot;
namespace carla {
namespace client {
namespace detail {

View File

@ -271,6 +271,10 @@ namespace detail {
return _client.GetVehicleLightState(vehicle.GetId());
}
std::vector<geom::Transform> GetVehicleBoneWorldTransforms(const Vehicle &vehicle) {
return _client.GetVehicleBoneWorldTransforms(vehicle.GetId());
}
/// Returns all the BBs of all the elements of the level
std::vector<geom::BoundingBox> GetLevelBBs(uint8_t queried_tag) const {
return _client.GetLevelBBs(queried_tag);

View File

@ -196,6 +196,7 @@ void export_actor() {
.def("use_carsim_road", &cc::Vehicle::UseCarSimRoad, (arg("enabled")))
.def("enable_chrono_physics", &cc::Vehicle::EnableChronoPhysics, (arg("max_substeps")=30, arg("max_substep_delta_time")=0.002, arg("vehicle_json")="", arg("powetrain_json")="", arg("tire_json")="", arg("base_json_path")=""))
.def("get_failure_state", &cc::Vehicle::GetFailureState)
.def("get_vehicle_bone_world_transforms", &cc::Vehicle::GetVehicleBoneWorldTransforms)
.def(self_ns::str(self_ns::self))
;

View File

@ -69,6 +69,7 @@
#include "EngineUtils.h"
#include "GameFramework/CharacterMovementComponent.h"
#include "Misc/FileHelper.h"
#include "Animation/PoseSnapshot.h"
#include <util/ue-header-guard-end.h>
#include <vector>
@ -1645,6 +1646,25 @@ BIND_SYNC(is_sensor_enabled_for_ros) << [this](carla::streaming::detail::stream_
return R<void>::Success();
};
BIND_SYNC(get_vehicle_bone_world_transforms) << [this](
cr::ActorId ActorId) -> R<std::vector<cr::Transform>>
{
REQUIRE_CARLA_EPISODE();
FCarlaActor* CarlaActor = Episode->FindCarlaActor(ActorId);
if (!CarlaActor)
{
return RespondError(
"get_vehicle_bone_world_transforms",
ECarlaServerResponse::ActorNotFound,
" Actor Id: " + FString::FromInt(ActorId));
}
else
{
ACarlaWheeledVehicle* CarlaVehicle = Cast<ACarlaWheeledVehicle>(CarlaActor->GetActor());
return MakeVectorFromTArray<cr::Transform>(CarlaVehicle->GetWorldTransformedPose().LocalTransforms);
}
};
// ~~ Apply control ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
BIND_SYNC(apply_control_to_vehicle) << [this](

View File

@ -163,6 +163,20 @@ void ACarlaWheeledVehicle::BeginPlay()
AddReferenceToManager();
}
void ACarlaWheeledVehicle::TickActor(float DeltaTime, enum ELevelTick TickType, FActorTickFunction& ThisTickFunction){
Super::TickActor(DeltaTime, TickType, ThisTickFunction);
FPoseSnapshot pose;
GetMesh()->SnapshotPose(pose);
for(FTransform &transform : pose.LocalTransforms)
{
transform *= GetMesh()->GetComponentTransform();
}
WorldTransformedPose = pose;
}
bool ACarlaWheeledVehicle::IsInVehicleRange(const FVector& Location) const
{
TRACE_CPUPROFILER_EVENT_SCOPE(ACarlaWheeledVehicle::IsInVehicleRange);
@ -978,3 +992,16 @@ void ACarlaWheeledVehicle::SetPhysicsConstraintAngle(
Component->ConstraintInstance.AngularRotationOffset = NewAngle;
}
FPoseSnapshot ACarlaWheeledVehicle::GetWorldTransformedPose()
{
if(WorldTransformedPose.bIsValid == false)
{
SetActorTickEnabled(true);
GetMesh()->SnapshotPose(WorldTransformedPose);
for(FTransform &transform : WorldTransformedPose.LocalTransforms)
{
transform *= GetMesh()->GetComponentTransform();
}
}
return WorldTransformedPose;
}

View File

@ -304,6 +304,7 @@ public:
protected:
virtual void BeginPlay() override;
virtual void TickActor(float DeltaTime, enum ELevelTick TickType, FActorTickFunction& ThisTickFunction) override;
virtual void EndPlay(const EEndPlayReason::Type EndPlayReason);
UFUNCTION(BlueprintImplementableEvent)
@ -410,6 +411,9 @@ public:
virtual FVector GetVelocity() const override;
UFUNCTION()
FPoseSnapshot GetWorldTransformedPose();
//-----CARSIM--------------------------------
UPROPERTY(Category="CARLA Wheeled Vehicle", EditAnywhere)
float CarSimOriginOffset = 150.f;
@ -465,6 +469,7 @@ private:
public:
float SpeedAnim { 0.0f };
float RotationAnim { 0.0f };
FPoseSnapshot WorldTransformedPose;
UFUNCTION(Category = "CARLA Wheeled Vehicle", BlueprintCallable)
float GetSpeedAnim() const { return SpeedAnim; }