自动驾驶仿真:carla仿真器的基本使用(上)2
附赠自动驾驶最全的学习资料和量产经验:链接
1. 前言
在正式讲carla仿真器的使用之前,我们先需要搞明白一件事,我们要用仿真器做什么?只有先明确了这个问题,后面的探索才能一步一步的前进。在这里我简单列了一些我想做的事情:
-
我们得构建出仿真的静态环境:公路、障碍物、十字路口、红路灯等等。
-
我们需要构建一辆车;
-
我们要让车子动起来;
-
构建动态交通环境:行人、其它车辆等等。
-
我们要让车子在我们期望的轨迹上行驶;
-
车子行驶的过程中,要满足交通规则;
在上述罗列的清单里1—4我称之为入门篇,也就是仿真器最基本的一些操作。而5和6,甚至后面还会有更多,我称之为高级篇,因为这里面就需要涉及到算法知识了。那我们就一步一步的来吧,大家可以加个关注,我会持续更新。
2.构建静态环境
所谓的静态环境其实就是高精地图,通常情况下,高精地图里几乎包含了车辆行驶中所有的静态环境:建筑物、绿化带、山川河流、红路灯、行驶线等等。carla仿真器中所谓的静态环境其实就是高精地图,通常情况下,高精地图里几乎包含了车辆行驶中所有的静态环境:建筑物、绿化带、山川河流、红路灯、行驶线等等。carla仿真器中一共提供了8张地图,大家可以去官网查看它提供的各个地图的特点和鸟瞰图。不过需要注意,虽然提供了8张,但是有些好像需要自己手动安装的,亲测前5张没有翻车。
话不多说了,我们直接开始吧:
-
首先,大家打开自己的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库画出上述内容:
其中蓝色部分就是整张地图,红色部分就是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);
再来试一次,是不是就能看到我们的小汽车了?