自动驾驶仿真:carla仿真器的基本使用(上)2

自动驾驶仿真:carla仿真器的基本使用(上)2

附赠自动驾驶最全的学习资料和量产经验:链接

1. 前言

在正式讲carla仿真器的使用之前,我们先需要搞明白一件事,我们要用仿真器做什么?只有先明确了这个问题,后面的探索才能一步一步的前进。在这里我简单列了一些我想做的事情:

  1. 我们得构建出仿真的静态环境:公路、障碍物、十字路口、红路灯等等。

  2. 我们需要构建一辆车;

  3. 我们要让车子动起来;

  4. 构建动态交通环境:行人、其它车辆等等。

  5. 我们要让车子在我们期望的轨迹上行驶;

  6. 车子行驶的过程中,要满足交通规则;

在上述罗列的清单里1—4我称之为入门篇,也就是仿真器最基本的一些操作。而5和6,甚至后面还会有更多,我称之为高级篇,因为这里面就需要涉及到算法知识了。那我们就一步一步的来吧,大家可以加个关注,我会持续更新。

2.构建静态环境

所谓的静态环境其实就是高精地图,通常情况下,高精地图里几乎包含了车辆行驶中所有的静态环境:建筑物、绿化带、山川河流、红路灯、行驶线等等。carla仿真器中所谓的静态环境其实就是高精地图,通常情况下,高精地图里几乎包含了车辆行驶中所有的静态环境:建筑物、绿化带、山川河流、红路灯、行驶线等等。carla仿真器中一共提供了8张地图,大家可以去官网查看它提供的各个地图的特点和鸟瞰图。不过需要注意,虽然提供了8张,但是有些好像需要自己手动安装的,亲测前5张没有翻车。

话不多说了,我们直接开始吧:

  1. 首先,大家打开自己的CarlUe4,这里大家直接打开precompiled版本的CarlUe4就好了,不过版本需要跟自己装的C++库的版本对应上,我这里装的是0.9.14。

    cd /path/to/carla/root
    ./CarlaUE4.sh -prefernvidia

2. 检查仿真器是否打开和版本是否对应并且导入地图;

#include<sstream>#include<string>#include<thread>#include<tuple>#include<carla/client/ActorBlueprint.h>#include<carla/client/BlueprintLibrary.h>#include<carla/client/Client.h>#include<carla/client/Sensor.h>#include<carla/client/TimeoutException.h>#include<carla/client/World.h>#include<carla/geom/Transform.h>usingnamespacestd;usingnamespacecarla;staticautoParseArguments(intargc,constchar*argv[]){//    EXPECT_TRUE((argc == 1u) || (argc == 3u));
usingResultType=std::tuple<std::string,uint16_t>;returnargc==3u?ResultType{argv[1u],std::stoi(argv[2u])}:ResultType{"localhost",2000u};}intmain(intargc,constchar*argv[]){try{std::stringhost;uint16_tport;std::tie(host,port)=ParseArguments(argc,argv);client::Clientclient=client::Client(host,port);client.SetTimeout(40s);std::cout<<"Client API version : "<<client.GetClientVersion()<<'\n';std::cout<<"Server API version : "<<client.GetServerVersion()<<'\n'// 导入地图
std::stringtown_name="Town04";client::Worldworld=client.LoadWorld(town_name);}catch(constclient::TimeoutException&e){std::cout<<'\n'<<e.what()<<std::endl;return1;}catch(conststd::exception&e){std::cout<<"\nException: "<<e.what()<<std::endl;return2;}}

为了大家方便,这里我把头文件和相关的namespace都粘贴过来了,后面我就省略了,有添加的时候我会补上。

client::World world = client.LoadWorld(town_name);

就是上面这行代码,Town04的高精地图就导入到了carla当中去了。大家的UE4应该就能看到这张新的地图,大家可以通过鼠标和键盘的(W/A/S/D)来控制地图的视角。当然了,如果我们想在这张地图上进行一系列的操作,那必然要获取地图上的坐标。

2.1 创建Waypoint

// 在Town05中,每隔2米获取一个Waypoint
SharedPtr<client::Map> map = world.GetMap();
std::vector<SharedPtr<client::Waypoint>> way_point = map->GenerateWaypoints(2);

这样我们就获取到了这张地图上的离散点,且分不均匀。

2.2 获取推荐的车辆其实位置

std::vector<geom::Transform> spawn_point = map->GetRecommendedSpawnPoints();

后面我们可以在这些推荐点上面创建小汽车。我们甚至可以使用matplotlibcpp库画出上述内容:

image

其中蓝色部分就是整张地图,红色部分就是carla推荐的适合创建对象的点。

3. 构建汽车对象

// 获取这张地图中所有实物的蓝图
SharedPtr<client::BlueprintLibrary> blueprint_library = world.GetBlueprintLibrary();
// 获取汽车的蓝图并指定其颜色
client::ActorBlueprint vehile_bp = *blueprint_library->Find("vehicle.tesla.model3");
vehile_bp.SetAttribute("color", "255,255,255");
// 获取地图中的推荐点集合
SharedPtr<client::Map> map = world.GetMap();
std::vector<geom::Transform> recommend_points = map->GetRecommendedSpawnPoints();
// 在推荐点中选取一点生成汽车
SharedPtr<client::Actor> actor = world.SpawnActor(vehile_bp, recommend_points[300]);
SharedPtr<client::Vehicle> vehicle = boost::static_pointer_cast<client::Vehicle>(actor);

到这一步车辆的创建及完成了,但你一定会很奇怪,为什么我的仿真器里面并没有看到汽车,那是因为我们还没有加入观测器:

geom::Transform view_transform = recommend_points[300];
SharedPtr<client::Actor> spectator = world.GetSpectator();
view_transform.location -= 5.0f * view_transform.GetForwardVector();
view_transform.location.z += 3.0f;
view_transform.rotation.yaw += 0.0f;
view_transform.rotation.pitch = -15.0f;
spectator->SetTransform(view_transform);

再来试一次,是不是就能看到我们的小汽车了?

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值