Advertisement

unit自动驾驶怎么使用_自动驾驶仿真工具之CARLA使用小结

阅读量:
ae1f68028f8eec07285d55f47a15c477.png

过去一个月多一点时间里接触到了CARLA系统,并且主要完成了让车辆沿着预先设定的路线行驶的任务。为了检验我的决策规划算法的有效性,在此阶段我们暂不探讨与决策相关的部分,并重点介绍如何将这些轨迹导入到CARLA模拟环境中进行验证。

我采取的方法是将决策规划模块生成的轨迹以ROS Message的形式打包上传至服务器端,并基于CARLA/PythonAPI/examples/automatic_control.py创建一个订阅该主题的节点。随后,在固定时间间隔内将生成的轨迹定期传输至CARLA服务器端进行处理。在服务器端上设置了AWheeledVehicleAIController并与其自动驾驶功能相匹配,在类中设置了SetFixedRoute()函数以规划车辆行驶路线。然而,在PythonAPI中并未提供这一功能支持,默认情况下无法直接使用此功能进行车辆路径规划设置,默认情况下无法直接使用此功能进行车辆路径规划设置,默认情况下无法直接使用这一功能进行车辆路径规划设置,默认情况下无法直接使用这一功能进行车辆路径规划设置,默认情况下无法直接使用这一功能进行车辆路径规划设置,默认情况下无法直接使用这一功能进行车辆路径规划设置,默认情况下无法直接使用这一功能进行车辆路径规划设置,默认情况下无法直接使用这一功能进行车辆路径规划设置,默认情况下无法直接使用这一功能进行车辆路径规划设置,默认情况下无法直接使用这一功能进行车辆路径规划设置,默认情况下无法直接使用这一功能进行车辆路径规划设置

在AWheeledVehicleAIController或其他指定位置中实现SetAutopilot(bool Enable)函数的具体行为描述为:该函数将确保在指定位置中正确设置自动驾驶功能的状态。

2. 在CarlaServer.cpp中:

复制代码
 BIND_SYNC(set_actor_autopilot) << [this](

    
       cr::ActorId ActorId,
    
       bool bEnabled) -> R<void>
    
   {
    
     REQUIRE_CARLA_EPISODE();
    
     auto ActorView = Episode->FindActor(ActorId);
    
     if (!ActorView.IsValid())
    
     {
    
       RESPOND_ERROR("unable to set autopilot: actor not found");
    
     }
    
     auto Vehicle = Cast<ACarlaWheeledVehicle>(ActorView.GetActor());
    
     if (Vehicle == nullptr)
    
     {
    
       RESPOND_ERROR("unable to set autopilot: actor does not support autopilot");
    
     }
    
     auto Controller = Cast<AWheeledVehicleAIController>(Vehicle->GetController());
    
     if (Controller == nullptr)
    
     {
    
       RESPOND_ERROR("unable to set autopilot: vehicle controller does not support autopilot");
    
     }
    
     Controller->SetAutopilot(bEnabled);
    
     return R<void>::Success();
    
   };
    
    
    
    
    AI写代码

3. 在Client.cpp中

复制代码
 void Client::SetActorAutopilot(rpc::ActorId vehicle, const bool enabled) {

    
     _pimpl->AsyncCall("set_actor_autopilot", vehicle, enabled);
    
   }
    
    
    
    
    AI写代码

4. 在 Simulator.h中

复制代码
 void SetVehicleAutopilot(Vehicle &vehicle, bool enabled = true) {

    
       _client.SetActorAutopilot(vehicle.GetId(), enabled);
    
     }
    
    
    
    
    AI写代码

5. 在Vehicle.cpp中

复制代码
 void Vehicle::SetAutopilot(bool enabled) {

    
     GetEpisode().Lock()->SetVehicleAutopilot(*this, enabled);
    
   }
    
    
    
    
    AI写代码

6. 在Actor.cpp中

复制代码
    .def("set_autopilot", &cc::Vehicle::SetAutopilot, (arg("enabled") = true))
    
    
    AI写代码

7. 在PythonAPI中就可以调用set_autopilot()函数了。

复制代码
    world.player.set_autopilot(True)
    
    AI写代码

非容器(stl的vector、map,Python的list等)类参数按上述操作即可成功,但是对于vector、list参数的传递和解析,一直没有成功。希望有经验的同学可以教我。于是,我采用了逐点设置的方式设定轨迹,这里注意每点之间要加延时(>100us),否则client设定的顺序可能和server接收的顺序不一致,表现为车在行进过程中突然掉头。另外,AWheeledVehicleAIController中判断车是否到达某点的距离阈值也要小心设置,若过小,很可能车在上一帧还没有到达该点(大于阈值),下一帧已经超过该点了(大于阈值),就会表现为车在行进过程中突然掉头去往这个已经走过的点。当然,添加位置检测,当车已经超过某点时,即便大于阈值依然pop该轨迹点,我认为会更稳妥些,这样做需注意轨迹点间距和U形弯道的情况。


另外,零零碎碎的提一些小的trick。

  • Carla采用了左手坐标系系统。
    • Carla中Server端与Client端的速度单位存在差异,请注意区分以下数值:千米每小时(km/h)、米每秒(m/s)以及厘米每秒(cm/s)。具体而言,在PythonAPI中使用player.get_velocity()时会获得米每秒(m/s),而Server端的Vehicle.GetVehicleForwardSpeed()返回的是厘米每秒(cm/s),另外SpeedLimit参数则表示千米每小时(km/h)。
    • 系统报错信息:模块agents.navigation.roaming_agent未被找到;解决方案:在.bashrc文件中添加export PYTHONPATH=$PYTHONPATH:CARLA_PATH/PythonAPI/carla。
    • 设置服务器启动时默认加载的地图方法如下:在carla/Unreal/CarlaUE4/Config/DefaultEngine.ini文件中,请将TownXX全部替换为希望加载的地图名称。
复制代码
 [/Script/EngineSettings.GameMapsSettings]

    
 EditorStartupMap=/Game/Carla/Maps/Town04.Town04
    
 GameDefaultMap=/Game/Carla/Maps/Town04.Town04
    
 ServerDefaultMap=/Game/Carla/Maps/Town04.Town04
    
 GlobalDefaultGameMode=/Game/Carla/Blueprints/Game/CarlaGameMode.CarlaGameMode_C
    
 GameInstanceClass=/Script/Carla.CarlaGameInstance
    
 TransitionMap=/Game/Carla/Maps/Town04.Town04
    
 GlobalDefaultServerGameMode=/Game/Carla/Blueprints/Game/CarlaGameMode.CarlaGameMode_C
    
    
    
    
    AI写代码

...自动控制模块(automatic_control.py)运行的自动驾驶汽车的速度限制参数配置中,在carla/PythonAPI/carla/agents/navigation/basic_agent.py文件中进行初始化函数__init__方法的调整以实现对target_speed参数的设置

复制代码
 class BasicAgent(Agent):

    
     """
    
     BasicAgent implements a basic agent that navigates scenes to reach a given
    
     target destination. This agent respects traffic lights and other vehicles.
    
     """
    
  
    
     def __init__(self, vehicle, target_speed=120):
    
     """
    
     :param vehicle: actor to apply to local planner logic onto
    
     """
    
     super(BasicAgent, self).__init__(vehicle)
    
  
    
     self._proximity_threshold = 10.0  # meters
    
     self._state = AgentState.NAVIGATING
    
     args_lateral_dict = {
    
         'K_P': 1,
    
         'K_D': 0.02,
    
         'K_I': 0,
    
         'dt': 1.0/20.0}
    
     self._local_planner = LocalPlanner(
    
         self._vehicle, opt_dict={'target_speed' : target_speed,
    
         'lateral_control_dict':args_lateral_dict})
    
     self._hop_resolution = 2.0
    
     self._path_seperation_hop = 2
    
     self._path_seperation_threshold = 0.5
    
     self._target_speed = target_speed
    
     self._grp = None
    
    
    
    
    AI写代码

Upon invoking reload_world(), the Client class is capable of deleting all actors that had previously been instantiated within the original world.

复制代码
 client = carla.Client(args.host, args.port)

    
 if client.get_world() is not None:
    
     client.reload_world()
    
    
    
    
    AI写代码

利用waypoint识别邻近的lane是否可通行状态。可以通过对waypoint.lane_change和carla.LaneChange执行位运算来完成该功能。例如,当waypoint.lane_change与carla.LaneChange.Left进行按位与操作且结果不等于零时,表示允许左转。

https://carla.readthedocs.io/en/latest/python_api/#carla.LaneChange
https://carla.readthedocs.io

world.get_map().get_spawn_points() 总是返回相同的点集集合,并即表示能够生成车辆位置的地点。这是一个预先设定好的参数,并包含共250个点

全部评论 (0)

还没有任何评论哟~