Boat导入问题——UnknownError while spawning the actor(已解决√)

文章详细描述了在使用CarlaUE4时,跟踪和解决spawn_actor指令引发的问题,包括代码追踪、错误日志分析和函数调用链,最终定位到ActorDispatcher中的Actor创建失败原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,spawn_actor指令是在carla/PythonAPI/carla/source/libcarla/World.cpp——L281中传送给Python端的。

L202 的 “CityObjectLabel”是否要改?cr::CityObjectLabel 对应carla/Libcarla/source/carla/rpc中的ObjectLabel.h

spawn_actor放的blueprint是cc::ActorBlueprint

找到cc::World.h里的L109

SharedPtr<Actor> SpawnActor(
        const ActorBlueprint &blueprint,
        const geom::Transform &transform,
        Actor *parent = nullptr,
        rpc::AttachmentType attachment_type = rpc::AttachmentType::Rigid);

到cr::Actor.h  得知SpawnActor返回的是指向Actor类的指针

Actor更详细的信息到cr::ActorDescription.h

但发现cc::World中的SpawnActor不是其定义,还是调用了别的所以继续找


另一路径:从cc::World.h到cc::detail::EpisodeProxy.cpp到Simulator.h和cpp

Simulator.cpp的L315

  SharedPtr<Actor> Simulator::SpawnActor(
      const ActorBlueprint &blueprint,
      const geom::Transform &transform,
      Actor *parent,
      rpc::AttachmentType attachment_type,
      GarbageCollectionPolicy gc) {
    rpc::Actor actor;
    if (parent != nullptr) {
      actor = _client.SpawnActorWithParent(
          blueprint.MakeActorDescription(),
          transform,
          parent->GetId(),
          attachment_type);
    } else {
      actor = _client.SpawnActor(
          blueprint.MakeActorDescription(),
          transform);
    }
    # DUBUG_ASSERT是一个调试断,如果后面为空指针,则会引发一个错误,追究报错是否是在这里产生?结合DEBUG_ASSERT源码及习惯,基本可排除
    DEBUG_ASSERT(_episode != nullptr);
    _episode->RegisterActor(actor);
    const auto gca = (gc == GarbageCollectionPolicy::Inherit ? _gc_policy : gc);
    auto result = ActorFactory::MakeActor(GetCurrentEpisode(), actor, gca);
    log_debug(
        result->GetDisplayId(),
        "created",
        gca == GarbageCollectionPolicy::Enabled ? "with" : "without",
        "garbage collection");
    return result;
  }

可以看到有三个与spawn actor相关的代码,逐个排查:

①actor = _client.SpawnActor(
          blueprint.MakeActorDescription(),
          transform)

②_episode->RegisterActor(actor);

③auto result = ActorFactory::MakeActor(GetCurrentEpisode(), actor, gca);


现排查①,找到cc::detail::Client.h和cpp,在Client.cpp文件中有:

rpc::Actor Client::SpawnActor(
      const rpc::ActorDescription &description,
      const geom::Transform &transform) {
    return _pimpl->CallAndWait<rpc::Actor>("spawn_actor", description, tr
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值