carla 시뮬레이터를 사용하려면 carla server를 실행한 상태에서, carla client를 이용해 vehicle을 spawn하고 센서들을 추가해야한다.
CARLA document를 살펴보면 carla client Python API를 제공하는데, 이것을 이용해 쉽게 vehicle을 추가하거나, 날씨를 바꾸는 등의 조작이 가능하다.
python api는 c++로 작성된 libcarla를 bind한 것이다.
따라서 libCarla 라이브러리를 빌드하고 이것을 CMakeLists.txt에서 링크하면 Python API 대신 C++ 코드를 이용해 조작이 가능하다.
개발환경
OS : Ubuntu 20.04
GPU : Nvidia RTX 3070
carla : 0.9.13
언리얼엔진을 포함해 carla server를 빌드하고 실행하는 과정에서 오류가 자주 발생한다. 따라서 CARLA에서 배포하는 0.9.13 버전의 도커 이미지를 받아서 사용했다.
$ docker run --rm --privileged --gpus all --runtime=nvidia --net=host -e DISPLAY=$DISPLAY carlasim/carla:0.9.13 /bin/bash ./CarlaUE4.sh
$ cd carla-0.9.13
$ make setup
$ make LibCarla
빌드 에러 발생 시
carla-0.9.13/PythonAPI/carla/dependencies 디렉토리를 내 패키지의 루트폴더로 복사. dependencies를 libcarla-install로 이름 변경
src/main.cpp 작성
#include <carla/client/Client.h>
#include <carla/client/ActorBlueprint.h>
#include <carla/client/BlueprintLibrary.h>
#include <carla/client/Map.h>
#include <carla/geom/Location.h>
#include <carla/geom/Transform.h>
#include <carla/client/Sensor.h>
#include <carla/sensor/data/LidarMeasurement.h>
#include <thread>
#include <carla/client/Vehicle.h>
int main()
{
auto client = carla::client::Client("localhost", 2000);
client.SetTimeout(2s);
return 0;
}
cmake_minimum_required(VERSION 3.14)
set(PROJECT_NAME ground-removal-with-carla)
project(${PROJECT_NAME} LANGUAGES CXX)
add_definitions(-std=c++14 -O3)
set(CXX_FLAGS "-pthread -fPIC -DNDEBUG -Wextra")
set(CMAKE_CXX_FLAGS "${CXX_FLAGS} -Wl,-Bstatic -lboost_filesystem -Wl,-Bdynamic")
include(Dependency.cmake)
add_executable(${PROJECT_NAME}
src/main.cpp
)
target_include_directories(${PROJECT_NAME} PUBLIC
${libCarla_INCLUDE_DIR}
${DEP_INCLUDE_DIR}
)
target_link_directories(${PROJECT_NAME} PUBLIC
${libCarla_LIB_DIR}
)
target_link_libraries(${PROJECT_NAME} PUBLIC
${libCarla_LIBS}
)
set(libCarla_INSTALL_DIR ${CMAKE_SOURCE_DIR}/libcarla-install)
set(libCarla_INCLUDE_DIR ${libCarla_INSTALL_DIR}/include)
set(libCarla_LIB_DIR ${libCarla_INSTALL_DIR}/lib)
set(libCarla_LIBS
${libCarla_LIB_DIR}/libboost_filesystem.a
${libCarla_LIB_DIR}/libboost_program_options.a
${libCarla_LIB_DIR}/libboost_system.a
${libCarla_LIB_DIR}/libcarla_client.a
${libCarla_LIB_DIR}/librpc.a
${libCarla_LIB_DIR}/libDebugUtils.a
${libCarla_LIB_DIR}/libDetour.a
${libCarla_LIB_DIR}/libDetourCrowd.a
${libCarla_LIB_DIR}/libDetourTileCache.a
${libCarla_LIB_DIR}/libRecast.a
${libCarla_LIB_DIR}/libboost_filesystem.so
${libCarla_LIB_DIR}/libboost_program_options.so
${libCarla_LIB_DIR}/libboost_system.so
)
set(DEP_INCLUDE_DIR ${libCarla_INCLUDE_DIR}/system)