在这里,我们假定读者已经安装并对整体框架有了一定掌握,请参考下文安装配置和理解:
UE4中使用自动驾驶模拟——Carla
在添加自定义PythonAPI之前,考虑在客户端需要用户输入一些什么数据,这里以最常用的数据为例。
这里示例添加传transfrom参数从Client端也就是Python给到Server端的UE4,请严格按照步骤:
在carlaue096\PythonAPI\carla\source\libcarla下的actor.cpp中添加想要定义的函数名称set_ctrl,这个名称是后续在py中添加使用的名称,这里是连接c++和python的中介。
.def("set_ctrl", &cc::Actor::SetCtrl, (arg("transform")))
这时切换到LibCarla\source\carla\文件夹 ,这里是对具体函数库的控制写法。
在LibCarla\source\carla\client\Actor.cpp中↓
void Actor::SetCtrl(const geom::Transform &transform) {
GetEpisode().Lock()->SetActorCtrl(*this, transform);
}
声明LibCarla\source\carla\client\Actor.h↓
void SetCtrl(const geom::Transform &transform);
LibCarla\source\carla\client\detail\Simulator.h
void SetActorCtrl(const Actor &actor, const geom::Transform &transform) {
_client.SetActorCtrl(actor.GetId(), transform);
}
客户端响应LibCarla\source\carla\client\detail\Client.h
void SetActorCtrl(
rpc::ActorId actor,
const geom::Transform &transform);
LibCarla\source\carla\client\detail\Client.cpp
void Client::SetActorCtrl(rpc::ActorId actor, const geom::Transform &transform) {
_pimpl->AsyncCall("set_actor_ctrl", actor, transform);
}
这时改完了库,执行make LibCarla,make PythonAPI
接下来改UE中Carla Plugins
Unreal\CarlaUE4\Plugins\Carla\Source\Carla\Server\CarlaServer.cpp
BIND_SYNC(set_actor_ctrl) << [this](
cr::ActorId ActorId,
cr::Transform Transform) -> R<void>
{
REQUIRE_CARLA_EPISODE();
auto Vehicle = Cast<ACarlaWheeledVehicle>(ActorView.GetActor());
Vehicle->SetAutoCtrl(Transform);
return R<void>::Success();
};
Unreal\CarlaUE4\Plugins\Carla\Source\Carla\Vehicle\CarlaWheeledVehicle.h
这里创建自定义事件Event_SetCtrl,这样可以灵活在蓝图中调用
UFUNCTION(BlueprintImplementableEvent, Category = "Vehicle")
void Event_SetCtrl(const FTransform& NewRelativeTransform);
UFUNCTION(Category = "Vehicle", BlueprintCallable)
void SetAutoCtrl(const FTransform& Transform, bool KeepState = false)
{
Event_SetCtrl(Transform);
}
记得编译vs。
打开项目,在对应类的蓝图中可以拆分transfrom的结点,灵活调用需要的参数
接下来改python
加入你想要修改的位置,改完后直接运行python即可
test = carla.Transform()
test.location.x = -40600
test.location.y = -47600
test.location.z = 250
world.player.set_ctrl(test)