C++ Carla client

haeryong·2023년 5월 31일
0

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

0. carla server using docker container

언리얼엔진을 포함해 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
  • 사용을 위해 docker 및 nvidia-docker를 설치해야한다. 설치 과정은 생략한다. docker가 익숙하지 않다면, carla server를 직접 설치해 사용해도 무방하다.

1. build libCarla

$ cd carla-0.9.13
$ make setup
$ make LibCarla

빌드 에러 발생 시

  • sudo apt install clang-8
  • Util/BuildTools/Setup.sh에서 XERCESC_VERSION=3.2.4로 변경
  • Util/BuildTools/Setup.sh에서 CARLA_VERSION="0.9.13"로 변경

2. edit CMakeLists.txt

  • 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;
}
  • CMakeLists.txt 작성
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}
)
  • dependency.cmake 작성
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)

0개의 댓글