Compare commits

...

4 Commits

Author SHA1 Message Date
berndgassmann 606a8f01bd
Merge fa5b123c48 into 1ef3f55c95 2024-07-31 15:23:38 +02:00
berndgassmann fa5b123c48 Merge remote-tracking branch 'carla/dev' into berndgassmann/rework_ros2_step_1_harmonize_build 2024-07-08 18:30:03 +02:00
berndgassmann edcbae1ee1 removed debug logs 2024-07-08 09:38:46 +02:00
berndgassmann 634e418777 Cleanup and harmonize Carla build
Ensure that actually only the unreal sysroot is deployed for all C as
well C++ compilations including dependencies. That ensures the server is
NOT anymore linked against the system glibc (which is in Ubuntu22.04
incompatible with the Unreal one). As a consequence no local clang
installation required anymore to build under Linux.

Harmonized naming split into client/server (instead of libcpp and
libstdcpp) to ensure nothing mixed up (and there were things mixed up
before!)

Refactor C# Unreal build using CarlaRules base class to provide common
functionality. Fixing windows build without ROS2 and added intitial
windows build with ROS2

Restrict to one DDS-Domain-Participant for carla-server (Fixes bind
address already in use exception on with ROS2).

Due to continued segfaults in reallocations of MallocBinned2 in
conjunction with ROS2 enforce using AnsiMalloc calls under Linux (see
https://forums.unrealengine.com/t/dealing-with-allocator-mismatches-with-external-libraries/1416830)

Use C++20 to allow for more robust struct initialization (see
https://en.cppreference.com/w/cpp/language/aggregate_initialization),
added Eigen C++20 patches and required CARLA changes to cope with C++20
compilation errors
Be aware: This change requires the Unreal PR
(https://github.com/CarlaUnreal/UnrealEngine/pull/23)

Move forward to g++-13

Minors:
- Fix make clean call
- Update osm2odr commit with build fix
(https://github.com/carla-simulator/sumo/pull/6)
- Update ad-rss to 4.4.5 (supports boost 1.80)
- Fix windows install scripts and forward arguments for building
libcarla
- Adapt codeformat.py to python3 using clang-format-14
2024-07-08 09:26:29 +02:00
70 changed files with 3966 additions and 1775 deletions

View File

@ -12,13 +12,11 @@
* Fixed bug in python agents when vehicle list was empty causing a check on all vehicles (BasicAgent.py) and detected pedestrians as vehicles if no pedestrains are present (BehaviourAgent.py)
* Extended debug drawing functions to allow drawing primitives on HUD layer
* Added possibility to change gravity variable in imui sensor for the accelerometer
* Fixed ROS2 native extension build error when ROS2 is installed in the system.
* ROS2Native: Force fast-dds dependencies download to avoid build crash when boost_asio and tinyxml2 are not installed in Linux.
* Added API function `get_telemetry_data` to the vehicle actor.
* PythonAPI `Sensor.is_listening` was defined twice (property and method), cleaned and clarified it as a method.
* Added V2X sensors for cooperative awareness message and custom user-defined messages to support vehicle-to-vehicle communication
* Added named tuples for BasicAgent.py's detection result to allow for type-hints and better semantics.
* Cleaned up the client/server build and respective naming
## CARLA 0.9.15

View File

@ -40,7 +40,7 @@ CARLA requires many different kinds of software to run. Some are built during th
sudo apt-get update &&
sudo apt-get install wget software-properties-common &&
sudo add-apt-repository ppa:ubuntu-toolchain-r/test &&
wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key|sudo apt-key add
sudo apt-get update
```
!!! Warning
@ -50,41 +50,28 @@ To avoid compatibility issues between Unreal Engine and the CARLA dependencies,
__Ubuntu 22.04__.
```sh
sudo apt-add-repository "deb http://archive.ubuntu.com/ubuntu focal main universe"
sudo apt-get update
sudo apt-get install build-essential clang-10 lld-10 g++-7 cmake ninja-build libvulkan1 python python3 python3-dev python3-pip libpng-dev libtiff5-dev libjpeg-dev tzdata sed curl unzip autoconf libtool rsync libxml2-dev git git-lfs
sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/lib/llvm-10/bin/clang++ 180 &&
sudo update-alternatives --install /usr/bin/clang clang /usr/lib/llvm-10/bin/clang 180 &&
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 180
sudo apt-get install build-essential g++-13 cmake ninja-build libvulkan1 python3 python3-dev python3-pip libpng-dev libtiff5-dev libjpeg-dev tzdata sed curl unzip autoconf libtool rsync libxml2-dev git git-lfs
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 180
```
__Ubuntu 20.04__.
```sh
sudo apt-add-repository "deb http://apt.llvm.org/focal/ llvm-toolchain-focal main"
sudo apt-get update
sudo apt-get install build-essential clang-10 lld-10 g++-7 cmake ninja-build libvulkan1 python python-dev python3-dev python3-pip libpng-dev libtiff5-dev libjpeg-dev tzdata sed curl unzip autoconf libtool rsync libxml2-dev git
sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/lib/llvm-10/bin/clang++ 180 &&
sudo update-alternatives --install /usr/bin/clang clang /usr/lib/llvm-10/bin/clang 180
sudo apt-get install build-essential g++-13 cmake ninja-build libvulkan1 python python-dev python3-dev python3-pip libpng-dev libtiff5-dev libjpeg-dev tzdata sed curl unzip autoconf libtool rsync libxml2-dev git
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 180
```
__Ubuntu 18.04__.
```sh
sudo apt-add-repository "deb http://apt.llvm.org/bionic/ llvm-toolchain-bionic main"
sudo apt-get update
sudo apt-get install build-essential clang-8 lld-8 g++-7 cmake ninja-build libvulkan1 python python-pip python-dev python3-dev python3-pip libpng-dev libtiff5-dev libjpeg-dev tzdata sed curl unzip autoconf libtool rsync libxml2-dev git
sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/lib/llvm-8/bin/clang++ 180 &&
sudo update-alternatives --install /usr/bin/clang clang /usr/lib/llvm-8/bin/clang 180
sudo apt-get install build-essential g++-13 cmake ninja-build libvulkan1 python python-pip python-dev python3-dev python3-pip libpng-dev libtiff5-dev libjpeg-dev tzdata sed curl unzip autoconf libtool rsync libxml2-dev git
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 180
```
__Ubuntu 16.04__.
```sh
sudo apt-add-repository "deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-8 main" &&
sudo apt-get update
sudo apt-get install build-essential clang-8 lld-8 g++-7 cmake ninja-build libvulkan1 python python-pip python-dev python3-dev python3-pip libpng16-dev libtiff5-dev libjpeg-dev tzdata sed curl unzip autoconf libtool rsync libxml2-dev git
sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/lib/llvm-8/bin/clang++ 180 &&
sudo update-alternatives --install /usr/bin/clang clang /usr/lib/llvm-8/bin/clang 180
sudo apt-get install build-essential g++-13 cmake ninja-build libvulkan1 python python-pip python-dev python3-dev python3-pip libpng16-dev libtiff5-dev libjpeg-dev tzdata sed curl unzip autoconf libtool rsync libxml2-dev git
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 180
```
__Previous Ubuntu versions__.
@ -92,11 +79,8 @@ __Previous Ubuntu versions__.
We strongly advise using Ubuntu 18.04 or later to build CARLA. However, you may attempt to build CARLA on older versions of Ubuntu with the following commands:
```sh
sudo apt-add-repository "deb http://apt.llvm.org/<code_name>/ llvm-toolchain-<code_name>-8 main" &&
sudo apt-get update
sudo apt-get install build-essential clang-8 lld-8 g++-7 cmake ninja-build libvulkan1 python python-pip python-dev python3-dev python3-pip libpng16-dev libtiff5-dev libjpeg-dev tzdata sed curl unzip autoconf libtool rsync libxml2-dev git
sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/lib/llvm-8/bin/clang++ 180 &&
sudo update-alternatives --install /usr/bin/clang clang /usr/lib/llvm-8/bin/clang 180
sudo apt-get install build-essential g++-13 cmake ninja-build libvulkan1 python python-pip python-dev python3-dev python3-pip libpng16-dev libtiff5-dev libjpeg-dev tzdata sed curl unzip autoconf libtool rsync libxml2-dev git
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 180
```
__All Ubuntu systems__.

View File

@ -4,8 +4,8 @@ BINDIR=$(CURDIR)/bin
INSTALLDIR=$(CURDIR)/libcarla-install
TOOLCHAIN=$(CURDIR)/ToolChain.cmake
CC=/usr/bin/gcc-7
CXX=/usr/bin/g++-7
CC=/usr/bin/gcc-13
CXX=/usr/bin/g++-13
CXXFLAGS=-std=c++14 -pthread -fPIC -O3 -DNDEBUG -Werror -Wall -Wextra
define log

View File

@ -4,10 +4,12 @@ project(libcarla)
option(LIBCARLA_BUILD_DEBUG "Build debug configuration" ON)
option(LIBCARLA_BUILD_RELEASE "Build release configuration" ON)
option(LIBCARLA_BUILD_TEST "Build unit tests" ON)
option(LIBCARLA_USE_ROS "Build ROS variant" OFF)
message(STATUS "Build debug: ${LIBCARLA_BUILD_DEBUG}")
message(STATUS "Build release: ${LIBCARLA_BUILD_RELEASE}")
message(STATUS "Build test: ${LIBCARLA_BUILD_TEST}")
message(STATUS "Enable ROS: ${LIBCARLA_USE_ROS}")
set(libcarla_source_path "${PROJECT_SOURCE_DIR}/../source")
set(libcarla_source_thirdparty_path "${libcarla_source_path}/third-party")
@ -24,14 +26,12 @@ if (CMAKE_BUILD_TYPE STREQUAL "Client")
elseif (CMAKE_BUILD_TYPE STREQUAL "Server")
add_subdirectory("server")
elseif (CMAKE_BUILD_TYPE STREQUAL "Pytorch")
add_subdirectory("pytorch")
elseif (CMAKE_BUILD_TYPE STREQUAL "ros2")
add_subdirectory("fast_dds")
add_subdirectory("pytorch")
else ()
message(FATAL_ERROR "Unknown build type '${CMAKE_BUILD_TYPE}'")
endif ()
# GTest is not compiled on Windows.
if ((LIBCARLA_BUILD_TEST) AND (NOT WIN32) AND (NOT (CMAKE_BUILD_TYPE STREQUAL "Pytorch")) AND (NOT (CMAKE_BUILD_TYPE STREQUAL "ros2")))
if ((LIBCARLA_BUILD_TEST) AND (NOT WIN32) AND (NOT (CMAKE_BUILD_TYPE STREQUAL "Pytorch")))
add_subdirectory("test")
endif()

View File

@ -21,8 +21,8 @@ if (BUILD_RSS_VARIANT)
install(FILES ${spdlog_file} DESTINATION lib)
list(APPEND ADRSS_LIBS ${spdlog_file})
set(proj_include_dir ${ADRSS_INSTALL_DIR}/../../proj-install/include)
set(proj_lib ${ADRSS_INSTALL_DIR}/../../proj-install/lib/libproj.a)
set(proj_include_dir ${PROJ_INCLUDE_PATH})
set(proj_lib ${PROJ_LIBPATH}/libproj.a)
install(DIRECTORY ${proj_include_dir} DESTINATION include/system)
list(APPEND ADRSS_INCLUDE_DIRS ${proj_include_dir})
install(FILES ${proj_lib} DESTINATION lib)
@ -98,6 +98,12 @@ file(GLOB libcarla_carla_sources
set(libcarla_sources "${libcarla_sources};${libcarla_carla_sources}")
install(FILES ${libcarla_carla_sources} DESTINATION include/carla)
file(GLOB libcarla_carla_actors_sources
"${libcarla_source_path}/carla/actors/*.cpp"
"${libcarla_source_path}/carla/actors/*.h")
set(libcarla_sources "${libcarla_sources};${libcarla_carla_actors_sources}")
install(FILES ${libcarla_carla_actors_sources} DESTINATION include/carla/actors)
file(GLOB libcarla_carla_client_sources
"${libcarla_source_path}/carla/client/*.cpp"
"${libcarla_source_path}/carla/client/*.h")
@ -266,11 +272,10 @@ file(GLOB libcarla_carla_trafficmanager_sources
set(libcarla_sources "${libcarla_sources};${libcarla_carla_trafficmanager_sources}")
install(FILES ${libcarla_carla_trafficmanager_sources} DESTINATION include/carla/trafficmanager)
file(GLOB libcarla_carla_ros2_sources
"${libcarla_source_path}/carla/ros2/*.cpp"
"${libcarla_source_path}/carla/ros2/*.h")
set(libcarla_sources "${libcarla_sources};${libcarla_carla_ros2_sources}")
install(FILES ${libcarla_carla_ros2_sources} DESTINATION include/carla/ros2)
file(GLOB libcarla_carla_ros2_public_headers
"${libcarla_source_path}/carla/ros2/*.h"
)
install(FILES ${libcarla_carla_ros2_public_headers} DESTINATION include/carla/ros2)
# ==============================================================================
# Create targets for debug and release in the same build type.

View File

@ -1,56 +0,0 @@
cmake_minimum_required(VERSION 3.5.1)
project(libcarla_fastdds)
# Install headers.
file(GLOB libcarla_carla_fastdds_headers
"${libcarla_source_path}/carla/ros2/publishers/*.h"
"${libcarla_source_path}/carla/ros2/subscribers/*.h"
"${libcarla_source_path}/carla/ros2/listeners/*.h"
"${libcarla_source_path}/carla/ros2/types/*.h"
)
install(FILES ${libcarla_carla_fastdds_headers} DESTINATION include/carla/ros2)
file(GLOB fast_dds_dependencies "${FASTDDS_LIB_PATH}/*.so*")
install(FILES ${fast_dds_dependencies} DESTINATION lib)
file(GLOB libcarla_fastdds_sources
"${libcarla_source_path}/carla/ros2/publishers/*.cpp"
"${libcarla_source_path}/carla/ros2/subscribers/*.cpp"
"${libcarla_source_path}/carla/ros2/listeners/*.cpp"
"${libcarla_source_path}/carla/ros2/types/*.cpp")
set(FASTDDS_CPP_STD_INCLUDES "/usr/include/c++/7")
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -fPIC -D_GLIBCXX_USE_CXX11_ABI=0 -I${FASTDDS_CPP_STD_INCLUDES}" CACHE STRING "" FORCE)
# ==============================================================================
# Create targets for debug and release in the same build type.
# ==============================================================================
if (LIBCARLA_BUILD_RELEASE)
add_library(carla_fastdds STATIC ${libcarla_fastdds_sources})
target_include_directories(carla_fastdds SYSTEM PRIVATE
"${BOOST_INCLUDE_PATH}"
"${RPCLIB_INCLUDE_PATH}")
target_include_directories(carla_fastdds PRIVATE "${FASTDDS_INCLUDE_PATH}")
target_include_directories(carla_fastdds PRIVATE "${libcarla_source_path}/carla/ros2")
target_link_libraries(carla_fastdds fastrtps fastcdr "${FAST_DDS_LIBRARIES}")
install(TARGETS carla_fastdds DESTINATION lib)
set_target_properties(carla_fastdds PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS_RELEASE}")
endif()
if (LIBCARLA_BUILD_DEBUG)
add_library(carla_fastdds_debug STATIC ${libcarla_fastdds_sources})
target_include_directories(carla_fastdds_debug SYSTEM PRIVATE
"${BOOST_INCLUDE_PATH}"
"${RPCLIB_INCLUDE_PATH}")
install(TARGETS carla_fastdds_debug DESTINATION lib)
set_target_properties(carla_fastdds_debug PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS_DEBUG}")
target_compile_definitions(carla_fastdds_debug PUBLIC -DBOOST_ASIO_ENABLE_BUFFER_DEBUGGING)
endif()

View File

@ -1,78 +1,51 @@
cmake_minimum_required(VERSION 3.5.1)
project(libcarla-server)
# Install libc++ shared libraries.
file(GLOB LibCXX_Libraries "${LLVM_LIB_PATH}/libc++*")
install(FILES ${LibCXX_Libraries} DESTINATION lib)
# Install rpclib.
install(DIRECTORY "${RPCLIB_INCLUDE_PATH}/rpc" DESTINATION include)
file(GLOB libcarla_carla_rpclib "${RPCLIB_LIB_PATH}/*.*")
install(FILES ${libcarla_carla_rpclib} DESTINATION lib)
# Install headers.
install(DIRECTORY "${libcarla_source_path}/compiler" DESTINATION include)
file(GLOB libcarla_carla_headers "${libcarla_source_path}/carla/*.h")
install(FILES ${libcarla_carla_headers} DESTINATION include/carla)
foreach(dir ""
"actors/"
"geom/"
"opendrive/" "opendrive/parser/"
"profiler/"
"road/" "road/element/" "road/general/" "road/object/" "road/signal/"
"rpc/"
"sensor/" "sensor/data/" "sensor/s11n/"
"streaming/" "streaming/detail/" "streaming/detail/tcp/" "streaming/low_level/"
"multigpu/")
file(GLOB libcarla_carla_geom_headers "${libcarla_source_path}/carla/geom/*.h")
install(FILES ${libcarla_carla_geom_headers} DESTINATION include/carla/geom)
file(GLOB headers "${libcarla_source_path}/carla/${dir}*.h")
install(FILES ${headers} DESTINATION include/carla/${dir})
file(GLOB libcarla_carla_opendrive "${libcarla_source_path}/carla/opendrive/*.h")
install(FILES ${libcarla_carla_opendrive} DESTINATION include/carla/opendrive)
endforeach()
file(GLOB libcarla_carla_opendrive_parser "${libcarla_source_path}/carla/opendrive/parser/*.h")
install(FILES ${libcarla_carla_opendrive_parser} DESTINATION include/carla/opendrive/parser)
file(GLOB libcarla_carla_profiler_headers "${libcarla_source_path}/carla/profiler/*.h")
install(FILES ${libcarla_carla_profiler_headers} DESTINATION include/carla/profiler)
file(GLOB libcarla_carla_road_headers "${libcarla_source_path}/carla/road/*.h")
install(FILES ${libcarla_carla_road_headers} DESTINATION include/carla/road)
# only install the required public interface headers
foreach(dir "" "types/" )
file(GLOB libcarla_carla_ros2_public_headers
"${libcarla_source_path}/carla/ros2/${dir}*.h"
)
install(FILES ${libcarla_carla_ros2_public_headers} DESTINATION include/carla/ros2/${dir})
endforeach()
if (LIBCARLA_USE_ROS)
file(GLOB libcarla_carla_road_element_headers "${libcarla_source_path}/carla/road/element/*.h")
install(FILES ${libcarla_carla_road_element_headers} DESTINATION include/carla/road/element)
file(GLOB subdirs RELATIVE "${libcarla_source_path}/carla/ros2/${ROS2_MW_NAME}" "${libcarla_source_path}/carla/ros2/${ROS2_MW_NAME}/*")
foreach(typedir "msg" "srv")
foreach(dir ${subdirs})
if(IS_DIRECTORY "${libcarla_source_path}/carla/ros2/${ROS2_MW_NAME}/${dir}/${typedir}")
file(GLOB libcarla_carla_ros2_types_${dir}_headers
"${libcarla_source_path}/carla/ros2/${ROS2_MW_NAME}/${dir}/${typedir}/*.h"
)
install(FILES ${libcarla_carla_ros2_types_${dir}_headers} DESTINATION include/carla/ros2/ros_types/${dir}/${typedir}/)
endif()
endforeach()
endforeach()
file(GLOB libcarla_carla_road_general_headers "${libcarla_source_path}/carla/road/general/*.h")
install(FILES ${libcarla_carla_road_general_headers} DESTINATION include/carla/road/general)
file(GLOB libcarla_carla_road_object_headers "${libcarla_source_path}/carla/road/object/*.h")
install(FILES ${libcarla_carla_road_object_headers} DESTINATION include/carla/road/object)
file(GLOB libcarla_carla_road_signal_headers "${libcarla_source_path}/carla/road/signal/*.h")
install(FILES ${libcarla_carla_road_signal_headers} DESTINATION include/carla/road/signal)
file(GLOB libcarla_carla_rpc_headers "${libcarla_source_path}/carla/rpc/*.h")
install(FILES ${libcarla_carla_rpc_headers} DESTINATION include/carla/rpc)
file(GLOB libcarla_carla_sensor_headers "${libcarla_source_path}/carla/sensor/*.h")
install(FILES ${libcarla_carla_sensor_headers} DESTINATION include/carla/sensor)
file(GLOB libcarla_carla_sensor_data_headers "${libcarla_source_path}/carla/sensor/data/*.h")
install(FILES ${libcarla_carla_sensor_data_headers} DESTINATION include/carla/sensor/data)
file(GLOB libcarla_carla_sensor_s11n_headers "${libcarla_source_path}/carla/sensor/s11n/*.h")
install(FILES ${libcarla_carla_sensor_s11n_headers} DESTINATION include/carla/sensor/s11n)
file(GLOB libcarla_carla_streaming_headers "${libcarla_source_path}/carla/streaming/*.h")
install(FILES ${libcarla_carla_streaming_headers} DESTINATION include/carla/streaming)
file(GLOB libcarla_carla_streaming_detail_headers "${libcarla_source_path}/carla/streaming/detail/*.h")
install(FILES ${libcarla_carla_streaming_detail_headers} DESTINATION include/carla/streaming/detail)
file(GLOB libcarla_carla_streaming_detail_tcp_headers "${libcarla_source_path}/carla/streaming/detail/tcp/*.h")
install(FILES ${libcarla_carla_streaming_detail_tcp_headers} DESTINATION include/carla/streaming/detail/tcp)
file(GLOB libcarla_carla_streaming_low_level_headers "${libcarla_source_path}/carla/streaming/low_level/*.h")
install(FILES ${libcarla_carla_streaming_low_level_headers} DESTINATION include/carla/streaming/low_level)
file(GLOB libcarla_carla_multigpu_headers "${libcarla_source_path}/carla/multigpu/*.h")
install(FILES ${libcarla_carla_multigpu_headers} DESTINATION include/carla/multigpu)
file(GLOB libcarla_carla_ros2_headers "${libcarla_source_path}/carla/ros2/*.h")
install(FILES ${libcarla_carla_ros2_headers} DESTINATION include/carla/ros2)
if(NOT WIN32)
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3" CACHE STRING "" FORCE)
endif()
endif()
install(DIRECTORY "${BOOST_INCLUDE_PATH}/boost" DESTINATION include)
@ -85,47 +58,62 @@ if(WIN32)
endif()
# carla_server library.
# first the sources which are picked from some directories
set(libcarla_server_sources
"${libcarla_source_path}/carla/Buffer.cpp"
"${libcarla_source_path}/carla/Exception.cpp"
"${libcarla_source_path}/carla/StringUtil.cpp"
# other cpp files only define Deserialize used in client
"${libcarla_source_path}/carla/sensor/s11n/SensorHeaderSerializer.cpp"
)
# then the globs on the folders to add as a whole
foreach(dir
"actors"
"geom"
"opendrive" "opendrive/parser"
"profiler"
"road" "road/element" "road/general" "road/object" "road/signal"
"rpc"
"sensor" "sensor/data"
"streaming" "streaming/detail" "streaming/detail/tcp" "streaming/low_level"
"multigpu")
file(GLOB libcarla_server_sources
"${libcarla_source_path}/carla/*.h"
"${libcarla_source_path}/carla/Buffer.cpp"
"${libcarla_source_path}/carla/Exception.cpp"
"${libcarla_source_path}/carla/geom/*.cpp"
"${libcarla_source_path}/carla/geom/*.h"
"${libcarla_source_path}/carla/opendrive/*.cpp"
"${libcarla_source_path}/carla/opendrive/*.h"
"${libcarla_source_path}/carla/opendrive/parser/*.cpp"
"${libcarla_source_path}/carla/opendrive/parser/*.h"
"${libcarla_source_path}/carla/road/*.cpp"
"${libcarla_source_path}/carla/road/*.h"
"${libcarla_source_path}/carla/road/element/*.cpp"
"${libcarla_source_path}/carla/road/element/*.h"
"${libcarla_source_path}/carla/road/general/*.cpp"
"${libcarla_source_path}/carla/road/general/*.h"
"${libcarla_source_path}/carla/road/object/*.cpp"
"${libcarla_source_path}/carla/road/object/*.h"
"${libcarla_source_path}/carla/road/signal/*.cpp"
"${libcarla_source_path}/carla/road/signal/*.h"
"${libcarla_source_path}/carla/rpc/*.cpp"
"${libcarla_source_path}/carla/rpc/*.h"
"${libcarla_source_path}/carla/sensor/*.h"
"${libcarla_source_path}/carla/sensor/s11n/*.h"
"${libcarla_source_path}/carla/sensor/s11n/SensorHeaderSerializer.cpp"
"${libcarla_source_path}/carla/streaming/*.h"
"${libcarla_source_path}/carla/streaming/detail/*.cpp"
"${libcarla_source_path}/carla/streaming/detail/*.h"
"${libcarla_source_path}/carla/streaming/detail/tcp/*.cpp"
"${libcarla_source_path}/carla/streaming/low_level/*.h"
"${libcarla_source_path}/carla/multigpu/*.h"
"${libcarla_source_path}/carla/multigpu/*.cpp"
"${libcarla_source_path}/carla/ros2/*.h"
"${libcarla_source_path}/carla/ros2/*.cpp"
"${libcarla_source_thirdparty_path}/odrSpiral/*.cpp"
"${libcarla_source_thirdparty_path}/odrSpiral/*.h"
"${libcarla_source_thirdparty_path}/moodycamel/*.cpp"
"${libcarla_source_thirdparty_path}/moodycamel/*.h"
"${libcarla_source_thirdparty_path}/pugixml/*.cpp"
"${libcarla_source_thirdparty_path}/pugixml/*.hpp")
file(GLOB sources "${libcarla_source_path}/carla/${dir}/*.cpp")
list(APPEND libcarla_server_sources ${sources})
endforeach()
foreach(thirdparty_dir
"odrSpiral"
"moodycamel"
"pugixml")
file(GLOB sources "${libcarla_source_thirdparty_path}/${thirdparty_dir}/*.cpp")
list(APPEND libcarla_server_sources ${sources})
endforeach()
if (LIBCARLA_USE_ROS)
foreach(ros2_dir
"/"
"${ROS2_MW_NAME}/carla/ros2/impl/"
"listeners/"
"publishers/"
"services/"
"subscribers/"
"types/")
file(GLOB sources "${libcarla_source_path}/carla/ros2/${ros2_dir}*.cpp")
list(APPEND libcarla_server_sources ${sources})
endforeach()
file(GLOB msg_sources "${libcarla_source_path}/carla/ros2/${ROS2_MW_NAME}/*/msg/*.cxx")
list(APPEND libcarla_server_sources ${msg_sources})
file(GLOB srv_sources "${libcarla_source_path}/carla/ros2/${ROS2_MW_NAME}/*/srv/*.cxx")
list(APPEND libcarla_server_sources ${srv_sources})
endif()
# ==============================================================================
# Create targets for debug and release in the same build type.
@ -133,7 +121,10 @@ file(GLOB libcarla_server_sources
if (LIBCARLA_BUILD_RELEASE)
add_library(carla_server STATIC ${libcarla_server_sources})
add_library(carla_server STATIC
${libcarla_server_sources}
)
target_compile_definitions(carla_server PUBLIC -DCARLA_SERVER_BUILD)
target_include_directories(carla_server SYSTEM PRIVATE
"${BOOST_INCLUDE_PATH}"
@ -143,11 +134,23 @@ if (LIBCARLA_BUILD_RELEASE)
set_target_properties(carla_server PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS_RELEASE}")
if (LIBCARLA_USE_ROS)
target_include_directories(carla_server SYSTEM PRIVATE
# first the ROS2_MW_NAME local folder allowing potential overrides of header files
"${libcarla_source_path}/carla/ros2/${ROS2_MW_NAME}"
"${ROS2_MW_INCLUDE_PATH}")
target_link_directories(carla_server PRIVATE ${ROS2_MW_LIB_PATH})
target_link_libraries(carla_server ${ROS2_MW_LINK_LIBRARIES})
target_compile_definitions(carla_server PUBLIC -DWITH_ROS2)
endif()
endif()
if (LIBCARLA_BUILD_DEBUG)
add_library(carla_server_debug STATIC ${libcarla_server_sources})
add_library(carla_server_debug STATIC
${libcarla_server_sources}
)
target_compile_definitions(carla_server_debug PUBLIC -DCARLA_SERVER_BUILD)
target_include_directories(carla_server_debug SYSTEM PRIVATE
"${BOOST_INCLUDE_PATH}"
@ -158,4 +161,13 @@ if (LIBCARLA_BUILD_DEBUG)
set_target_properties(carla_server_debug PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS_DEBUG}")
target_compile_definitions(carla_server_debug PUBLIC -DBOOST_ASIO_ENABLE_BUFFER_DEBUGGING)
if (LIBCARLA_USE_ROS)
target_include_directories(carla_server_debug SYSTEM PRIVATE
# first the ROS2_MW_NAME local folder allowing potential overrides of header files
"${libcarla_source_path}/carla/ros2/${ROS2_MW_NAME}"
"${ROS2_MW_INCLUDE_PATH}")
target_link_directories(carla_server_debug PRIVATE ${ROS2_MW_LIB_PATH})
target_link_libraries(carla_server_debug ${ROS2_MW_LINK_LIBRARIES})
target_compile_definitions(carla_server_debug PUBLIC -DWITH_ROS2)
endif()
endif()

View File

@ -15,6 +15,10 @@ endif()
link_directories(
${RPCLIB_LIB_PATH}
${GTEST_LIB_PATH})
if (LIBCARLA_USE_ROS)
link_directories(${ROS2_MW_LIB_PATH})
endif()
file(GLOB libcarla_test_sources
"${libcarla_source_path}/carla/profiler/*.cpp"

View File

@ -15,19 +15,18 @@
namespace boost {
void throw_exception(const std::exception &e) {
carla::throw_exception(e);
}
void throw_exception(const std::exception &e) {
carla::throw_exception(e);
}
void throw_exception(
const std::exception &e,
boost::source_location const & loc) {
throw_exception(e);
}
void throw_exception(const std::exception &e, boost::source_location const &loc) {
(void)loc;
throw_exception(e);
}
} // namespace boost
} // namespace boost
#endif // BOOST_NO_EXCEPTIONS
#endif // BOOST_NO_EXCEPTIONS
// =============================================================================
// -- Workaround for Boost.Asio bundled with rpclib ----------------------------
@ -42,16 +41,47 @@ namespace boost {
namespace clmdep_asio {
namespace detail {
template <typename Exception>
void throw_exception(const Exception& e) {
carla::throw_exception(e);
}
template <typename Exception>
void throw_exception(const Exception &e) {
carla::throw_exception(e);
}
template void throw_exception<std::bad_cast>(const std::bad_cast &);
template void throw_exception<std::exception>(const std::exception &);
template void throw_exception<std::system_error>(const std::system_error &);
template void throw_exception<std::bad_cast>(const std::bad_cast &e);
template void throw_exception<std::exception>(const std::exception &e);
template void throw_exception<std::system_error>(const std::system_error &e);
} // namespace detail
} // namespace clmdep_asio
} // namespace detail
} // namespace clmdep_asio
#endif // ASIO_NO_EXCEPTIONS
namespace asio {
namespace detail {
template <typename Exception>
void throw_exception(const Exception &e) {
carla::throw_exception(e);
}
template void throw_exception<std::bad_cast>(const std::bad_cast &e);
template void throw_exception<std::exception>(const std::exception &e);
template void throw_exception<std::system_error>(const std::system_error &e);
} // namespace detail
} // namespace asio
#endif // ASIO_NO_EXCEPTIONS
#ifndef LIBCARLA_NO_EXCEPTIONS
namespace carla {
template
#ifndef __clang__
// clang doesn't support C++11 attributes in template explicit instantiation, since attributes in each case cannot
// be changed here MSVC requires it (might be a bit too conservative and requires the attributes also in explicit
// instanciation)
[[noreturn]]
#endif
void
throw_exception<std::exception>(const std::exception &);
} // namespace carla
#endif

View File

@ -6,38 +6,34 @@
#pragma once
#include <exception>
#ifdef LIBCARLA_NO_EXCEPTIONS
namespace std {
class exception;
} // namespace std
namespace carla {
/// User define function, similar to Boost throw_exception.
///
/// @important Boost exceptions are also routed to this function.
///
/// When compiled with LIBCARLA_NO_EXCEPTIONS, this function is left undefined
/// in LibCarla, and the modules using LibCarla are expected to supply an
/// appropriate definition. Callers of throw_exception are allowed to assume
/// that the function never returns; therefore, if the user-defined
/// throw_exception returns, the behavior is undefined.
[[ noreturn ]] void throw_exception(const std::exception &e);
/// User define function, similar to Boost throw_exception.
///
/// @important Boost exceptions are also routed to this function.
///
/// When compiled with LIBCARLA_NO_EXCEPTIONS, this function is left undefined
/// in LibCarla, and the modules using LibCarla are expected to supply an
/// appropriate definition. Callers of throw_exception are allowed to assume
/// that the function never returns; therefore, if the user-defined
/// throw_exception returns, the behavior is undefined.
[[noreturn]] void throw_exception(const std::exception &e);
} // namespace carla
} // namespace carla
#else
namespace carla {
template <typename T>
[[ noreturn ]] void throw_exception(const T &e) {
throw e;
}
template <typename T>
[[noreturn]] void throw_exception(const T &e) {
throw e;
}
} // namespace carla
} // namespace carla
#endif // LIBCARLA_NO_EXCEPTIONS
#endif // LIBCARLA_NO_EXCEPTIONS

View File

@ -54,7 +54,7 @@ namespace geom {
// =========================================================================
Location &operator+=(const Location &rhs) {
static_cast<Vector3D &>(*this) += rhs;
static_cast<Vector3D &>(*this) += static_cast<const Vector3D &>(rhs);
return *this;
}
@ -64,7 +64,7 @@ namespace geom {
}
Location &operator-=(const Location &rhs) {
static_cast<Vector3D &>(*this) -= rhs;
static_cast<Vector3D &>(*this) -= static_cast<const Vector3D &>(rhs);
return *this;
}
@ -78,7 +78,7 @@ namespace geom {
// =========================================================================
bool operator==(const Location &rhs) const {
return static_cast<const Vector3D &>(*this) == rhs;
return static_cast<const Vector3D &>(*this) == static_cast<const Vector3D &>(rhs);
}
bool operator!=(const Location &rhs) const {

View File

@ -0,0 +1,30 @@
// Copyright (c) 2017 Computer Vision Center (CVC) at the Universitat Autonoma
// de Barcelona (UAB).
//
// This work is licensed under the terms of the MIT license.
// For a copy, see <https://opensource.org/licenses/MIT>.
#include "carla/Exception.h"
#include <asio.hpp>
#ifdef ASIO_NO_EXCEPTIONS
namespace asio {
namespace detail {
template <typename Exception>
void throw_exception(const Exception &e) {
carla::throw_exception(e);
}
template void throw_exception<std::length_error>(const std::length_error &e);
template void throw_exception<asio::service_already_exists>(const asio::service_already_exists &e);
template void throw_exception<asio::invalid_service_owner>(const asio::invalid_service_owner &e);
template void throw_exception<asio::execution::bad_executor>(const asio::execution::bad_executor &e);
template void throw_exception<asio::ip::bad_address_cast>(const asio::ip::bad_address_cast &e);
template void throw_exception<std::out_of_range>(const std::out_of_range &e);
} // namespace detail
} // namespace asio
#endif // ASIO_NO_EXCEPTIONS

View File

@ -16,6 +16,7 @@
#include "carla/sensor/s11n/ImageSerializer.h"
#include "carla/sensor/s11n/SensorHeaderSerializer.h"
#include "fastdds/carla/ros2/impl/DdsDomainParticipantImpl.h"
#include "publishers/CarlaPublisher.h"
#include "publishers/CarlaClockPublisher.h"
#include "publishers/CarlaRGBCameraPublisher.h"
@ -46,6 +47,14 @@ namespace ros2 {
// static fields
std::shared_ptr<ROS2> ROS2::_instance;
std::shared_ptr<DdsDomainParticipantImpl> ROS2::GetDdsDomainParticipant() {
auto _instance = ROS2::GetInstance();
if (_instance->_domain_participant_impl == nullptr)
{
_instance->_domain_participant_impl = std::make_shared<DdsDomainParticipantImpl>();
}
return _instance->_domain_participant_impl;
}
// list of sensors (should be equal to the list of SensorsRegistry
enum ESensors {
@ -841,6 +850,9 @@ void ROS2::Shutdown() {
_clock_publisher.reset();
_controller.reset();
_enabled = false;
// finally, release the rest of our resources by destroying our instance
// to prevent from race conditions on system level shutdown of global resources
_instance = nullptr;
}
} // namespace ros2

View File

@ -41,6 +41,7 @@ namespace ros2 {
class CarlaTransformPublisher;
class CarlaClockPublisher;
class CarlaEgoVehicleControlSubscriber;
class DdsDomainParticipantImpl;
class ROS2
{
@ -54,6 +55,8 @@ class ROS2
return _instance;
}
static std::shared_ptr<DdsDomainParticipantImpl> GetDdsDomainParticipant();
// general
void Enable(bool enable);
void Shutdown();
@ -148,6 +151,7 @@ void ProcessDataFromCollisionSensor(
ROS2() {};
static std::shared_ptr<ROS2> _instance;
std::shared_ptr<DdsDomainParticipantImpl> _domain_participant_impl;
bool _enabled { false };
uint64_t _frame { 0 };

View File

@ -0,0 +1,51 @@
// Copyright (c) 2022 Computer Vision Center (CVC) at the Universitat Autonoma de Barcelona (UAB).
// This work is licensed under the terms of the MIT license.
// For a copy, see <https://opensource.org/licenses/MIT>.
#include "carla/ros2/impl/DdsDomainParticipantImpl.h"
#include <cstdlib>
#include <string>
#include <fastdds/dds/domain/DomainParticipantFactory.hpp>
#include <fastdds/dds/domain/qos/DomainParticipantQos.hpp>
#include "carla/Logging.h"
namespace carla {
namespace ros2 {
DdsDomainParticipantImpl::DdsDomainParticipantImpl() {
_factory = eprosima::fastdds::dds::DomainParticipantFactory::get_shared_instance();
if (_factory == nullptr) {
carla::log_error("DdsDomainParticipantImpl(): Failed to acquire DomainParticipantFactory");
return;
}
const char *ros_domain_id_env = std::getenv("ROS_DOMAIN_ID");
unsigned int ros_domain_id = 0;
if ( ros_domain_id_env != nullptr ) {
try {
ros_domain_id = (unsigned int)(std::atoi(ros_domain_id_env));
} catch (...) {
ros_domain_id = 0;
}
}
auto pqos = eprosima::fastdds::dds::PARTICIPANT_QOS_DEFAULT;
pqos.name("carla-server");
_participant = _factory->create_participant(ros_domain_id, pqos);
if (_participant == nullptr) {
carla::log_error("DdsDomainParticipantImpl(): Failed to create DomainParticipant");
}
}
DdsDomainParticipantImpl::~DdsDomainParticipantImpl() {
carla::log_warning("DdsDomainParticipantImpl::Destructor()");
if ((_participant != nullptr) && (_factory != nullptr)) {
_factory->delete_participant(_participant);
_participant=nullptr;
}
}
} // namespace ros2
} // namespace carla

View File

@ -0,0 +1,30 @@
// Copyright (c) 2022 Computer Vision Center (CVC) at the Universitat Autonoma de Barcelona (UAB).
// This work is licensed under the terms of the MIT license.
// For a copy, see <https://opensource.org/licenses/MIT>.
#pragma once
#include <fastdds/dds/domain/DomainParticipant.hpp>
#include <fastdds/dds/domain/DomainParticipantFactory.hpp>
namespace carla {
namespace ros2 {
class DdsDomainParticipantImpl {
public:
DdsDomainParticipantImpl();
~DdsDomainParticipantImpl();
eprosima::fastdds::dds::DomainParticipant* GetDomainParticipant() {
return _participant;
}
private:
eprosima::fastdds::dds::DomainParticipant* _participant{nullptr};
// keep also a copy of the factory that the underlying DDS is keeping their stuff up
std::shared_ptr<eprosima::fastdds::dds::DomainParticipantFactory> _factory;
};
} // namespace ros2
} // namespace carla

View File

@ -13,8 +13,8 @@
#include <fastdds/dds/publisher/DataWriter.hpp>
#include <fastdds/dds/topic/TypeSupport.hpp>
#include <fastdds/dds/domain/qos/DomainParticipantQos.hpp>
#include <fastdds/dds/domain/DomainParticipantFactory.hpp>
#include <carla/ros2/ROS2.h>
#include <carla/ros2/impl/DdsDomainParticipantImpl.h>
#include <fastdds/dds/publisher/qos/PublisherQos.hpp>
#include <fastdds/dds/topic/qos/TopicQos.hpp>
@ -30,7 +30,6 @@ namespace ros2 {
using erc = eprosima::fastrtps::types::ReturnCode_t;
struct CarlaClockPublisherImpl {
efd::DomainParticipant* _participant { nullptr };
efd::Publisher* _publisher { nullptr };
efd::Topic* _topic { nullptr };
efd::DataWriter* _datawriter { nullptr };
@ -44,18 +43,12 @@ namespace ros2 {
std::cerr << "Invalid TypeSupport" << std::endl;
return false;
}
efd::DomainParticipantQos pqos = efd::PARTICIPANT_QOS_DEFAULT;
pqos.name(_name);
auto factory = efd::DomainParticipantFactory::get_instance();
_impl->_participant = factory->create_participant(0, pqos);
if (_impl->_participant == nullptr) {
std::cerr << "Failed to create DomainParticipant" << std::endl;
return false;
}
_impl->_type.register_type(_impl->_participant);
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();;
_impl->_type.register_type(participant);
efd::PublisherQos pubqos = efd::PUBLISHER_QOS_DEFAULT;
_impl->_publisher = _impl->_participant->create_publisher(pubqos, nullptr);
_impl->_publisher = participant->create_publisher(pubqos, nullptr);
if (_impl->_publisher == nullptr) {
std::cerr << "Failed to create Publisher" << std::endl;
return false;
@ -63,7 +56,7 @@ namespace ros2 {
efd::TopicQos tqos = efd::TOPIC_QOS_DEFAULT;
const std::string topic_name { "rt/clock" };
_impl->_topic = _impl->_participant->create_topic(topic_name, _impl->_type->getName(), tqos);
_impl->_topic = participant->create_topic(topic_name, _impl->_type->getName(), tqos);
if (_impl->_topic == nullptr) {
std::cerr << "Failed to create Topic" << std::endl;
return false;
@ -157,17 +150,16 @@ namespace ros2 {
if (!_impl)
return;
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
if (_impl->_datawriter)
_impl->_publisher->delete_datawriter(_impl->_datawriter);
if (_impl->_publisher)
_impl->_participant->delete_publisher(_impl->_publisher);
participant->delete_publisher(_impl->_publisher);
if (_impl->_topic)
_impl->_participant->delete_topic(_impl->_topic);
participant->delete_topic(_impl->_topic);
if (_impl->_participant)
efd::DomainParticipantFactory::get_instance()->delete_participant(_impl->_participant);
}
CarlaClockPublisher::CarlaClockPublisher(const CarlaClockPublisher& other) {

View File

@ -13,8 +13,8 @@
#include <fastdds/dds/publisher/DataWriter.hpp>
#include <fastdds/dds/topic/TypeSupport.hpp>
#include <fastdds/dds/domain/qos/DomainParticipantQos.hpp>
#include <fastdds/dds/domain/DomainParticipantFactory.hpp>
#include <carla/ros2/ROS2.h>
#include <carla/ros2/impl/DdsDomainParticipantImpl.h>
#include <fastdds/dds/publisher/qos/PublisherQos.hpp>
#include <fastdds/dds/topic/qos/TopicQos.hpp>
@ -31,7 +31,6 @@ namespace ros2 {
using erc = eprosima::fastrtps::types::ReturnCode_t;
struct CarlaCollisionPublisherImpl {
efd::DomainParticipant* _participant { nullptr };
efd::Publisher* _publisher { nullptr };
efd::Topic* _topic { nullptr };
efd::DataWriter* _datawriter { nullptr };
@ -46,18 +45,12 @@ namespace ros2 {
return false;
}
efd::DomainParticipantQos pqos = efd::PARTICIPANT_QOS_DEFAULT;
pqos.name(_name);
auto factory = efd::DomainParticipantFactory::get_instance();
_impl->_participant = factory->create_participant(0, pqos);
if (_impl->_participant == nullptr) {
std::cerr << "Failed to create DomainParticipant" << std::endl;
return false;
}
_impl->_type.register_type(_impl->_participant);
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
_impl->_type.register_type(participant);
efd::PublisherQos pubqos = efd::PUBLISHER_QOS_DEFAULT;
_impl->_publisher = _impl->_participant->create_publisher(pubqos, nullptr);
_impl->_publisher = participant->create_publisher(pubqos, nullptr);
if (_impl->_publisher == nullptr) {
std::cerr << "Failed to create Publisher" << std::endl;
return false;
@ -69,7 +62,7 @@ namespace ros2 {
if (!_parent.empty())
topic_name += _parent + "/";
topic_name += _name;
_impl->_topic = _impl->_participant->create_topic(topic_name, _impl->_type->getName(), tqos);
_impl->_topic = participant->create_topic(topic_name, _impl->_type->getName(), tqos);
if (_impl->_topic == nullptr) {
std::cerr << "Failed to create Topic" << std::endl;
return false;
@ -183,17 +176,16 @@ void CarlaCollisionPublisher::SetData(int32_t seconds, uint32_t nanoseconds, uin
if (!_impl)
return;
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
if (_impl->_datawriter)
_impl->_publisher->delete_datawriter(_impl->_datawriter);
if (_impl->_publisher)
_impl->_participant->delete_publisher(_impl->_publisher);
participant->delete_publisher(_impl->_publisher);
if (_impl->_topic)
_impl->_participant->delete_topic(_impl->_topic);
participant->delete_topic(_impl->_topic);
if (_impl->_participant)
efd::DomainParticipantFactory::get_instance()->delete_participant(_impl->_participant);
}
CarlaCollisionPublisher::CarlaCollisionPublisher(const CarlaCollisionPublisher& other) {

View File

@ -17,8 +17,8 @@
#include <fastdds/dds/publisher/DataWriter.hpp>
#include <fastdds/dds/topic/TypeSupport.hpp>
#include <fastdds/dds/domain/qos/DomainParticipantQos.hpp>
#include <fastdds/dds/domain/DomainParticipantFactory.hpp>
#include <carla/ros2/ROS2.h>
#include <carla/ros2/impl/DdsDomainParticipantImpl.h>
#include <fastdds/dds/publisher/qos/PublisherQos.hpp>
#include <fastdds/dds/topic/qos/TopicQos.hpp>
@ -35,7 +35,6 @@ namespace ros2 {
using erc = eprosima::fastrtps::types::ReturnCode_t;
struct CarlaDVSCameraPublisherImpl {
efd::DomainParticipant* _participant { nullptr };
efd::Publisher* _publisher { nullptr };
efd::Topic* _topic { nullptr };
efd::DataWriter* _datawriter { nullptr };
@ -45,7 +44,6 @@ namespace ros2 {
};
struct CarlaCameraInfoPublisherImpl {
efd::DomainParticipant* _participant { nullptr };
efd::Publisher* _publisher { nullptr };
efd::Topic* _topic { nullptr };
efd::DataWriter* _datawriter { nullptr };
@ -56,7 +54,6 @@ namespace ros2 {
};
struct CarlaPointCloudPublisherImpl {
efd::DomainParticipant* _participant { nullptr };
efd::Publisher* _publisher { nullptr };
efd::Topic* _topic { nullptr };
efd::DataWriter* _datawriter { nullptr };
@ -85,18 +82,12 @@ namespace ros2 {
return false;
}
efd::DomainParticipantQos pqos = efd::PARTICIPANT_QOS_DEFAULT;
pqos.name(_name);
auto factory = efd::DomainParticipantFactory::get_instance();
_impl->_participant = factory->create_participant(0, pqos);
if (_impl->_participant == nullptr) {
std::cerr << "Failed to create DomainParticipant" << std::endl;
return false;
}
_impl->_type.register_type(_impl->_participant);
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
_impl->_type.register_type(participant);
efd::PublisherQos pubqos = efd::PUBLISHER_QOS_DEFAULT;
_impl->_publisher = _impl->_participant->create_publisher(pubqos, nullptr);
_impl->_publisher = participant->create_publisher(pubqos, nullptr);
if (_impl->_publisher == nullptr) {
std::cerr << "Failed to create Publisher" << std::endl;
return false;
@ -110,7 +101,7 @@ namespace ros2 {
topic_name += _parent + "/";
topic_name += _name;
topic_name += publisher_type;
_impl->_topic = _impl->_participant->create_topic(topic_name, _impl->_type->getName(), tqos);
_impl->_topic = participant->create_topic(topic_name, _impl->_type->getName(), tqos);
if (_impl->_topic == nullptr) {
std::cerr << "Failed to create Topic" << std::endl;
return false;
@ -134,18 +125,11 @@ namespace ros2 {
return false;
}
efd::DomainParticipantQos pqos = efd::PARTICIPANT_QOS_DEFAULT;
pqos.name(_name);
auto factory = efd::DomainParticipantFactory::get_instance();
_info->_participant = factory->create_participant(0, pqos);
if (_info->_participant == nullptr) {
std::cerr << "Failed to create DomainParticipant" << std::endl;
return false;
}
_info->_type.register_type(_info->_participant);
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
_info->_type.register_type(participant);
efd::PublisherQos pubqos = efd::PUBLISHER_QOS_DEFAULT;
_info->_publisher = _info->_participant->create_publisher(pubqos, nullptr);
_info->_publisher = participant->create_publisher(pubqos, nullptr);
if (_info->_publisher == nullptr) {
std::cerr << "Failed to create Publisher" << std::endl;
return false;
@ -159,7 +143,7 @@ namespace ros2 {
topic_name += _parent + "/";
topic_name += _name;
topic_name += publisher_type;
_info->_topic = _info->_participant->create_topic(topic_name, _info->_type->getName(), tqos);
_info->_topic = participant->create_topic(topic_name, _info->_type->getName(), tqos);
if (_info->_topic == nullptr) {
std::cerr << "Failed to create Topic" << std::endl;
return false;
@ -182,18 +166,11 @@ namespace ros2 {
return false;
}
efd::DomainParticipantQos pqos = efd::PARTICIPANT_QOS_DEFAULT;
pqos.name(_name);
auto factory = efd::DomainParticipantFactory::get_instance();
_point_cloud->_participant = factory->create_participant(0, pqos);
if (_point_cloud->_participant == nullptr) {
std::cerr << "Failed to create DomainParticipant" << std::endl;
return false;
}
_point_cloud->_type.register_type(_point_cloud->_participant);
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
_point_cloud->_type.register_type(participant);
efd::PublisherQos pubqos = efd::PUBLISHER_QOS_DEFAULT;
_point_cloud->_publisher = _point_cloud->_participant->create_publisher(pubqos, nullptr);
_point_cloud->_publisher = participant->create_publisher(pubqos, nullptr);
if (_point_cloud->_publisher == nullptr) {
std::cerr << "Failed to create Publisher" << std::endl;
return false;
@ -207,7 +184,7 @@ namespace ros2 {
topic_name += _parent + "/";
topic_name += _name;
topic_name += publisher_type;
_point_cloud->_topic = _point_cloud->_participant->create_topic(topic_name, _point_cloud->_type->getName(), tqos);
_point_cloud->_topic = participant->create_topic(topic_name, _point_cloud->_type->getName(), tqos);
if (_point_cloud->_topic == nullptr) {
std::cerr << "Failed to create Topic" << std::endl;
return false;
@ -519,17 +496,16 @@ namespace ros2 {
if (!_impl)
return;
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
if (_impl->_datawriter)
_impl->_publisher->delete_datawriter(_impl->_datawriter);
if (_impl->_publisher)
_impl->_participant->delete_publisher(_impl->_publisher);
participant->delete_publisher(_impl->_publisher);
if (_impl->_topic)
_impl->_participant->delete_topic(_impl->_topic);
participant->delete_topic(_impl->_topic);
if (_impl->_participant)
efd::DomainParticipantFactory::get_instance()->delete_participant(_impl->_participant);
if (!_info)
return;
@ -538,13 +514,10 @@ namespace ros2 {
_info->_publisher->delete_datawriter(_info->_datawriter);
if (_info->_publisher)
_info->_participant->delete_publisher(_info->_publisher);
participant->delete_publisher(_info->_publisher);
if (_info->_topic)
_info->_participant->delete_topic(_info->_topic);
if (_info->_participant)
efd::DomainParticipantFactory::get_instance()->delete_participant(_info->_participant);
participant->delete_topic(_info->_topic);
if (!_point_cloud)
return;
@ -553,13 +526,10 @@ namespace ros2 {
_point_cloud->_publisher->delete_datawriter(_point_cloud->_datawriter);
if (_point_cloud->_publisher)
_point_cloud->_participant->delete_publisher(_point_cloud->_publisher);
participant->delete_publisher(_point_cloud->_publisher);
if (_point_cloud->_topic)
_point_cloud->_participant->delete_topic(_point_cloud->_topic);
if (_point_cloud->_participant)
efd::DomainParticipantFactory::get_instance()->delete_participant(_point_cloud->_participant);
participant->delete_topic(_point_cloud->_topic);
}
CarlaDVSCameraPublisher::CarlaDVSCameraPublisher(const CarlaDVSCameraPublisher& other) {

View File

@ -14,8 +14,8 @@
#include <fastdds/dds/publisher/DataWriter.hpp>
#include <fastdds/dds/topic/TypeSupport.hpp>
#include <fastdds/dds/domain/qos/DomainParticipantQos.hpp>
#include <fastdds/dds/domain/DomainParticipantFactory.hpp>
#include <carla/ros2/ROS2.h>
#include <carla/ros2/impl/DdsDomainParticipantImpl.h>
#include <fastdds/dds/publisher/qos/PublisherQos.hpp>
#include <fastdds/dds/topic/qos/TopicQos.hpp>
@ -32,7 +32,6 @@ namespace ros2 {
using erc = eprosima::fastrtps::types::ReturnCode_t;
struct CarlaDepthCameraPublisherImpl {
efd::DomainParticipant* _participant { nullptr };
efd::Publisher* _publisher { nullptr };
efd::Topic* _topic { nullptr };
efd::DataWriter* _datawriter { nullptr };
@ -42,7 +41,6 @@ namespace ros2 {
};
struct CarlaCameraInfoPublisherImpl {
efd::DomainParticipant* _participant { nullptr };
efd::Publisher* _publisher { nullptr };
efd::Topic* _topic { nullptr };
efd::DataWriter* _datawriter { nullptr };
@ -72,18 +70,12 @@ namespace ros2 {
return false;
}
efd::DomainParticipantQos pqos = efd::PARTICIPANT_QOS_DEFAULT;
pqos.name(_name);
auto factory = efd::DomainParticipantFactory::get_instance();
_impl->_participant = factory->create_participant(0, pqos);
if (_impl->_participant == nullptr) {
std::cerr << "Failed to create DomainParticipant" << std::endl;
return false;
}
_impl->_type.register_type(_impl->_participant);
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
_impl->_type.register_type(participant);
efd::PublisherQos pubqos = efd::PUBLISHER_QOS_DEFAULT;
_impl->_publisher = _impl->_participant->create_publisher(pubqos, nullptr);
_impl->_publisher = participant->create_publisher(pubqos, nullptr);
if (_impl->_publisher == nullptr) {
std::cerr << "Failed to create Publisher" << std::endl;
return false;
@ -97,7 +89,7 @@ namespace ros2 {
topic_name += _parent + "/";
topic_name += _name;
topic_name += publisher_type;
_impl->_topic = _impl->_participant->create_topic(topic_name, _impl->_type->getName(), tqos);
_impl->_topic = participant->create_topic(topic_name, _impl->_type->getName(), tqos);
if (_impl->_topic == nullptr) {
std::cerr << "Failed to create Topic" << std::endl;
return false;
@ -121,18 +113,11 @@ namespace ros2 {
return false;
}
efd::DomainParticipantQos pqos = efd::PARTICIPANT_QOS_DEFAULT;
pqos.name(_name);
auto factory = efd::DomainParticipantFactory::get_instance();
_impl_info->_participant = factory->create_participant(0, pqos);
if (_impl_info->_participant == nullptr) {
std::cerr << "Failed to create DomainParticipant" << std::endl;
return false;
}
_impl_info->_type.register_type(_impl_info->_participant);
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
_impl_info->_type.register_type(participant);
efd::PublisherQos pubqos = efd::PUBLISHER_QOS_DEFAULT;
_impl_info->_publisher = _impl_info->_participant->create_publisher(pubqos, nullptr);
_impl_info->_publisher = participant->create_publisher(pubqos, nullptr);
if (_impl_info->_publisher == nullptr) {
std::cerr << "Failed to create Publisher" << std::endl;
return false;
@ -146,7 +131,7 @@ namespace ros2 {
topic_name += _parent + "/";
topic_name += _name;
topic_name += publisher_type;
_impl_info->_topic = _impl_info->_participant->create_topic(topic_name, _impl_info->_type->getName(), tqos);
_impl_info->_topic = participant->create_topic(topic_name, _impl_info->_type->getName(), tqos);
if (_impl_info->_topic == nullptr) {
std::cerr << "Failed to create Topic" << std::endl;
return false;
@ -348,17 +333,16 @@ namespace ros2 {
if (!_impl)
return;
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
if (_impl->_datawriter)
_impl->_publisher->delete_datawriter(_impl->_datawriter);
if (_impl->_publisher)
_impl->_participant->delete_publisher(_impl->_publisher);
participant->delete_publisher(_impl->_publisher);
if (_impl->_topic)
_impl->_participant->delete_topic(_impl->_topic);
participant->delete_topic(_impl->_topic);
if (_impl->_participant)
efd::DomainParticipantFactory::get_instance()->delete_participant(_impl->_participant);
if (!_impl_info)
return;
@ -367,13 +351,10 @@ namespace ros2 {
_impl_info->_publisher->delete_datawriter(_impl_info->_datawriter);
if (_impl_info->_publisher)
_impl_info->_participant->delete_publisher(_impl_info->_publisher);
participant->delete_publisher(_impl_info->_publisher);
if (_impl_info->_topic)
_impl_info->_participant->delete_topic(_impl_info->_topic);
if (_impl_info->_participant)
efd::DomainParticipantFactory::get_instance()->delete_participant(_impl_info->_participant);
participant->delete_topic(_impl_info->_topic);
}
CarlaDepthCameraPublisher::CarlaDepthCameraPublisher(const CarlaDepthCameraPublisher& other) {

View File

@ -13,8 +13,8 @@
#include <fastdds/dds/publisher/DataWriter.hpp>
#include <fastdds/dds/topic/TypeSupport.hpp>
#include <fastdds/dds/domain/qos/DomainParticipantQos.hpp>
#include <fastdds/dds/domain/DomainParticipantFactory.hpp>
#include <carla/ros2/ROS2.h>
#include <carla/ros2/impl/DdsDomainParticipantImpl.h>
#include <fastdds/dds/publisher/qos/PublisherQos.hpp>
#include <fastdds/dds/topic/qos/TopicQos.hpp>
@ -30,7 +30,6 @@ namespace ros2 {
using erc = eprosima::fastrtps::types::ReturnCode_t;
struct CarlaGNSSPublisherImpl {
efd::DomainParticipant* _participant { nullptr };
efd::Publisher* _publisher { nullptr };
efd::Topic* _topic { nullptr };
efd::DataWriter* _datawriter { nullptr };
@ -45,18 +44,12 @@ namespace ros2 {
return false;
}
efd::DomainParticipantQos pqos = efd::PARTICIPANT_QOS_DEFAULT;
pqos.name(_name);
auto factory = efd::DomainParticipantFactory::get_instance();
_impl->_participant = factory->create_participant(0, pqos);
if (_impl->_participant == nullptr) {
std::cerr << "Failed to create DomainParticipant" << std::endl;
return false;
}
_impl->_type.register_type(_impl->_participant);
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
_impl->_type.register_type(participant);
efd::PublisherQos pubqos = efd::PUBLISHER_QOS_DEFAULT;
_impl->_publisher = _impl->_participant->create_publisher(pubqos, nullptr);
_impl->_publisher = participant->create_publisher(pubqos, nullptr);
if (_impl->_publisher == nullptr) {
std::cerr << "Failed to create Publisher" << std::endl;
return false;
@ -68,7 +61,7 @@ namespace ros2 {
if (!_parent.empty())
topic_name += _parent + "/";
topic_name += _name;
_impl->_topic = _impl->_participant->create_topic(topic_name, _impl->_type->getName(), tqos);
_impl->_topic = participant->create_topic(topic_name, _impl->_type->getName(), tqos);
if (_impl->_topic == nullptr) {
std::cerr << "Failed to create Topic" << std::endl;
return false;
@ -173,17 +166,16 @@ namespace ros2 {
if (!_impl)
return;
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
if (_impl->_datawriter)
_impl->_publisher->delete_datawriter(_impl->_datawriter);
if (_impl->_publisher)
_impl->_participant->delete_publisher(_impl->_publisher);
participant->delete_publisher(_impl->_publisher);
if (_impl->_topic)
_impl->_participant->delete_topic(_impl->_topic);
participant->delete_topic(_impl->_topic);
if (_impl->_participant)
efd::DomainParticipantFactory::get_instance()->delete_participant(_impl->_participant);
}
CarlaGNSSPublisher::CarlaGNSSPublisher(const CarlaGNSSPublisher& other) {

View File

@ -13,8 +13,8 @@
#include <fastdds/dds/publisher/DataWriter.hpp>
#include <fastdds/dds/topic/TypeSupport.hpp>
#include <fastdds/dds/domain/qos/DomainParticipantQos.hpp>
#include <fastdds/dds/domain/DomainParticipantFactory.hpp>
#include <carla/ros2/ROS2.h>
#include <carla/ros2/impl/DdsDomainParticipantImpl.h>
#include <fastdds/dds/publisher/qos/PublisherQos.hpp>
#include <fastdds/dds/topic/qos/TopicQos.hpp>
@ -30,7 +30,6 @@ namespace ros2 {
using erc = eprosima::fastrtps::types::ReturnCode_t;
struct CarlaIMUPublisherImpl {
efd::DomainParticipant* _participant { nullptr };
efd::Publisher* _publisher { nullptr };
efd::Topic* _topic { nullptr };
efd::DataWriter* _datawriter { nullptr };
@ -45,18 +44,12 @@ namespace ros2 {
return false;
}
efd::DomainParticipantQos pqos = efd::PARTICIPANT_QOS_DEFAULT;
pqos.name(_name);
auto factory = efd::DomainParticipantFactory::get_instance();
_impl->_participant = factory->create_participant(0, pqos);
if (_impl->_participant == nullptr) {
std::cerr << "Failed to create DomainParticipant" << std::endl;
return false;
}
_impl->_type.register_type(_impl->_participant);
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
_impl->_type.register_type(participant);
efd::PublisherQos pubqos = efd::PUBLISHER_QOS_DEFAULT;
_impl->_publisher = _impl->_participant->create_publisher(pubqos, nullptr);
_impl->_publisher = participant->create_publisher(pubqos, nullptr);
if (_impl->_publisher == nullptr) {
std::cerr << "Failed to create Publisher" << std::endl;
return false;
@ -68,7 +61,7 @@ namespace ros2 {
if (!_parent.empty())
topic_name += _parent + "/";
topic_name += _name;
_impl->_topic = _impl->_participant->create_topic(topic_name, _impl->_type->getName(), tqos);
_impl->_topic = participant->create_topic(topic_name, _impl->_type->getName(), tqos);
if (_impl->_topic == nullptr) {
std::cerr << "Failed to create Topic" << std::endl;
return false;
@ -175,7 +168,7 @@ namespace ros2 {
geometry_msgs::msg::Quaternion orientation;
const float rx = 0.0f; // pitch
const float ry = (M_PIf32 / 2.0f) - compass; // yaw
const float ry = (float(M_PI_2) / 2.0f) - compass; // yaw
const float rz = 0.0f; // roll
const float cr = cosf(rz * 0.5f);
@ -206,17 +199,16 @@ namespace ros2 {
if (!_impl)
return;
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
if (_impl->_datawriter)
_impl->_publisher->delete_datawriter(_impl->_datawriter);
if (_impl->_publisher)
_impl->_participant->delete_publisher(_impl->_publisher);
participant->delete_publisher(_impl->_publisher);
if (_impl->_topic)
_impl->_participant->delete_topic(_impl->_topic);
participant->delete_topic(_impl->_topic);
if (_impl->_participant)
efd::DomainParticipantFactory::get_instance()->delete_participant(_impl->_participant);
}
CarlaIMUPublisher::CarlaIMUPublisher(const CarlaIMUPublisher& other) {

View File

@ -14,8 +14,8 @@
#include <fastdds/dds/publisher/DataWriter.hpp>
#include <fastdds/dds/topic/TypeSupport.hpp>
#include <fastdds/dds/domain/qos/DomainParticipantQos.hpp>
#include <fastdds/dds/domain/DomainParticipantFactory.hpp>
#include <carla/ros2/ROS2.h>
#include <carla/ros2/impl/DdsDomainParticipantImpl.h>
#include <fastdds/dds/publisher/qos/PublisherQos.hpp>
#include <fastdds/dds/topic/qos/TopicQos.hpp>
@ -31,7 +31,6 @@ namespace ros2 {
using erc = eprosima::fastrtps::types::ReturnCode_t;
struct CarlaISCameraPublisherImpl {
efd::DomainParticipant* _participant { nullptr };
efd::Publisher* _publisher { nullptr };
efd::Topic* _topic { nullptr };
efd::DataWriter* _datawriter { nullptr };
@ -41,7 +40,6 @@ namespace ros2 {
};
struct CarlaCameraInfoPublisherImpl {
efd::DomainParticipant* _participant { nullptr };
efd::Publisher* _publisher { nullptr };
efd::Topic* _topic { nullptr };
efd::DataWriter* _datawriter { nullptr };
@ -70,18 +68,12 @@ namespace ros2 {
std::cerr << "Invalid TypeSupport" << std::endl;
return false;
}
efd::DomainParticipantQos pqos = efd::PARTICIPANT_QOS_DEFAULT;
pqos.name(_name);
auto factory = efd::DomainParticipantFactory::get_instance();
_impl->_participant = factory->create_participant(0, pqos);
if (_impl->_participant == nullptr) {
std::cerr << "Failed to create DomainParticipant" << std::endl;
return false;
}
_impl->_type.register_type(_impl->_participant);
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
_impl->_type.register_type(participant);
efd::PublisherQos pubqos = efd::PUBLISHER_QOS_DEFAULT;
_impl->_publisher = _impl->_participant->create_publisher(pubqos, nullptr);
_impl->_publisher = participant->create_publisher(pubqos, nullptr);
if (_impl->_publisher == nullptr) {
std::cerr << "Failed to create Publisher" << std::endl;
return false;
@ -95,7 +87,7 @@ namespace ros2 {
topic_name += _parent + "/";
topic_name += _name;
topic_name += publisher_type;
_impl->_topic = _impl->_participant->create_topic(topic_name, _impl->_type->getName(), tqos);
_impl->_topic = participant->create_topic(topic_name, _impl->_type->getName(), tqos);
if (_impl->_topic == nullptr) {
std::cerr << "Failed to create Topic" << std::endl;
return false;
@ -119,18 +111,11 @@ namespace ros2 {
return false;
}
efd::DomainParticipantQos pqos = efd::PARTICIPANT_QOS_DEFAULT;
pqos.name(_name);
auto factory = efd::DomainParticipantFactory::get_instance();
_impl_info->_participant = factory->create_participant(0, pqos);
if (_impl_info->_participant == nullptr) {
std::cerr << "Failed to create DomainParticipant" << std::endl;
return false;
}
_impl_info->_type.register_type(_impl_info->_participant);
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
_impl_info->_type.register_type(participant);
efd::PublisherQos pubqos = efd::PUBLISHER_QOS_DEFAULT;
_impl_info->_publisher = _impl_info->_participant->create_publisher(pubqos, nullptr);
_impl_info->_publisher = participant->create_publisher(pubqos, nullptr);
if (_impl_info->_publisher == nullptr) {
std::cerr << "Failed to create Publisher" << std::endl;
return false;
@ -144,7 +129,7 @@ namespace ros2 {
topic_name += _parent + "/";
topic_name += _name;
topic_name += publisher_type;
_impl_info->_topic = _impl_info->_participant->create_topic(topic_name, _impl_info->_type->getName(), tqos);
_impl_info->_topic = participant->create_topic(topic_name, _impl_info->_type->getName(), tqos);
if (_impl_info->_topic == nullptr) {
std::cerr << "Failed to create Topic" << std::endl;
return false;
@ -347,17 +332,16 @@ namespace ros2 {
if (!_impl)
return;
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
if (_impl->_datawriter)
_impl->_publisher->delete_datawriter(_impl->_datawriter);
if (_impl->_publisher)
_impl->_participant->delete_publisher(_impl->_publisher);
participant->delete_publisher(_impl->_publisher);
if (_impl->_topic)
_impl->_participant->delete_topic(_impl->_topic);
participant->delete_topic(_impl->_topic);
if (_impl->_participant)
efd::DomainParticipantFactory::get_instance()->delete_participant(_impl->_participant);
if (!_impl_info)
return;
@ -366,13 +350,10 @@ namespace ros2 {
_impl_info->_publisher->delete_datawriter(_impl_info->_datawriter);
if (_impl_info->_publisher)
_impl_info->_participant->delete_publisher(_impl_info->_publisher);
participant->delete_publisher(_impl_info->_publisher);
if (_impl_info->_topic)
_impl_info->_participant->delete_topic(_impl_info->_topic);
if (_impl_info->_participant)
efd::DomainParticipantFactory::get_instance()->delete_participant(_impl_info->_participant);
participant->delete_topic(_impl_info->_topic);
}
CarlaISCameraPublisher::CarlaISCameraPublisher(const CarlaISCameraPublisher& other) {

View File

@ -13,8 +13,8 @@
#include <fastdds/dds/publisher/DataWriter.hpp>
#include <fastdds/dds/topic/TypeSupport.hpp>
#include <fastdds/dds/domain/qos/DomainParticipantQos.hpp>
#include <fastdds/dds/domain/DomainParticipantFactory.hpp>
#include <carla/ros2/ROS2.h>
#include <carla/ros2/impl/DdsDomainParticipantImpl.h>
#include <fastdds/dds/publisher/qos/PublisherQos.hpp>
#include <fastdds/dds/topic/qos/TopicQos.hpp>
@ -30,7 +30,6 @@ namespace ros2 {
using erc = eprosima::fastrtps::types::ReturnCode_t;
struct CarlaLidarPublisherImpl {
efd::DomainParticipant* _participant { nullptr };
efd::Publisher* _publisher { nullptr };
efd::Topic* _topic { nullptr };
efd::DataWriter* _datawriter { nullptr };
@ -45,18 +44,12 @@ namespace ros2 {
return false;
}
efd::DomainParticipantQos pqos = efd::PARTICIPANT_QOS_DEFAULT;
pqos.name(_name);
auto factory = efd::DomainParticipantFactory::get_instance();
_impl->_participant = factory->create_participant(0, pqos);
if (_impl->_participant == nullptr) {
std::cerr << "Failed to create DomainParticipant" << std::endl;
return false;
}
_impl->_type.register_type(_impl->_participant);
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
_impl->_type.register_type(participant);
efd::PublisherQos pubqos = efd::PUBLISHER_QOS_DEFAULT;
_impl->_publisher = _impl->_participant->create_publisher(pubqos, nullptr);
_impl->_publisher = participant->create_publisher(pubqos, nullptr);
if (_impl->_publisher == nullptr) {
std::cerr << "Failed to create Publisher" << std::endl;
return false;
@ -68,7 +61,7 @@ namespace ros2 {
if (!_parent.empty())
topic_name += _parent + "/";
topic_name += _name;
_impl->_topic = _impl->_participant->create_topic(topic_name, _impl->_type->getName(), tqos);
_impl->_topic = participant->create_topic(topic_name, _impl->_type->getName(), tqos);
if (_impl->_topic == nullptr) {
std::cerr << "Failed to create Topic" << std::endl;
return false;
@ -214,17 +207,16 @@ void CarlaLidarPublisher::SetData(int32_t seconds, uint32_t nanoseconds, size_t
if (!_impl)
return;
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
if (_impl->_datawriter)
_impl->_publisher->delete_datawriter(_impl->_datawriter);
if (_impl->_publisher)
_impl->_participant->delete_publisher(_impl->_publisher);
participant->delete_publisher(_impl->_publisher);
if (_impl->_topic)
_impl->_participant->delete_topic(_impl->_topic);
participant->delete_topic(_impl->_topic);
if (_impl->_participant)
efd::DomainParticipantFactory::get_instance()->delete_participant(_impl->_participant);
}
CarlaLidarPublisher::CarlaLidarPublisher(const CarlaLidarPublisher& other) {

View File

@ -13,8 +13,8 @@
#include <fastdds/dds/publisher/DataWriter.hpp>
#include <fastdds/dds/topic/TypeSupport.hpp>
#include <fastdds/dds/domain/qos/DomainParticipantQos.hpp>
#include <fastdds/dds/domain/DomainParticipantFactory.hpp>
#include <carla/ros2/ROS2.h>
#include <carla/ros2/impl/DdsDomainParticipantImpl.h>
#include <fastdds/dds/publisher/qos/PublisherQos.hpp>
#include <fastdds/dds/topic/qos/TopicQos.hpp>
@ -30,7 +30,6 @@ namespace ros2 {
using erc = eprosima::fastrtps::types::ReturnCode_t;
struct CarlaLineInvasionPublisherImpl {
efd::DomainParticipant* _participant { nullptr };
efd::Publisher* _publisher { nullptr };
efd::Topic* _topic { nullptr };
efd::DataWriter* _datawriter { nullptr };
@ -45,18 +44,12 @@ namespace ros2 {
return false;
}
efd::DomainParticipantQos pqos = efd::PARTICIPANT_QOS_DEFAULT;
pqos.name(_name);
auto factory = efd::DomainParticipantFactory::get_instance();
_impl->_participant = factory->create_participant(0, pqos);
if (_impl->_participant == nullptr) {
std::cerr << "Failed to create DomainParticipant" << std::endl;
return false;
}
_impl->_type.register_type(_impl->_participant);
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
_impl->_type.register_type(participant);
efd::PublisherQos pubqos = efd::PUBLISHER_QOS_DEFAULT;
_impl->_publisher = _impl->_participant->create_publisher(pubqos, nullptr);
_impl->_publisher = participant->create_publisher(pubqos, nullptr);
if (_impl->_publisher == nullptr) {
std::cerr << "Failed to create Publisher" << std::endl;
return false;
@ -68,7 +61,7 @@ namespace ros2 {
if (!_parent.empty())
topic_name += _parent + "/";
topic_name += _name;
_impl->_topic = _impl->_participant->create_topic(topic_name, _impl->_type->getName(), tqos);
_impl->_topic = participant->create_topic(topic_name, _impl->_type->getName(), tqos);
if (_impl->_topic == nullptr) {
std::cerr << "Failed to create Topic" << std::endl;
return false;
@ -171,17 +164,16 @@ namespace ros2 {
if (!_impl)
return;
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
if (_impl->_datawriter)
_impl->_publisher->delete_datawriter(_impl->_datawriter);
if (_impl->_publisher)
_impl->_participant->delete_publisher(_impl->_publisher);
participant->delete_publisher(_impl->_publisher);
if (_impl->_topic)
_impl->_participant->delete_topic(_impl->_topic);
participant->delete_topic(_impl->_topic);
if (_impl->_participant)
efd::DomainParticipantFactory::get_instance()->delete_participant(_impl->_participant);
}
CarlaLineInvasionPublisher::CarlaLineInvasionPublisher(const CarlaLineInvasionPublisher& other) {

View File

@ -13,8 +13,8 @@
#include <fastdds/dds/publisher/DataWriter.hpp>
#include <fastdds/dds/topic/TypeSupport.hpp>
#include <fastdds/dds/domain/qos/DomainParticipantQos.hpp>
#include <fastdds/dds/domain/DomainParticipantFactory.hpp>
#include <carla/ros2/ROS2.h>
#include <carla/ros2/impl/DdsDomainParticipantImpl.h>
#include <fastdds/dds/publisher/qos/PublisherQos.hpp>
#include <fastdds/dds/topic/qos/TopicQos.hpp>
@ -30,7 +30,6 @@ namespace ros2 {
using erc = eprosima::fastrtps::types::ReturnCode_t;
struct CarlaMapSensorPublisherImpl {
efd::DomainParticipant* _participant { nullptr };
efd::Publisher* _publisher { nullptr };
efd::Topic* _topic { nullptr };
efd::DataWriter* _datawriter { nullptr };
@ -45,18 +44,12 @@ namespace ros2 {
return false;
}
efd::DomainParticipantQos pqos = efd::PARTICIPANT_QOS_DEFAULT;
pqos.name(_name);
auto factory = efd::DomainParticipantFactory::get_instance();
_impl->_participant = factory->create_participant(0, pqos);
if (_impl->_participant == nullptr) {
std::cerr << "Failed to create DomainParticipant" << std::endl;
return false;
}
_impl->_type.register_type(_impl->_participant);
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
_impl->_type.register_type(participant);
efd::PublisherQos pubqos = efd::PUBLISHER_QOS_DEFAULT;
_impl->_publisher = _impl->_participant->create_publisher(pubqos, nullptr);
_impl->_publisher = participant->create_publisher(pubqos, nullptr);
if (_impl->_publisher == nullptr) {
std::cerr << "Failed to create Publisher" << std::endl;
return false;
@ -68,7 +61,7 @@ namespace ros2 {
if (!_parent.empty())
topic_name += _parent + "/";
topic_name += _name;
_impl->_topic = _impl->_participant->create_topic(topic_name, _impl->_type->getName(), tqos);
_impl->_topic = participant->create_topic(topic_name, _impl->_type->getName(), tqos);
if (_impl->_topic == nullptr) {
std::cerr << "Failed to create Topic" << std::endl;
return false;
@ -162,17 +155,16 @@ namespace ros2 {
if (!_impl)
return;
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
if (_impl->_datawriter)
_impl->_publisher->delete_datawriter(_impl->_datawriter);
if (_impl->_publisher)
_impl->_participant->delete_publisher(_impl->_publisher);
participant->delete_publisher(_impl->_publisher);
if (_impl->_topic)
_impl->_participant->delete_topic(_impl->_topic);
participant->delete_topic(_impl->_topic);
if (_impl->_participant)
efd::DomainParticipantFactory::get_instance()->delete_participant(_impl->_participant);
}
CarlaMapSensorPublisher::CarlaMapSensorPublisher(const CarlaMapSensorPublisher& other) {

View File

@ -14,8 +14,8 @@
#include <fastdds/dds/publisher/DataWriter.hpp>
#include <fastdds/dds/topic/TypeSupport.hpp>
#include <fastdds/dds/domain/qos/DomainParticipantQos.hpp>
#include <fastdds/dds/domain/DomainParticipantFactory.hpp>
#include <carla/ros2/ROS2.h>
#include <carla/ros2/impl/DdsDomainParticipantImpl.h>
#include <fastdds/dds/publisher/qos/PublisherQos.hpp>
#include <fastdds/dds/topic/qos/TopicQos.hpp>
@ -32,7 +32,6 @@ namespace ros2 {
using erc = eprosima::fastrtps::types::ReturnCode_t;
struct CarlaNormalsCameraPublisherImpl {
efd::DomainParticipant* _participant { nullptr };
efd::Publisher* _publisher { nullptr };
efd::Topic* _topic { nullptr };
efd::DataWriter* _datawriter { nullptr };
@ -42,7 +41,6 @@ namespace ros2 {
};
struct CarlaCameraInfoPublisherImpl {
efd::DomainParticipant* _participant { nullptr };
efd::Publisher* _publisher { nullptr };
efd::Topic* _topic { nullptr };
efd::DataWriter* _datawriter { nullptr };
@ -72,18 +70,12 @@ namespace ros2 {
return false;
}
efd::DomainParticipantQos pqos = efd::PARTICIPANT_QOS_DEFAULT;
pqos.name(_name);
auto factory = efd::DomainParticipantFactory::get_instance();
_impl->_participant = factory->create_participant(0, pqos);
if (_impl->_participant == nullptr) {
std::cerr << "Failed to create DomainParticipant" << std::endl;
return false;
}
_impl->_type.register_type(_impl->_participant);
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
_impl->_type.register_type(participant);
efd::PublisherQos pubqos = efd::PUBLISHER_QOS_DEFAULT;
_impl->_publisher = _impl->_participant->create_publisher(pubqos, nullptr);
_impl->_publisher = participant->create_publisher(pubqos, nullptr);
if (_impl->_publisher == nullptr) {
std::cerr << "Failed to create Publisher" << std::endl;
return false;
@ -97,7 +89,7 @@ namespace ros2 {
topic_name += _parent + "/";
topic_name += _name;
topic_name += publisher_type;
_impl->_topic = _impl->_participant->create_topic(topic_name, _impl->_type->getName(), tqos);
_impl->_topic = participant->create_topic(topic_name, _impl->_type->getName(), tqos);
if (_impl->_topic == nullptr) {
std::cerr << "Failed to create Topic" << std::endl;
return false;
@ -121,18 +113,11 @@ namespace ros2 {
return false;
}
efd::DomainParticipantQos pqos = efd::PARTICIPANT_QOS_DEFAULT;
pqos.name(_name);
auto factory = efd::DomainParticipantFactory::get_instance();
_impl_info->_participant = factory->create_participant(0, pqos);
if (_impl_info->_participant == nullptr) {
std::cerr << "Failed to create DomainParticipant" << std::endl;
return false;
}
_impl_info->_type.register_type(_impl_info->_participant);
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
_impl_info->_type.register_type(participant);
efd::PublisherQos pubqos = efd::PUBLISHER_QOS_DEFAULT;
_impl_info->_publisher = _impl_info->_participant->create_publisher(pubqos, nullptr);
_impl_info->_publisher = participant->create_publisher(pubqos, nullptr);
if (_impl_info->_publisher == nullptr) {
std::cerr << "Failed to create Publisher" << std::endl;
return false;
@ -146,7 +131,7 @@ namespace ros2 {
topic_name += _parent + "/";
topic_name += _name;
topic_name += publisher_type;
_impl_info->_topic = _impl_info->_participant->create_topic(topic_name, _impl_info->_type->getName(), tqos);
_impl_info->_topic = participant->create_topic(topic_name, _impl_info->_type->getName(), tqos);
if (_impl_info->_topic == nullptr) {
std::cerr << "Failed to create Topic" << std::endl;
return false;
@ -348,17 +333,16 @@ namespace ros2 {
if (!_impl)
return;
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
if (_impl->_datawriter)
_impl->_publisher->delete_datawriter(_impl->_datawriter);
if (_impl->_publisher)
_impl->_participant->delete_publisher(_impl->_publisher);
participant->delete_publisher(_impl->_publisher);
if (_impl->_topic)
_impl->_participant->delete_topic(_impl->_topic);
participant->delete_topic(_impl->_topic);
if (_impl->_participant)
efd::DomainParticipantFactory::get_instance()->delete_participant(_impl->_participant);
if (!_impl_info)
return;
@ -367,13 +351,10 @@ namespace ros2 {
_impl_info->_publisher->delete_datawriter(_impl_info->_datawriter);
if (_impl_info->_publisher)
_impl_info->_participant->delete_publisher(_impl_info->_publisher);
participant->delete_publisher(_impl_info->_publisher);
if (_impl_info->_topic)
_impl_info->_participant->delete_topic(_impl_info->_topic);
if (_impl_info->_participant)
efd::DomainParticipantFactory::get_instance()->delete_participant(_impl_info->_participant);
participant->delete_topic(_impl_info->_topic);
}
CarlaNormalsCameraPublisher::CarlaNormalsCameraPublisher(const CarlaNormalsCameraPublisher& other) {

View File

@ -15,8 +15,8 @@
#include <fastdds/dds/publisher/DataWriter.hpp>
#include <fastdds/dds/topic/TypeSupport.hpp>
#include <fastdds/dds/domain/qos/DomainParticipantQos.hpp>
#include <fastdds/dds/domain/DomainParticipantFactory.hpp>
#include <carla/ros2/ROS2.h>
#include <carla/ros2/impl/DdsDomainParticipantImpl.h>
#include <fastdds/dds/publisher/qos/PublisherQos.hpp>
#include <fastdds/dds/topic/qos/TopicQos.hpp>
@ -36,7 +36,6 @@ namespace ros2 {
namespace efd = eprosima::fastdds::dds;
using erc = eprosima::fastrtps::types::ReturnCode_t;
struct CarlaOpticalFlowCameraPublisherImpl {
efd::DomainParticipant* _participant { nullptr };
efd::Publisher* _publisher { nullptr };
efd::Topic* _topic { nullptr };
efd::DataWriter* _datawriter { nullptr };
@ -46,7 +45,6 @@ namespace ros2 {
};
struct CarlaCameraInfoPublisherImpl {
efd::DomainParticipant* _participant { nullptr };
efd::Publisher* _publisher { nullptr };
efd::Topic* _topic { nullptr };
efd::DataWriter* _datawriter { nullptr };
@ -76,18 +74,12 @@ namespace ros2 {
return false;
}
efd::DomainParticipantQos pqos = efd::PARTICIPANT_QOS_DEFAULT;
pqos.name(_name);
auto factory = efd::DomainParticipantFactory::get_instance();
_impl->_participant = factory->create_participant(0, pqos);
if (_impl->_participant == nullptr) {
std::cerr << "Failed to create DomainParticipant" << std::endl;
return false;
}
_impl->_type.register_type(_impl->_participant);
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
_impl->_type.register_type(participant);
efd::PublisherQos pubqos = efd::PUBLISHER_QOS_DEFAULT;
_impl->_publisher = _impl->_participant->create_publisher(pubqos, nullptr);
_impl->_publisher = participant->create_publisher(pubqos, nullptr);
if (_impl->_publisher == nullptr) {
std::cerr << "Failed to create Publisher" << std::endl;
return false;
@ -101,7 +93,7 @@ namespace ros2 {
topic_name += _parent + "/";
topic_name += _name;
topic_name += publisher_type;
_impl->_topic = _impl->_participant->create_topic(topic_name, _impl->_type->getName(), tqos);
_impl->_topic = participant->create_topic(topic_name, _impl->_type->getName(), tqos);
if (_impl->_topic == nullptr) {
std::cerr << "Failed to create Topic" << std::endl;
return false;
@ -125,18 +117,11 @@ namespace ros2 {
return false;
}
efd::DomainParticipantQos pqos = efd::PARTICIPANT_QOS_DEFAULT;
pqos.name(_name);
auto factory = efd::DomainParticipantFactory::get_instance();
_impl_info->_participant = factory->create_participant(0, pqos);
if (_impl_info->_participant == nullptr) {
std::cerr << "Failed to create DomainParticipant" << std::endl;
return false;
}
_impl_info->_type.register_type(_impl_info->_participant);
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
_impl_info->_type.register_type(participant);
efd::PublisherQos pubqos = efd::PUBLISHER_QOS_DEFAULT;
_impl_info->_publisher = _impl_info->_participant->create_publisher(pubqos, nullptr);
_impl_info->_publisher = participant->create_publisher(pubqos, nullptr);
if (_impl_info->_publisher == nullptr) {
std::cerr << "Failed to create Publisher" << std::endl;
return false;
@ -150,7 +135,7 @@ namespace ros2 {
topic_name += _parent + "/";
topic_name += _name;
topic_name += publisher_type;
_impl_info->_topic = _impl_info->_participant->create_topic(topic_name, _impl_info->_type->getName(), tqos);
_impl_info->_topic = participant->create_topic(topic_name, _impl_info->_type->getName(), tqos);
if (_impl_info->_topic == nullptr) {
std::cerr << "Failed to create Topic" << std::endl;
return false;
@ -430,17 +415,16 @@ namespace ros2 {
if (!_impl)
return;
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
if (_impl->_datawriter)
_impl->_publisher->delete_datawriter(_impl->_datawriter);
if (_impl->_publisher)
_impl->_participant->delete_publisher(_impl->_publisher);
participant->delete_publisher(_impl->_publisher);
if (_impl->_topic)
_impl->_participant->delete_topic(_impl->_topic);
participant->delete_topic(_impl->_topic);
if (_impl->_participant)
efd::DomainParticipantFactory::get_instance()->delete_participant(_impl->_participant);
if (!_impl_info)
return;
@ -449,13 +433,10 @@ namespace ros2 {
_impl_info->_publisher->delete_datawriter(_impl_info->_datawriter);
if (_impl_info->_publisher)
_impl_info->_participant->delete_publisher(_impl_info->_publisher);
participant->delete_publisher(_impl_info->_publisher);
if (_impl_info->_topic)
_impl_info->_participant->delete_topic(_impl_info->_topic);
if (_impl_info->_participant)
efd::DomainParticipantFactory::get_instance()->delete_participant(_impl_info->_participant);
participant->delete_topic(_impl_info->_topic);
}
CarlaOpticalFlowCameraPublisher::CarlaOpticalFlowCameraPublisher(const CarlaOpticalFlowCameraPublisher& other) {

View File

@ -14,8 +14,8 @@
#include <fastdds/dds/publisher/DataWriter.hpp>
#include <fastdds/dds/topic/TypeSupport.hpp>
#include <fastdds/dds/domain/qos/DomainParticipantQos.hpp>
#include <fastdds/dds/domain/DomainParticipantFactory.hpp>
#include <carla/ros2/ROS2.h>
#include <carla/ros2/impl/DdsDomainParticipantImpl.h>
#include <fastdds/dds/publisher/qos/PublisherQos.hpp>
#include <fastdds/dds/topic/qos/TopicQos.hpp>
@ -32,7 +32,6 @@ namespace ros2 {
using erc = eprosima::fastrtps::types::ReturnCode_t;
struct CarlaRGBCameraPublisherImpl {
efd::DomainParticipant* _participant { nullptr };
efd::Publisher* _publisher { nullptr };
efd::Topic* _topic { nullptr };
efd::DataWriter* _datawriter { nullptr };
@ -42,7 +41,6 @@ namespace ros2 {
};
struct CarlaCameraInfoPublisherImpl {
efd::DomainParticipant* _participant { nullptr };
efd::Publisher* _publisher { nullptr };
efd::Topic* _topic { nullptr };
efd::DataWriter* _datawriter { nullptr };
@ -72,18 +70,12 @@ namespace ros2 {
return false;
}
efd::DomainParticipantQos pqos = efd::PARTICIPANT_QOS_DEFAULT;
pqos.name(_name);
auto factory = efd::DomainParticipantFactory::get_instance();
_impl->_participant = factory->create_participant(0, pqos);
if (_impl->_participant == nullptr) {
std::cerr << "Failed to create DomainParticipant" << std::endl;
return false;
}
_impl->_type.register_type(_impl->_participant);
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
_impl->_type.register_type(participant);
efd::PublisherQos pubqos = efd::PUBLISHER_QOS_DEFAULT;
_impl->_publisher = _impl->_participant->create_publisher(pubqos, nullptr);
_impl->_publisher = participant->create_publisher(pubqos, nullptr);
if (_impl->_publisher == nullptr) {
std::cerr << "Failed to create Publisher" << std::endl;
return false;
@ -97,7 +89,7 @@ namespace ros2 {
topic_name += _parent + "/";
topic_name += _name;
topic_name += publisher_type;
_impl->_topic = _impl->_participant->create_topic(topic_name, _impl->_type->getName(), tqos);
_impl->_topic = participant->create_topic(topic_name, _impl->_type->getName(), tqos);
if (_impl->_topic == nullptr) {
std::cerr << "Failed to create Topic" << std::endl;
return false;
@ -121,18 +113,11 @@ namespace ros2 {
return false;
}
efd::DomainParticipantQos pqos = efd::PARTICIPANT_QOS_DEFAULT;
pqos.name(_name);
auto factory = efd::DomainParticipantFactory::get_instance();
_impl_info->_participant = factory->create_participant(0, pqos);
if (_impl_info->_participant == nullptr) {
std::cerr << "Failed to create DomainParticipant" << std::endl;
return false;
}
_impl_info->_type.register_type(_impl_info->_participant);
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
_impl_info->_type.register_type(participant);
efd::PublisherQos pubqos = efd::PUBLISHER_QOS_DEFAULT;
_impl_info->_publisher = _impl_info->_participant->create_publisher(pubqos, nullptr);
_impl_info->_publisher = participant->create_publisher(pubqos, nullptr);
if (_impl_info->_publisher == nullptr) {
std::cerr << "Failed to create Publisher" << std::endl;
return false;
@ -146,7 +131,7 @@ namespace ros2 {
topic_name += _parent + "/";
topic_name += _name;
topic_name += publisher_type;
_impl_info->_topic = _impl_info->_participant->create_topic(topic_name, _impl_info->_type->getName(), tqos);
_impl_info->_topic = participant->create_topic(topic_name, _impl_info->_type->getName(), tqos);
if (_impl_info->_topic == nullptr) {
std::cerr << "Failed to create Topic" << std::endl;
return false;
@ -350,17 +335,16 @@ void CarlaRGBCameraPublisher::SetImageData(int32_t seconds, uint32_t nanoseconds
if (!_impl)
return;
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
if (_impl->_datawriter)
_impl->_publisher->delete_datawriter(_impl->_datawriter);
if (_impl->_publisher)
_impl->_participant->delete_publisher(_impl->_publisher);
participant->delete_publisher(_impl->_publisher);
if (_impl->_topic)
_impl->_participant->delete_topic(_impl->_topic);
participant->delete_topic(_impl->_topic);
if (_impl->_participant)
efd::DomainParticipantFactory::get_instance()->delete_participant(_impl->_participant);
if (!_impl_info)
return;
@ -369,13 +353,10 @@ void CarlaRGBCameraPublisher::SetImageData(int32_t seconds, uint32_t nanoseconds
_impl_info->_publisher->delete_datawriter(_impl_info->_datawriter);
if (_impl_info->_publisher)
_impl_info->_participant->delete_publisher(_impl_info->_publisher);
participant->delete_publisher(_impl_info->_publisher);
if (_impl_info->_topic)
_impl_info->_participant->delete_topic(_impl_info->_topic);
if (_impl_info->_participant)
efd::DomainParticipantFactory::get_instance()->delete_participant(_impl_info->_participant);
participant->delete_topic(_impl_info->_topic);
}
CarlaRGBCameraPublisher::CarlaRGBCameraPublisher(const CarlaRGBCameraPublisher& other) {

View File

@ -14,8 +14,8 @@
#include <fastdds/dds/publisher/DataWriter.hpp>
#include <fastdds/dds/topic/TypeSupport.hpp>
#include <fastdds/dds/domain/qos/DomainParticipantQos.hpp>
#include <fastdds/dds/domain/DomainParticipantFactory.hpp>
#include <carla/ros2/ROS2.h>
#include <carla/ros2/impl/DdsDomainParticipantImpl.h>
#include <fastdds/dds/publisher/qos/PublisherQos.hpp>
#include <fastdds/dds/topic/qos/TopicQos.hpp>
@ -32,7 +32,6 @@ namespace ros2 {
using erc = eprosima::fastrtps::types::ReturnCode_t;
struct CarlaRadarPublisherImpl {
efd::DomainParticipant* _participant { nullptr };
efd::Publisher* _publisher { nullptr };
efd::Topic* _topic { nullptr };
efd::DataWriter* _datawriter { nullptr };
@ -54,18 +53,12 @@ namespace ros2 {
return false;
}
efd::DomainParticipantQos pqos = efd::PARTICIPANT_QOS_DEFAULT;
pqos.name(_name);
auto factory = efd::DomainParticipantFactory::get_instance();
_impl->_participant = factory->create_participant(0, pqos);
if (_impl->_participant == nullptr) {
std::cerr << "Failed to create DomainParticipant" << std::endl;
return false;
}
_impl->_type.register_type(_impl->_participant);
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
_impl->_type.register_type(participant);
efd::PublisherQos pubqos = efd::PUBLISHER_QOS_DEFAULT;
_impl->_publisher = _impl->_participant->create_publisher(pubqos, nullptr);
_impl->_publisher = participant->create_publisher(pubqos, nullptr);
if (_impl->_publisher == nullptr) {
std::cerr << "Failed to create Publisher" << std::endl;
return false;
@ -77,7 +70,7 @@ namespace ros2 {
if (!_parent.empty())
topic_name += _parent + "/";
topic_name += _name;
_impl->_topic = _impl->_participant->create_topic(topic_name, _impl->_type->getName(), tqos);
_impl->_topic = participant->create_topic(topic_name, _impl->_type->getName(), tqos);
if (_impl->_topic == nullptr) {
std::cerr << "Failed to create Topic" << std::endl;
return false;
@ -241,17 +234,16 @@ void CarlaRadarPublisher::SetData(int32_t seconds, uint32_t nanoseconds, size_t
if (!_impl)
return;
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
if (_impl->_datawriter)
_impl->_publisher->delete_datawriter(_impl->_datawriter);
if (_impl->_publisher)
_impl->_participant->delete_publisher(_impl->_publisher);
participant->delete_publisher(_impl->_publisher);
if (_impl->_topic)
_impl->_participant->delete_topic(_impl->_topic);
participant->delete_topic(_impl->_topic);
if (_impl->_participant)
efd::DomainParticipantFactory::get_instance()->delete_participant(_impl->_participant);
}
CarlaRadarPublisher::CarlaRadarPublisher(const CarlaRadarPublisher& other) {

View File

@ -14,8 +14,8 @@
#include <fastdds/dds/publisher/DataWriter.hpp>
#include <fastdds/dds/topic/TypeSupport.hpp>
#include <fastdds/dds/domain/qos/DomainParticipantQos.hpp>
#include <fastdds/dds/domain/DomainParticipantFactory.hpp>
#include <carla/ros2/ROS2.h>
#include <carla/ros2/impl/DdsDomainParticipantImpl.h>
#include <fastdds/dds/publisher/qos/PublisherQos.hpp>
#include <fastdds/dds/topic/qos/TopicQos.hpp>
@ -31,7 +31,6 @@ namespace ros2 {
using erc = eprosima::fastrtps::types::ReturnCode_t;
struct CarlaSSCameraPublisherImpl {
efd::DomainParticipant* _participant { nullptr };
efd::Publisher* _publisher { nullptr };
efd::Topic* _topic { nullptr };
efd::DataWriter* _datawriter { nullptr };
@ -41,7 +40,6 @@ namespace ros2 {
};
struct CarlaCameraInfoPublisherImpl {
efd::DomainParticipant* _participant { nullptr };
efd::Publisher* _publisher { nullptr };
efd::Topic* _topic { nullptr };
efd::DataWriter* _datawriter { nullptr };
@ -70,18 +68,12 @@ namespace ros2 {
std::cerr << "Invalid TypeSupport" << std::endl;
return false;
}
efd::DomainParticipantQos pqos = efd::PARTICIPANT_QOS_DEFAULT;
pqos.name(_name);
auto factory = efd::DomainParticipantFactory::get_instance();
_impl->_participant = factory->create_participant(0, pqos);
if (_impl->_participant == nullptr) {
std::cerr << "Failed to create DomainParticipant" << std::endl;
return false;
}
_impl->_type.register_type(_impl->_participant);
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
_impl->_type.register_type(participant);
efd::PublisherQos pubqos = efd::PUBLISHER_QOS_DEFAULT;
_impl->_publisher = _impl->_participant->create_publisher(pubqos, nullptr);
_impl->_publisher = participant->create_publisher(pubqos, nullptr);
if (_impl->_publisher == nullptr) {
std::cerr << "Failed to create Publisher" << std::endl;
return false;
@ -95,7 +87,7 @@ namespace ros2 {
topic_name += _parent + "/";
topic_name += _name;
topic_name += publisher_type;
_impl->_topic = _impl->_participant->create_topic(topic_name, _impl->_type->getName(), tqos);
_impl->_topic = participant->create_topic(topic_name, _impl->_type->getName(), tqos);
if (_impl->_topic == nullptr) {
std::cerr << "Failed to create Topic" << std::endl;
return false;
@ -119,18 +111,11 @@ namespace ros2 {
return false;
}
efd::DomainParticipantQos pqos = efd::PARTICIPANT_QOS_DEFAULT;
pqos.name(_name);
auto factory = efd::DomainParticipantFactory::get_instance();
_impl_info->_participant = factory->create_participant(0, pqos);
if (_impl_info->_participant == nullptr) {
std::cerr << "Failed to create DomainParticipant" << std::endl;
return false;
}
_impl_info->_type.register_type(_impl_info->_participant);
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
_impl_info->_type.register_type(participant);
efd::PublisherQos pubqos = efd::PUBLISHER_QOS_DEFAULT;
_impl_info->_publisher = _impl_info->_participant->create_publisher(pubqos, nullptr);
_impl_info->_publisher = participant->create_publisher(pubqos, nullptr);
if (_impl_info->_publisher == nullptr) {
std::cerr << "Failed to create Publisher" << std::endl;
return false;
@ -144,7 +129,7 @@ namespace ros2 {
topic_name += _parent + "/";
topic_name += _name;
topic_name += publisher_type;
_impl_info->_topic = _impl_info->_participant->create_topic(topic_name, _impl_info->_type->getName(), tqos);
_impl_info->_topic = participant->create_topic(topic_name, _impl_info->_type->getName(), tqos);
if (_impl_info->_topic == nullptr) {
std::cerr << "Failed to create Topic" << std::endl;
return false;
@ -347,17 +332,16 @@ namespace ros2 {
if (!_impl)
return;
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
if (_impl->_datawriter)
_impl->_publisher->delete_datawriter(_impl->_datawriter);
if (_impl->_publisher)
_impl->_participant->delete_publisher(_impl->_publisher);
participant->delete_publisher(_impl->_publisher);
if (_impl->_topic)
_impl->_participant->delete_topic(_impl->_topic);
participant->delete_topic(_impl->_topic);
if (_impl->_participant)
efd::DomainParticipantFactory::get_instance()->delete_participant(_impl->_participant);
if (!_impl_info)
return;
@ -366,13 +350,10 @@ namespace ros2 {
_impl_info->_publisher->delete_datawriter(_impl_info->_datawriter);
if (_impl_info->_publisher)
_impl_info->_participant->delete_publisher(_impl_info->_publisher);
participant->delete_publisher(_impl_info->_publisher);
if (_impl_info->_topic)
_impl_info->_participant->delete_topic(_impl_info->_topic);
if (_impl_info->_participant)
efd::DomainParticipantFactory::get_instance()->delete_participant(_impl_info->_participant);
participant->delete_topic(_impl_info->_topic);
}
CarlaSSCameraPublisher::CarlaSSCameraPublisher(const CarlaSSCameraPublisher& other) {

View File

@ -13,8 +13,8 @@
#include <fastdds/dds/publisher/DataWriter.hpp>
#include <fastdds/dds/topic/TypeSupport.hpp>
#include <fastdds/dds/domain/qos/DomainParticipantQos.hpp>
#include <fastdds/dds/domain/DomainParticipantFactory.hpp>
#include <carla/ros2/ROS2.h>
#include <carla/ros2/impl/DdsDomainParticipantImpl.h>
#include <fastdds/dds/publisher/qos/PublisherQos.hpp>
#include <fastdds/dds/topic/qos/TopicQos.hpp>
@ -31,7 +31,6 @@ namespace ros2 {
using erc = eprosima::fastrtps::types::ReturnCode_t;
struct CarlaSemanticLidarPublisherImpl {
efd::DomainParticipant* _participant { nullptr };
efd::Publisher* _publisher { nullptr };
efd::Topic* _topic { nullptr };
efd::DataWriter* _datawriter { nullptr };
@ -45,18 +44,12 @@ namespace ros2 {
std::cerr << "Invalid TypeSupport" << std::endl;
return false;
}
efd::DomainParticipantQos pqos = efd::PARTICIPANT_QOS_DEFAULT;
pqos.name(_name);
auto factory = efd::DomainParticipantFactory::get_instance();
_impl->_participant = factory->create_participant(0, pqos);
if (_impl->_participant == nullptr) {
std::cerr << "Failed to create DomainParticipant" << std::endl;
return false;
}
_impl->_type.register_type(_impl->_participant);
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
_impl->_type.register_type(participant);
efd::PublisherQos pubqos = efd::PUBLISHER_QOS_DEFAULT;
_impl->_publisher = _impl->_participant->create_publisher(pubqos, nullptr);
_impl->_publisher = participant->create_publisher(pubqos, nullptr);
if (_impl->_publisher == nullptr) {
std::cerr << "Failed to create Publisher" << std::endl;
return false;
@ -68,7 +61,7 @@ namespace ros2 {
if (!_parent.empty())
topic_name += _parent + "/";
topic_name += _name;
_impl->_topic = _impl->_participant->create_topic(topic_name, _impl->_type->getName(), tqos);
_impl->_topic = participant->create_topic(topic_name, _impl->_type->getName(), tqos);
if (_impl->_topic == nullptr) {
std::cerr << "Failed to create Topic" << std::endl;
return false;
@ -224,17 +217,16 @@ void CarlaSemanticLidarPublisher::SetData(int32_t seconds, uint32_t nanoseconds,
if (!_impl)
return;
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
if (_impl->_datawriter)
_impl->_publisher->delete_datawriter(_impl->_datawriter);
if (_impl->_publisher)
_impl->_participant->delete_publisher(_impl->_publisher);
participant->delete_publisher(_impl->_publisher);
if (_impl->_topic)
_impl->_participant->delete_topic(_impl->_topic);
participant->delete_topic(_impl->_topic);
if (_impl->_participant)
efd::DomainParticipantFactory::get_instance()->delete_participant(_impl->_participant);
}
CarlaSemanticLidarPublisher::CarlaSemanticLidarPublisher(const CarlaSemanticLidarPublisher& other) {

View File

@ -13,8 +13,8 @@
#include <fastdds/dds/publisher/DataWriter.hpp>
#include <fastdds/dds/topic/TypeSupport.hpp>
#include <fastdds/dds/domain/qos/DomainParticipantQos.hpp>
#include <fastdds/dds/domain/DomainParticipantFactory.hpp>
#include <carla/ros2/ROS2.h>
#include <carla/ros2/impl/DdsDomainParticipantImpl.h>
#include <fastdds/dds/publisher/qos/PublisherQos.hpp>
#include <fastdds/dds/topic/qos/TopicQos.hpp>
@ -30,7 +30,6 @@ namespace ros2 {
using erc = eprosima::fastrtps::types::ReturnCode_t;
struct CarlaSpeedometerSensorImpl {
efd::DomainParticipant* _participant { nullptr };
efd::Publisher* _publisher { nullptr };
efd::Topic* _topic { nullptr };
efd::DataWriter* _datawriter { nullptr };
@ -44,18 +43,12 @@ namespace ros2 {
std::cerr << "Invalid TypeSupport" << std::endl;
return false;
}
efd::DomainParticipantQos pqos = efd::PARTICIPANT_QOS_DEFAULT;
pqos.name(_name);
auto factory = efd::DomainParticipantFactory::get_instance();
_impl->_participant = factory->create_participant(0, pqos);
if (_impl->_participant == nullptr) {
std::cerr << "Failed to create DomainParticipant" << std::endl;
return false;
}
_impl->_type.register_type(_impl->_participant);
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
_impl->_type.register_type(participant);
efd::PublisherQos pubqos = efd::PUBLISHER_QOS_DEFAULT;
_impl->_publisher = _impl->_participant->create_publisher(pubqos, nullptr);
_impl->_publisher = participant->create_publisher(pubqos, nullptr);
if (_impl->_publisher == nullptr) {
std::cerr << "Failed to create Publisher" << std::endl;
return false;
@ -67,7 +60,7 @@ namespace ros2 {
if (!_parent.empty())
topic_name += _parent + "/";
topic_name += _name;
_impl->_topic = _impl->_participant->create_topic(topic_name, _impl->_type->getName(), tqos);
_impl->_topic = participant->create_topic(topic_name, _impl->_type->getName(), tqos);
if (_impl->_topic == nullptr) {
std::cerr << "Failed to create Topic" << std::endl;
return false;
@ -161,17 +154,16 @@ namespace ros2 {
if (!_impl)
return;
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
if (_impl->_datawriter)
_impl->_publisher->delete_datawriter(_impl->_datawriter);
if (_impl->_publisher)
_impl->_participant->delete_publisher(_impl->_publisher);
participant->delete_publisher(_impl->_publisher);
if (_impl->_topic)
_impl->_participant->delete_topic(_impl->_topic);
participant->delete_topic(_impl->_topic);
if (_impl->_participant)
efd::DomainParticipantFactory::get_instance()->delete_participant(_impl->_participant);
}
CarlaSpeedometerSensor::CarlaSpeedometerSensor(const CarlaSpeedometerSensor& other) {

View File

@ -13,8 +13,8 @@
#include <fastdds/dds/publisher/DataWriter.hpp>
#include <fastdds/dds/topic/TypeSupport.hpp>
#include <fastdds/dds/domain/qos/DomainParticipantQos.hpp>
#include <fastdds/dds/domain/DomainParticipantFactory.hpp>
#include <carla/ros2/ROS2.h>
#include <carla/ros2/impl/DdsDomainParticipantImpl.h>
#include <fastdds/dds/publisher/qos/PublisherQos.hpp>
#include <fastdds/dds/topic/qos/TopicQos.hpp>
@ -30,7 +30,6 @@ namespace ros2 {
using erc = eprosima::fastrtps::types::ReturnCode_t;
struct CarlaTransformPublisherImpl {
efd::DomainParticipant* _participant { nullptr };
efd::Publisher* _publisher { nullptr };
efd::Topic* _topic { nullptr };
efd::DataWriter* _datawriter { nullptr };
@ -50,18 +49,12 @@ namespace ros2 {
return false;
}
efd::DomainParticipantQos pqos = efd::PARTICIPANT_QOS_DEFAULT;
pqos.name(_name);
auto factory = efd::DomainParticipantFactory::get_instance();
_impl->_participant = factory->create_participant(0, pqos);
if (_impl->_participant == nullptr) {
std::cerr << "Failed to create DomainParticipant" << std::endl;
return false;
}
_impl->_type.register_type(_impl->_participant);
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
_impl->_type.register_type(participant);
efd::PublisherQos pubqos = efd::PUBLISHER_QOS_DEFAULT;
_impl->_publisher = _impl->_participant->create_publisher(pubqos, nullptr);
_impl->_publisher = participant->create_publisher(pubqos, nullptr);
if (_impl->_publisher == nullptr) {
std::cerr << "Failed to create Publisher" << std::endl;
return false;
@ -69,7 +62,7 @@ namespace ros2 {
efd::TopicQos tqos = efd::TOPIC_QOS_DEFAULT;
const std::string topic_name { "rt/tf" };
_impl->_topic = _impl->_participant->create_topic(topic_name, _impl->_type->getName(), tqos);
_impl->_topic = participant->create_topic(topic_name, _impl->_type->getName(), tqos);
if (_impl->_topic == nullptr) {
std::cerr << "Failed to create Topic" << std::endl;
return false;
@ -161,9 +154,9 @@ namespace ros2 {
const float ty = *translation++;
const float tz = *translation++;
const float rx = ((*rotation++) * -1.0f) * (M_PIf32 / 180.0f);
const float ry = ((*rotation++) * -1.0f) * (M_PIf32 / 180.0f);
const float rz = *rotation++ * (M_PIf32 / 180.0f);
const float rx = ((*rotation++) * -1.0f) * (float(M_PI_2) / 180.0f);
const float ry = ((*rotation++) * -1.0f) * (float(M_PI_2) / 180.0f);
const float rz = *rotation++ * (float(M_PI_2) / 180.0f);
const float cr = cosf(rz * 0.5f);
const float sr = sinf(rz * 0.5f);
@ -211,17 +204,16 @@ namespace ros2 {
if (!_impl)
return;
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
if (_impl->_datawriter)
_impl->_publisher->delete_datawriter(_impl->_datawriter);
if (_impl->_publisher)
_impl->_participant->delete_publisher(_impl->_publisher);
participant->delete_publisher(_impl->_publisher);
if (_impl->_topic)
_impl->_participant->delete_topic(_impl->_topic);
participant->delete_topic(_impl->_topic);
if (_impl->_participant)
efd::DomainParticipantFactory::get_instance()->delete_participant(_impl->_participant);
}
CarlaTransformPublisher::CarlaTransformPublisher(const CarlaTransformPublisher& other) {

View File

@ -13,8 +13,8 @@
#include <fastdds/dds/topic/TypeSupport.hpp>
#include <fastdds/dds/subscriber/SampleInfo.hpp>
#include <fastdds/dds/domain/qos/DomainParticipantQos.hpp>
#include <fastdds/dds/domain/DomainParticipantFactory.hpp>
#include <carla/ros2/ROS2.h>
#include <carla/ros2/impl/DdsDomainParticipantImpl.h>
#include <fastdds/dds/subscriber/qos/SubscriberQos.hpp>
#include <fastdds/dds/topic/qos/TopicQos.hpp>
@ -31,7 +31,6 @@ namespace ros2 {
using erc = eprosima::fastrtps::types::ReturnCode_t;
struct CarlaEgoVehicleControlSubscriberImpl {
efd::DomainParticipant* _participant { nullptr };
efd::Subscriber* _subscriber { nullptr };
efd::Topic* _topic { nullptr };
efd::DataReader* _datareader { nullptr };
@ -50,18 +49,12 @@ namespace ros2 {
return false;
}
efd::DomainParticipantQos pqos = efd::PARTICIPANT_QOS_DEFAULT;
pqos.name(_name);
auto factory = efd::DomainParticipantFactory::get_instance();
_impl->_participant = factory->create_participant(0, pqos);
if (_impl->_participant == nullptr) {
std::cerr << "Failed to create DomainParticipant" << std::endl;
return false;
}
_impl->_type.register_type(_impl->_participant);
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
_impl->_type.register_type(participant);
efd::SubscriberQos subqos = efd::SUBSCRIBER_QOS_DEFAULT;
_impl->_subscriber = _impl->_participant->create_subscriber(subqos, nullptr);
_impl->_subscriber = participant->create_subscriber(subqos, nullptr);
if (_impl->_subscriber == nullptr) {
std::cerr << "Failed to create Subscriber" << std::endl;
return false;
@ -75,7 +68,7 @@ namespace ros2 {
topic_name += _parent + "/";
topic_name += _name;
topic_name += publisher_type;
_impl->_topic = _impl->_participant->create_topic(topic_name, _impl->_type->getName(), tqos);
_impl->_topic = participant->create_topic(topic_name, _impl->_type->getName(), tqos);
if (_impl->_topic == nullptr) {
std::cerr << "Failed to create Topic" << std::endl;
return false;
@ -191,17 +184,16 @@ namespace ros2 {
if (!_impl)
return;
auto participant = ROS2::GetDdsDomainParticipant()->GetDomainParticipant();
if (_impl->_datareader)
_impl->_subscriber->delete_datareader(_impl->_datareader);
if (_impl->_subscriber)
_impl->_participant->delete_subscriber(_impl->_subscriber);
participant->delete_subscriber(_impl->_subscriber);
if (_impl->_topic)
_impl->_participant->delete_topic(_impl->_topic);
participant->delete_topic(_impl->_topic);
if (_impl->_participant)
efd::DomainParticipantFactory::get_instance()->delete_participant(_impl->_participant);
}
CarlaEgoVehicleControlSubscriber::CarlaEgoVehicleControlSubscriber(const CarlaEgoVehicleControlSubscriber& other) {

View File

@ -57,14 +57,14 @@ EgoDynamicsOnRoute::EgoDynamicsOnRoute()
time_since_epoch_check_end_ms(0.),
ego_speed(0.),
min_stopping_distance(0.),
ego_center({0., 0., 0.}),
ego_center(),
ego_heading(0.),
ego_heading_change(0.),
ego_steering_angle(0.),
ego_center_within_route(false),
crossing_border(false),
route_heading(0.),
route_nominal_center({0., 0., 0.}),
route_nominal_center(),
heading_diff(0.),
route_speed_lat(0.),
route_speed_lon(0.),
@ -73,6 +73,12 @@ EgoDynamicsOnRoute::EgoDynamicsOnRoute()
avg_route_accel_lat(0.),
avg_route_accel_lon(0.) {
timestamp.elapsed_seconds = 0.;
ego_center.x = 0.;
ego_center.y = 0.;
ego_center.z = 0.,
route_nominal_center.x = 0.;
route_nominal_center.y = 0.;
route_nominal_center.z = 0.;
}
std::shared_ptr<spdlog::logger> getLogger() {

View File

@ -14,7 +14,6 @@
template <typename ViewT, typename PixelT>
struct TestImage {
TestImage(TestImage &&) = default;
using pixel_type = PixelT;
std::unique_ptr<PixelT[]> data;
ViewT view;
@ -28,7 +27,7 @@ static auto MakeTestImage(size_t width, size_t height) {
height,
reinterpret_cast<PixelT*>(data.get()),
static_cast<long>(sizeof(PixelT) * width));
return TestImage<decltype(view), PixelT>{std::move(data), view};
return TestImage<decltype(view), PixelT>{.data = std::move(data), .view = view};
}
#ifndef PLATFORM_WINDOWS

View File

@ -4,25 +4,17 @@ using System;
using System.IO;
using UnrealBuildTool;
public class Carla : ModuleRules
public class Carla : CarlaRules
{
bool UsingCarSim = false;
bool UsingChrono = false;
bool UsingPytorch = false;
bool UsingRos2 = false;
private bool IsWindows(ReadOnlyTargetRules Target)
{
return (Target.Platform == UnrealTargetPlatform.Win64) || (Target.Platform == UnrealTargetPlatform.Win32);
}
public Carla(ReadOnlyTargetRules Target) : base(Target)
public Carla(ReadOnlyTargetRules Target) : base(Target, "../../CarlaDependencies")
{
PrivatePCHHeaderFile = "Carla.h";
if (IsWindows(Target))
{
bEnableExceptions = true;
}
bEnableExceptions = true;
CppStandard = CppStandardVersion.Cpp20;
// Read config about carsim
string CarlaPluginPath = Path.GetFullPath( ModuleDirectory );
@ -57,8 +49,12 @@ public class Carla : ModuleRules
{
Console.WriteLine("Enabling ros2");
UsingRos2 = true;
PublicDefinitions.Add("WITH_ROS2");
PrivateDefinitions.Add("WITH_ROS2");
}
if (line.Contains("Debug ON"))
{
Console.WriteLine("Enabling debug build");
Debug = true;
}
}
@ -91,10 +87,10 @@ public class Carla : ModuleRules
PublicDependencyModuleNames.AddRange(new string[] { "CarSim" });
}
if (Target.Type == TargetType.Editor)
{
PublicDependencyModuleNames.AddRange(new string[] { "UnrealEd" });
}
if (Target.Type == TargetType.Editor)
{
PublicDependencyModuleNames.AddRange(new string[] { "UnrealEd" });
}
PrivateDependencyModuleNames.AddRange(
new string[]
@ -118,229 +114,143 @@ public class Carla : ModuleRules
"PhysicsCore"
// ... add private dependencies that you statically link with here ...
}
);
);
if (UsingCarSim)
{
PrivateDependencyModuleNames.AddRange(new string[] { "CarSim" });
PrivateIncludePathModuleNames.AddRange(new string[] { "CarSim" });
}
DynamicallyLoadedModuleNames.AddRange(
new string[]
{
// ... add any modules that your module loads dynamically here ...
}
);
);
AddCarlaServerDependency(Target);
AddCarlaServerDependency();
}
private bool UseDebugLibs(ReadOnlyTargetRules Target)
private void AddCarlaServerDependency()
{
if (IsWindows(Target))
// Link dependencies.
AddStaticLibrary( "rpc");
if (UseDebugLibs())
{
// In Windows, Unreal uses the Release C++ Runtime (CRT) even in debug
// mode, so unless we recompile the engine we cannot link the debug
// libraries.
return false;
AddStaticLibrary("carla_server_debug");
}
else
{
return false;
AddStaticLibrary("carla_server");
}
}
private void AddDynamicLibrary(string library)
{
PublicAdditionalLibraries.Add(library);
RuntimeDependencies.Add(library);
PublicDelayLoadDLLs.Add(library);
}
private void AddDllDependency(string PathToFolder, string DllName)
{
string Source = Path.Combine(PathToFolder, DllName);
string Destination = Path.Combine("$(BinaryOutputDir)", DllName);
RuntimeDependencies.Add(Destination, Source);
}
delegate string ADelegate(string s);
private void AddBoostLibs(string LibPath)
{
string [] files = Directory.GetFiles(LibPath, "*boost*.lib");
foreach (string file in files) PublicAdditionalLibraries.Add(file);
}
private void AddCarlaServerDependency(ReadOnlyTargetRules Target)
{
string LibCarlaInstallPath = Path.GetFullPath(Path.Combine(ModuleDirectory, "../../CarlaDependencies"));
ADelegate GetLibName = (string BaseName) => {
if (IsWindows(Target))
{
return BaseName + ".lib";
}
else
{
return "lib" + BaseName + ".a";
}
};
// Link dependencies.
if (IsWindows(Target))
if (IsWindows())
{
AddBoostLibs(Path.Combine(LibCarlaInstallPath, "lib"));
PublicAdditionalLibraries.Add(Path.Combine(LibCarlaInstallPath, "lib", GetLibName("rpc")));
PublicAdditionalLibraries.Add("shlwapi.lib");
if (UseDebugLibs(Target))
{
PublicAdditionalLibraries.Add(Path.Combine(LibCarlaInstallPath, "lib", GetLibName("carla_server_debug")));
}
else
{
PublicAdditionalLibraries.Add(Path.Combine(LibCarlaInstallPath, "lib", GetLibName("carla_server")));
}
AddBoostLibs();
if (UsingChrono)
{
PublicAdditionalLibraries.Add(Path.Combine(LibCarlaInstallPath, "lib", GetLibName("ChronoEngine")));
PublicAdditionalLibraries.Add(Path.Combine(LibCarlaInstallPath, "lib", GetLibName("ChronoEngine_vehicle")));
PublicAdditionalLibraries.Add(Path.Combine(LibCarlaInstallPath, "lib", GetLibName("ChronoModels_vehicle")));
PublicAdditionalLibraries.Add(Path.Combine(LibCarlaInstallPath, "lib", GetLibName("ChronoModels_robot")));
AddStaticLibrary("ChronoEngine");
AddStaticLibrary("ChronoEngine_vehicle");
AddStaticLibrary("ChronoModels_vehicle");
AddStaticLibrary("ChronoModels_robot");
AddDllDependency(Path.Combine(LibCarlaInstallPath, "dll"), "ChronoEngine.dll");
AddDllDependency(Path.Combine(LibCarlaInstallPath, "dll"), "ChronoEngine_vehicle.dll");
AddDllDependency(Path.Combine(LibCarlaInstallPath, "dll"), "ChronoModels_vehicle.dll");
AddDllDependency(Path.Combine(LibCarlaInstallPath, "dll"), "ChronoModels_robot.dll");
bUseRTTI = true;
}
//OsmToODR
PublicAdditionalLibraries.Add(Path.Combine(LibCarlaInstallPath, "lib", "sqlite3.lib"));
PublicAdditionalLibraries.Add(Path.Combine(LibCarlaInstallPath, "lib", "xerces-c_3.lib"));
PublicAdditionalLibraries.Add(Path.Combine(LibCarlaInstallPath, "lib", "proj.lib"));
PublicAdditionalLibraries.Add(Path.Combine(LibCarlaInstallPath, "lib", "osm2odr.lib"));
PublicAdditionalLibraries.Add(Path.Combine(LibCarlaInstallPath, "lib", "zlibstatic.lib"));
}
else
{
PublicAdditionalLibraries.Add(Path.Combine(LibCarlaInstallPath, "lib", GetLibName("rpc")));
if (UseDebugLibs(Target))
{
PublicAdditionalLibraries.Add(Path.Combine(LibCarlaInstallPath, "lib", GetLibName("carla_server_debug")));
}
else
{
PublicAdditionalLibraries.Add(Path.Combine(LibCarlaInstallPath, "lib", GetLibName("carla_server")));
}
if (UsingChrono)
{
AddDynamicLibrary(Path.Combine(LibCarlaInstallPath, "lib", "libChronoEngine.so"));
AddDynamicLibrary(Path.Combine(LibCarlaInstallPath, "lib", "libChronoEngine_vehicle.so"));
AddDynamicLibrary(Path.Combine(LibCarlaInstallPath, "lib", "libChronoModels_vehicle.so"));
AddDynamicLibrary(Path.Combine(LibCarlaInstallPath, "lib", "libChronoModels_robot.so"));
AddStaticLibrary( "ChronoEngine");
AddStaticLibrary( "ChronoEngine_vehicle");
AddStaticLibrary( "ChronoModels_vehicle");
AddStaticLibrary( "ChronoModels_robot");
bUseRTTI = true;
}
if (UsingPytorch)
{
PublicAdditionalLibraries.Add(Path.Combine(LibCarlaInstallPath, "lib", GetLibName("carla_pytorch")));
AddStaticLibrary( "carla_pytorch");
string LibTorchPath = LibCarlaInstallPath;
PublicAdditionalLibraries.Add(Path.Combine(LibTorchPath, "lib", "libonnx_proto.a"));
PublicAdditionalLibraries.Add(Path.Combine(LibTorchPath, "lib", "libfbgemm.a"));
PublicAdditionalLibraries.Add(Path.Combine(LibTorchPath, "lib", "libgloo.a"));
PublicAdditionalLibraries.Add(Path.Combine(LibTorchPath, "lib", "libXNNPACK.a"));
PublicAdditionalLibraries.Add(Path.Combine(LibTorchPath, "lib", "libprotobuf-lite.a"));
PublicAdditionalLibraries.Add(Path.Combine(LibTorchPath, "lib", "libprotobuf.a"));
PublicAdditionalLibraries.Add(Path.Combine(LibTorchPath, "lib", "libasmjit.a"));
PublicAdditionalLibraries.Add(Path.Combine(LibTorchPath, "lib", "libcpuinfo_internals.a"));
PublicAdditionalLibraries.Add(Path.Combine(LibTorchPath, "lib", "libclog.a"));
// PublicAdditionalLibraries.Add(Path.Combine(LibTorchPath, "lib", "libbreakpad_common.a"));
PublicAdditionalLibraries.Add(Path.Combine(LibTorchPath, "lib", "libbenchmark.a"));
PublicAdditionalLibraries.Add(Path.Combine(LibTorchPath, "lib", "libtensorpipe.a"));
PublicAdditionalLibraries.Add(Path.Combine(LibTorchPath, "lib", "libpytorch_qnnpack.a"));
PublicAdditionalLibraries.Add(Path.Combine(LibTorchPath, "lib", "libtensorpipe_cuda.a"));
PublicAdditionalLibraries.Add(Path.Combine(LibTorchPath, "lib", "libnnpack_reference_layers.a"));
PublicAdditionalLibraries.Add(Path.Combine(LibTorchPath, "lib", "libgmock.a"));
PublicAdditionalLibraries.Add(Path.Combine(LibTorchPath, "lib", "libdnnl.a"));
PublicAdditionalLibraries.Add(Path.Combine(LibTorchPath, "lib", "libpthreadpool.a"));
PublicAdditionalLibraries.Add(Path.Combine(LibTorchPath, "lib", "libcpuinfo.a"));
PublicAdditionalLibraries.Add(Path.Combine(LibTorchPath, "lib", "libqnnpack.a"));
// PublicAdditionalLibraries.Add(Path.Combine(LibTorchPath, "lib", "libbreakpad.a"));
PublicAdditionalLibraries.Add(Path.Combine(LibTorchPath, "lib", "libkineto.a"));
PublicAdditionalLibraries.Add(Path.Combine(LibTorchPath, "lib", "libprotoc.a"));
PublicAdditionalLibraries.Add(Path.Combine(LibTorchPath, "lib", "libgtest.a"));
PublicAdditionalLibraries.Add(Path.Combine(LibTorchPath, "lib", "libgmock_main.a"));
PublicAdditionalLibraries.Add(Path.Combine(LibTorchPath, "lib", "libgtest_main.a"));
PublicAdditionalLibraries.Add(Path.Combine(LibTorchPath, "lib", "libbenchmark_main.a"));
PublicAdditionalLibraries.Add(Path.Combine(LibTorchPath, "lib", "libfmt.a"));
PublicAdditionalLibraries.Add(Path.Combine(LibTorchPath, "lib", "libtensorpipe_uv.a"));
PublicAdditionalLibraries.Add(Path.Combine(LibTorchPath, "lib", "libfoxi_loader.a"));
PublicAdditionalLibraries.Add(Path.Combine(LibTorchPath, "lib", "libgloo_cuda.a"));
PublicAdditionalLibraries.Add(Path.Combine(LibTorchPath, "lib", "libnnpack.a"));
PublicAdditionalLibraries.Add(Path.Combine(LibTorchPath, "lib", "libcaffe2_protos.a"));
PublicAdditionalLibraries.Add(Path.Combine(LibTorchPath, "lib", "libonnx.a"));
AddDynamicLibrary(Path.Combine(LibTorchPath, "lib", "libtorch.so"));
AddDynamicLibrary(Path.Combine(LibTorchPath, "lib", "libnnapi_backend.so"));
AddDynamicLibrary(Path.Combine(LibTorchPath, "lib", "libbackend_with_compiler.so"));
AddDynamicLibrary(Path.Combine(LibTorchPath, "lib", "libcaffe2_nvrtc.so"));
AddDynamicLibrary(Path.Combine(LibTorchPath, "lib", "libtorch_cuda_cpp.so"));
AddDynamicLibrary(Path.Combine(LibTorchPath, "lib", "libc10_cuda.so"));
AddDynamicLibrary(Path.Combine(LibTorchPath, "lib", "libtorchbind_test.so"));
AddDynamicLibrary(Path.Combine(LibTorchPath, "lib", "libjitbackend_test.so"));
AddDynamicLibrary(Path.Combine(LibTorchPath, "lib", "libc10.so"));
AddDynamicLibrary(Path.Combine(LibTorchPath, "lib", "libtorch_cuda.so"));
AddDynamicLibrary(Path.Combine(LibTorchPath, "lib", "libtorch_global_deps.so"));
AddDynamicLibrary(Path.Combine(LibTorchPath, "lib", "libtorch_cpu.so"));
AddDynamicLibrary(Path.Combine(LibTorchPath, "lib", "libshm.so"));
AddDynamicLibrary(Path.Combine(LibTorchPath, "lib", "libtorch_cuda_cu.so"));
AddDynamicLibrary(Path.Combine(LibTorchPath, "lib", "libtorchscatter.so"));
AddDynamicLibrary(Path.Combine(LibTorchPath, "lib", "libtorchcluster.so"));
// AddDynamicLibrary("/usr/local/cuda/lib64/stubs/libcuda.so");
// AddDynamicLibrary("/usr/local/cuda/lib64/libnvrtc.so");
// AddDynamicLibrary("/usr/local/cuda/lib64/libnvToolsExt.so");
// AddDynamicLibrary("/usr/local/cuda/lib64/libcudart.so");
// AddDynamicLibrary("/usr/lib/llvm-10/lib/libgomp.so");
PublicAdditionalLibraries.Add("/usr/local/cuda/lib64/stubs/libcuda.so");
PublicAdditionalLibraries.Add("/usr/local/cuda/lib64/libnvrtc.so");
PublicAdditionalLibraries.Add("/usr/local/cuda/lib64/libnvToolsExt.so");
PublicAdditionalLibraries.Add("/usr/local/cuda/lib64/libcudart.so");
PublicAdditionalLibraries.Add("/usr/lib/llvm-10/lib/libgomp.so");
RuntimeDependencies.Add(Path.Combine(LibTorchPath, "lib", "libcudart-a7b20f20.so.11.0"));
RuntimeDependencies.Add(Path.Combine(LibTorchPath, "lib", "libgomp-a34b3233.so.1"));
RuntimeDependencies.Add(Path.Combine(LibTorchPath, "lib", "libnvrtc-builtins-4730a239.so.11.3"));
RuntimeDependencies.Add(Path.Combine(LibTorchPath, "lib", "libnvrtc-1ea278b5.so.11.2"));
RuntimeDependencies.Add(Path.Combine(LibTorchPath, "lib", "libnvToolsExt-24de1d56.so.1"));
AddStaticLibrary("onnx_proto");
AddStaticLibrary("fbgemm");
AddStaticLibrary("gloo");
AddStaticLibrary("XNNPACK");
AddStaticLibrary("protobuf-lite");
AddStaticLibrary("protobuf");
AddStaticLibrary("asmjit");
AddStaticLibrary("cpuinfo_internals");
AddStaticLibrary("clog");
// AddStaticLibrary("breakpad_common");
AddStaticLibrary("benchmark");
AddStaticLibrary("tensorpipe");
AddStaticLibrary("pytorch_qnnpack");
AddStaticLibrary("tensorpipe_cuda");
AddStaticLibrary("nnpack_reference_layers");
AddStaticLibrary("gmock");
AddStaticLibrary("dnnl");
AddStaticLibrary("pthreadpool");
AddStaticLibrary("cpuinfo");
AddStaticLibrary("qnnpack");
// AddStaticLibrary("breakpad"));
AddStaticLibrary("kineto");
AddStaticLibrary("protoc");
AddStaticLibrary("gtest");
AddStaticLibrary("gmock_main");
AddStaticLibrary("gtest_main");
AddStaticLibrary("benchmark_main");
AddStaticLibrary("fmt");
AddStaticLibrary("tensorpipe_uv");
AddStaticLibrary("foxi_loader");
AddStaticLibrary("gloo_cuda");
AddStaticLibrary("nnpack");
AddStaticLibrary("caffe2_protos");
AddStaticLibrary("onnx");
AddDynamicLibrary("torch");
AddDynamicLibrary("nnapi_backend");
AddDynamicLibrary("backend_with_compiler");
AddDynamicLibrary("caffe2_nvrtc");
AddDynamicLibrary("torch_cuda_cpp");
AddDynamicLibrary("c10_cuda");
AddDynamicLibrary("torchbind_test");
AddDynamicLibrary("jitbackend_test");
AddDynamicLibrary("c10");
AddDynamicLibrary("torch_cuda");
AddDynamicLibrary("torch_global_deps");
AddDynamicLibrary("torch_cpu");
AddDynamicLibrary("shm");
AddDynamicLibrary("torch_cuda_cu");
AddDynamicLibrary("torchscatter");
AddDynamicLibrary("torchcluster");
AddDynamicLibrary("cuda", "/usr/local/cuda/lib64/stubs");
AddDynamicLibrary("nvrtc", "/usr/local/cuda/lib64");
AddDynamicLibrary("nvToolsExt", "/usr/local/cuda/lib64");
AddDynamicLibrary("cudart", "/usr/local/cuda/lib64");
AddDynamicLibrary("gomp", "/usr/lib/llvm-10/lib");
RuntimeDependencies.Add(Path.Combine("libcudart-a7b20f20.so.11.0"));
RuntimeDependencies.Add(Path.Combine("libgomp-a34b3233.so.1"));
RuntimeDependencies.Add(Path.Combine("libnvrtc-builtins-4730a239.so.11.3"));
RuntimeDependencies.Add(Path.Combine("libnvrtc-1ea278b5.so.11.2"));
RuntimeDependencies.Add(Path.Combine("libnvToolsExt-24de1d56.so.1"));
PublicAdditionalLibraries.Add("stdc++");
PublicAdditionalLibraries.Add("/usr/lib/x86_64-linux-gnu/libpython3.9.so");
}
if (UsingRos2)
{
PublicAdditionalLibraries.Add(Path.Combine(LibCarlaInstallPath, "lib", GetLibName("carla_fastdds")));
string LibFastDDSPath = LibCarlaInstallPath;
AddDynamicLibrary(Path.Combine(LibFastDDSPath, "lib", "libfoonathan_memory-0.7.3.so"));
AddDynamicLibrary(Path.Combine(LibFastDDSPath, "lib", "libfastcdr.so"));
AddDynamicLibrary(Path.Combine(LibFastDDSPath, "lib", "libfastrtps.so"));
PublicAdditionalLibraries.Add("stdc++");
}
//OsmToODR
PublicAdditionalLibraries.Add("/usr/lib/x86_64-linux-gnu/libc.so");
PublicAdditionalLibraries.Add(Path.Combine(LibCarlaInstallPath, "lib", "libsqlite3.so"));
PublicAdditionalLibraries.Add(Path.Combine(LibCarlaInstallPath, "lib", "libxerces-c.a"));
PublicAdditionalLibraries.Add(Path.Combine(LibCarlaInstallPath, "lib", "libproj.a"));
PublicAdditionalLibraries.Add(Path.Combine(LibCarlaInstallPath, "lib", "libosm2odr.a"));
}
bEnableExceptions = true;
addOsmToODR();
addROS2();
// Include path.
string LibCarlaIncludePath = Path.Combine(LibCarlaInstallPath, "include");
PublicIncludePaths.Add(LibCarlaIncludePath);
PrivateIncludePaths.Add(LibCarlaIncludePath);

View File

@ -0,0 +1,179 @@
// Copyright 1998-2017 Epic Games, Inc. All Rights Reserved.
using System;
using System.IO;
using UnrealBuildTool;
public class CarlaRules : ModuleRules
{
protected string LibCarlaInstallPath;
protected bool UsingRos2 = false;
protected bool Debug = false;
public CarlaRules(ReadOnlyTargetRules Target, string LibCarlaInstallPathRelativeToModule) : base(Target)
{
LibCarlaInstallPath = Path.GetFullPath(Path.Combine(ModuleDirectory, LibCarlaInstallPathRelativeToModule));
}
protected bool IsWindows()
{
return (Target.Platform == UnrealTargetPlatform.Win64) || (Target.Platform == UnrealTargetPlatform.Win32);
}
protected bool IsLinux()
{
return (Target.Platform == UnrealTargetPlatform.Linux) || (Target.Platform == UnrealTargetPlatform.LinuxAArch64);
}
protected bool IsMac()
{
return (Target.Platform == UnrealTargetPlatform.Mac);
}
protected bool UseDebugLibs()
{
if (IsWindows())
{
// In Windows, Unreal uses the Release C++ Runtime (CRT) even in debug
// mode, so unless we recompile the engine we cannot link the debug
// libraries.
return false;
}
else
{
return Debug;
}
}
protected void AddDllDependency(string PathToFolder, string DllName)
{
string Source = Path.Combine(PathToFolder, DllName);
string Destination = Path.Combine("$(BinaryOutputDir)", DllName);
RuntimeDependencies.Add(Destination, Source);
}
protected void AddBoostLibs()
{
string [] files = Directory.GetFiles(Path.Combine(LibCarlaInstallPath, "lib"), "*boost*.lib");
foreach (string file in files) PublicAdditionalLibraries.Add(file);
}
protected void AddStaticLibrary(string LibBaseName, string LinkBasePath = "", string LibPrefix = "", string LibPostfix = "") {
string linkBasePath = LinkBasePath;
if ( linkBasePath == "" )
{
linkBasePath = Path.GetFullPath(Path.Combine(LibCarlaInstallPath, "lib"));
}
string libPrefix = LibPrefix;
if ( libPrefix == "" )
{
if (IsWindows())
{
libPrefix = "";
}
else
{
libPrefix = "lib";
}
}
string libPostfix = LibPostfix;
if ( libPostfix == "" )
{
if (IsWindows())
{
libPostfix = ".lib";
}
else
{
libPostfix = ".a";
}
}
string linkLibrary= Path.Combine(linkBasePath, libPrefix + LibBaseName + libPostfix);
PublicAdditionalLibraries.Add(linkLibrary);
}
protected void AddDynamicLibrary(string LibBaseName, string LinkBasePath = "", string LibPrefix = "", string LibPostfix = "")
{
string linkBasePath = LinkBasePath;
if ( linkBasePath == "" )
{
linkBasePath = Path.GetFullPath(Path.Combine(LibCarlaInstallPath, "lib"));
}
string libPrefix;
if (IsWindows())
{
libPrefix = "";
}
else
{
libPrefix = "lib";
}
if ( LibPrefix != "" )
{
libPrefix = LibPrefix;
}
string libPostfix;
if (IsWindows())
{
libPostfix = ".dll";
}
else
{
libPostfix = ".so";
}
if (LibPostfix != "")
{
libPostfix = LibPostfix;
}
string linkLibrary= Path.Combine(linkBasePath, libPrefix + LibBaseName + libPostfix);
PublicAdditionalLibraries.Add(linkLibrary);
RuntimeDependencies.Add(linkLibrary);
if ( IsWindows() )
{
PublicDelayLoadDLLs.Add(linkLibrary);
}
}
protected void addOsmToODR()
{
AddStaticLibrary( "sqlite3");
AddStaticLibrary( "proj");
AddStaticLibrary( "osm2odr");
if ( IsWindows() )
{
AddStaticLibrary( "xerces-c_3");
AddStaticLibrary( "zlibstatic");
}
else
{
AddStaticLibrary( "xerces-c");
}
}
protected void addROS2()
{
if (UsingRos2)
{
AddStaticLibrary( "foonathan_memory-0.7.3");
if ( IsWindows() )
{
AddStaticLibrary( "libfastcdr-1.1");
AddStaticLibrary( "libfastrtps-2.11");
}
else
{
AddStaticLibrary( "fastcdr");
AddStaticLibrary( "fastrtps");
}
PublicIncludePaths.Add(Path.Combine(LibCarlaInstallPath, "include", "carla", "ros2", "ros_types"));
PrivateIncludePaths.Add(Path.Combine(LibCarlaInstallPath, "include", "carla", "ros2", "ros_types"));
PublicDefinitions.Add("WITH_ROS2");
PrivateDefinitions.Add("WITH_ROS2");
}
}
}

View File

@ -4,21 +4,17 @@ using System;
using System.IO;
using UnrealBuildTool;
public class CarlaTools : ModuleRules
public class CarlaTools : CarlaRules
{
bool bUsingOmniverseConnector = false;
private bool IsWindows(ReadOnlyTargetRules Target)
{
return (Target.Platform == UnrealTargetPlatform.Win64) || (Target.Platform == UnrealTargetPlatform.Win32);
}
public CarlaTools(ReadOnlyTargetRules Target) : base(Target)
public CarlaTools(ReadOnlyTargetRules Target) : base(Target, "../../../Carla/CarlaDependencies")
{
PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
// PrivatePCHHeaderFile = "Carla.h";
if (IsWindows(Target))
if (IsWindows())
{
bEnableExceptions = true;
}
@ -36,6 +32,13 @@ public class CarlaTools : ModuleRules
PublicDefinitions.Add("WITH_OMNIVERSE");
PrivateDefinitions.Add("WITH_OMNIVERSE");
}
if (line.Contains("Ros2 ON"))
{
Console.WriteLine("Enabling ros2");
UsingRos2 = true;
}
}
PublicIncludePaths.AddRange(
@ -112,78 +115,32 @@ public class CarlaTools : ModuleRules
// ... add any modules that your module loads dynamically here ...
}
);
AddCarlaServerDependency(Target);
AddCarlaServerDependency();
}
private bool UseDebugLibs(ReadOnlyTargetRules Target)
{
if (IsWindows(Target))
{
// In Windows, Unreal uses the Release C++ Runtime (CRT) even in debug
// mode, so unless we recompile the engine we cannot link the debug
// libraries.
return false;
}
else
{
return false;
}
}
delegate string ADelegate(string s);
private void AddBoostLibs(string LibPath)
{
string [] files = Directory.GetFiles(LibPath, "*boost*.lib");
foreach (string file in files)
{
PublicAdditionalLibraries.Add(file);
}
}
private void AddCarlaServerDependency(ReadOnlyTargetRules Target)
private void AddCarlaServerDependency()
{
string LibCarlaInstallPath = Path.GetFullPath(Path.Combine(ModuleDirectory, "../../../Carla/CarlaDependencies"));
ADelegate GetLibName = (string BaseName) => {
if (IsWindows(Target))
{
return BaseName + ".lib";
}
else
{
return "lib" + BaseName + ".a";
}
};
// Link dependencies.
if (IsWindows(Target))
if (IsWindows())
{
AddBoostLibs(Path.Combine(LibCarlaInstallPath, "lib"));
PublicAdditionalLibraries.Add(Path.Combine(LibCarlaInstallPath, "lib", GetLibName("rpc")));
if (UseDebugLibs(Target))
{
PublicAdditionalLibraries.Add(Path.Combine(LibCarlaInstallPath, "lib", GetLibName("carla_server_debug")));
}
else
{
PublicAdditionalLibraries.Add(Path.Combine(LibCarlaInstallPath, "lib", GetLibName("carla_server")));
}
AddBoostLibs();
}
AddStaticLibrary("rpc");
if (UseDebugLibs())
{
AddStaticLibrary("carla_server_debug");
}
else
{
PublicAdditionalLibraries.Add(Path.Combine(LibCarlaInstallPath, "lib", GetLibName("rpc")));
if (UseDebugLibs(Target))
{
PublicAdditionalLibraries.Add(Path.Combine(LibCarlaInstallPath, "lib", GetLibName("carla_server_debug")));
}
else
{
PublicAdditionalLibraries.Add(Path.Combine(LibCarlaInstallPath, "lib", GetLibName("carla_server")));
}
AddStaticLibrary("carla_server");
}
addOsmToODR();
addROS2();
// Include path.
string LibCarlaIncludePath = Path.Combine(LibCarlaInstallPath, "include");
@ -192,7 +149,7 @@ public class CarlaTools : ModuleRules
PublicDefinitions.Add("ASIO_NO_EXCEPTIONS");
PublicDefinitions.Add("BOOST_NO_EXCEPTIONS");
// PublicDefinitions.Add("LIBCARLA_NO_EXCEPTIONS");
PublicDefinitions.Add("LIBCARLA_NO_EXCEPTIONS");
PublicDefinitions.Add("PUGIXML_NO_EXCEPTIONS");
PublicDefinitions.Add("BOOST_DISABLE_ABI_HEADERS");
PublicDefinitions.Add("BOOST_TYPE_INDEX_FORCE_NO_RTTI_COMPATIBILITY");

View File

@ -22,6 +22,13 @@ done
# ==============================================================================
source $(dirname "$0")/Environment.sh
UNREAL_SYSROOT="$UE4_ROOT/Engine/Extras/ThirdPartyNotUE/SDKs/HostLinux/Linux_x64/v17_clang-10.0.1-centos7/x86_64-unknown-linux-gnu"
export CC="${UNREAL_SYSROOT}/bin/clang"
export CXX="${UNREAL_SYSROOT}/bin/clang++"
export PATH="${UNREAL_SYSROOT}/bin:$PATH"
# Convert comma-separated string to array of unique elements.
IFS="," read -r -a PY_VERSION_LIST <<< "${PY_VERSION_LIST}"
@ -29,7 +36,7 @@ IFS="," read -r -a PY_VERSION_LIST <<< "${PY_VERSION_LIST}"
# -- Get ad-rss -------------------------------------------
# ==============================================================================
ADRSS_VERSION=4.4.4
ADRSS_VERSION=4.4.5
ADRSS_BASENAME=ad-rss-${ADRSS_VERSION}
ADRSS_COLCON_WORKSPACE="${CARLA_BUILD_FOLDER}/${ADRSS_BASENAME}"
ADRSS_SRC_DIR="${ADRSS_COLCON_WORKSPACE}/src"
@ -42,11 +49,8 @@ if [[ ! -d "${ADRSS_SRC_DIR}" ]]; then
# clone ad-rss with all submodules, but remove proj, as CARLA already uses it
pushd "${ADRSS_SRC_DIR}" >/dev/null
git clone -b v${ADRSS_VERSION} https://github.com/intel/ad-rss-lib.git && cd ad-rss-lib && git submodule update --init --recursive && rm -rf dependencies/map/dependencies/PROJ4 && cd ..
git clone -b v${ADRSS_VERSION} https://github.com/intel/ad-rss-lib.git && cd ad-rss-lib && git submodule update --init --recursive && cd ..
# ADRSS_VERSION is designed for older boost, update datatype from boost::array to std::array
grep -rl "boost::array" | xargs sed -i 's/boost::array/std::array/g'
grep -rl "find_package(Boost" | xargs sed -i 's/find_package(Boost/find_package(Boost 1.80/g'
popd
cat >"${ADRSS_COLCON_WORKSPACE}/colcon.meta" <<EOL
@ -91,8 +95,6 @@ ADRSS_INSTALL_DIR="${CARLA_BUILD_FOLDER}/${ADRSS_BASENAME}/install"
#else
# echo "Using clang-$CARLA_LLVM_VERSION_MAJOR as the CARLA compiler."
#fi
CXX_TAG=c10
#
# Since it it not possible with boost-python to build more than one python version at once (find_package has some bugs)
# we have to build it for every version in a separate colcon build
@ -107,9 +109,9 @@ for PY_VERSION in ${PY_VERSION_LIST[@]} ; do
pushd "${ADRSS_COLCON_WORKSPACE}" >/dev/null
if [[ "${CMAKE_PREFIX_PATH}" == "" ]]; then
CMAKE_PREFIX_PATH="${CARLA_BUILD_FOLDER}/boost-1.80.0-$CXX_TAG-install;${CARLA_BUILD_FOLDER}/proj-install"
CMAKE_PREFIX_PATH="${CARLA_BUILD_FOLDER}/boost-1.80.0-client-install;${CARLA_BUILD_FOLDER}/proj-client-install"
else
CMAKE_PREFIX_PATH="${CARLA_BUILD_FOLDER}/boost-1.80.0-$CXX_TAG-install;${CARLA_BUILD_FOLDER}/proj-install;${CMAKE_PREFIX_PATH}"
CMAKE_PREFIX_PATH="${CARLA_BUILD_FOLDER}/boost-1.80.0-client-install;${CARLA_BUILD_FOLDER}/proj-client-install;${CMAKE_PREFIX_PATH}"
fi
# get the python version of the binding to be built, need to query the binary,
@ -120,7 +122,7 @@ for PY_VERSION in ${PY_VERSION_LIST[@]} ; do
echo "PYTHON_BINDING_VERSIONS=${PYTHON_BINDING_VERSIONS}"
# enforce sequential executor to reduce the required memory for compilation
colcon build --executor sequential --packages-up-to ad_rss_map_integration --cmake-args -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_TOOLCHAIN_FILE="${CARLA_BUILD_FOLDER}/LibStdCppToolChain.cmake" -DCMAKE_PREFIX_PATH="${CMAKE_PREFIX_PATH}" -DPYTHON_BINDING_VERSIONS="${PYTHON_BINDING_VERSIONS}" --build-base ${ADRSS_BUILD_DIR} --install-base ${ADRSS_INSTALL_DIR}
colcon build --executor sequential --packages-up-to ad_rss_map_integration --cmake-args -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_TOOLCHAIN_FILE="${CARLA_BUILD_FOLDER}/CarlaClientToolChain.cmake" -DCMAKE_PREFIX_PATH="${CMAKE_PREFIX_PATH}" -DPYTHON_BINDING_VERSIONS="${PYTHON_BINDING_VERSIONS}" --build-base ${ADRSS_BUILD_DIR} --install-base ${ADRSS_INSTALL_DIR}
COLCON_RESULT=$?
if (( COLCON_RESULT )); then

View File

@ -6,7 +6,7 @@
DOC_STRING="Build and launch CarlaUE4."
USAGE_STRING="Usage: $0 [-h|--help] [--build] [--rebuild] [--launch] [--clean] [--hard-clean] [--opengl]"
USAGE_STRING="Usage: $0 [-h|--help] [--build] [--rebuild] [--launch] [--clean] [--hard-clean] [--opengl] [--ros2]"
REMOVE_INTERMEDIATE=false
HARD_CLEAN=false
@ -17,11 +17,13 @@ USE_CHRONO=false
USE_PYTORCH=false
USE_UNITY=true
USE_ROS2=false
EDITOR_ROS2_FLAGS=""
EDITOR_FLAGS=""
GDB=
RHI="-vulkan"
DEBUG=false
OPTS=`getopt -o h --long help,build,rebuild,launch,clean,hard-clean,gdb,opengl,carsim,pytorch,chrono,ros2,no-unity,editor-flags: -n 'parse-options' -- "$@"`
@ -35,6 +37,9 @@ while [[ $# -gt 0 ]]; do
--gdb )
GDB="gdb --args";
shift ;;
--debug )
DEBUG=true;
shift ;;
--build )
BUILD_CARLAUE4=true;
shift ;;
@ -66,6 +71,9 @@ while [[ $# -gt 0 ]]; do
shift ;;
--ros2 )
USE_ROS2=true;
# Due to continued segfaults in reallocations of MallocBinned2 enforce using AnsiMalloc calls
# (see https://forums.unrealengine.com/t/dealing-with-allocator-mismatches-with-external-libraries/1416830)
EDITOR_ROS2_FLAGS="-ansimalloc"
shift ;;
--no-unity )
USE_UNITY=false
@ -110,7 +118,7 @@ if ${HARD_CLEAN} ; then
log "Doing a \"hard\" clean of the Unreal Engine project."
make CarlaUE4Editor ARGS=-clean
make CarlaUE4Editor ARGS="-clean"
fi
@ -122,16 +130,16 @@ if ${REMOVE_INTERMEDIATE} ; then
rm -Rf ${UE4_INTERMEDIATE_FOLDERS}
cd Plugins
rm -Rf HoudiniEngine
cd ..
rm -f Makefile
pushd "${CARLAUE4_PLUGIN_ROOT_FOLDER}" >/dev/null
rm -Rf ${UE4_INTERMEDIATE_FOLDERS}
cd Plugins
rm -Rf HoudiniEngine
cd ..
popd >/dev/null
fi
@ -165,12 +173,16 @@ if ${BUILD_CARLAUE4} ; then
else
OPTIONAL_MODULES_TEXT="Ros2 OFF"$'\n'"${OPTIONAL_MODULES_TEXT}"
fi
if ${DEBUG} ; then
OPTIONAL_MODULES_TEXT="Debug ON"$'\n'"${OPTIONAL_MODULES_TEXT}"
else
OPTIONAL_MODULES_TEXT="Debug OFF"$'\n'"${OPTIONAL_MODULES_TEXT}"
fi
if ${USE_UNITY} ; then
OPTIONAL_MODULES_TEXT="Unity ON"$'\n'"${OPTIONAL_MODULES_TEXT}"
else
OPTIONAL_MODULES_TEXT="Unity OFF"$'\n'"${OPTIONAL_MODULES_TEXT}"
fi
OPTIONAL_MODULES_TEXT="Fast_dds ON"$'\n'"${OPTIONAL_MODULES_TEXT}"
echo ${OPTIONAL_MODULES_TEXT} > ${PWD}/Config/OptionalModules.ini
if [ ! -f Makefile ]; then
@ -200,7 +212,7 @@ fi
if ${LAUNCH_UE4_EDITOR} ; then
log "Launching UE4Editor..."
${GDB} ${UE4_ROOT}/Engine/Binaries/Linux/UE4Editor "${PWD}/CarlaUE4.uproject" ${RHI} ${EDITOR_FLAGS}
${GDB} ${UE4_ROOT}/Engine/Binaries/Linux/UE4Editor "${PWD}/CarlaUE4.uproject" ${RHI} ${EDITOR_FLAGS} ${EDITOR_ROS2_FLAGS}
else

View File

@ -15,11 +15,13 @@ rem -- Parse arguments ---------------------------------------------------------
rem ============================================================================
set DOC_STRING=Build LibCarla.
set USAGE_STRING=Usage: %FILE_N% [-h^|--help] [--rebuild] [--server] [--client] [--clean]
set USAGE_STRING=Usage: %FILE_N% [-h^|--help] [--rebuild] [--server] [--client] [--clean] [--ros2]
set REMOVE_INTERMEDIATE=false
set BUILD_SERVER=false
set BUILD_CLIENT=false
set M_ROS2=OFF
set GENERATOR=""
:arg-parse
if not "%1"=="" (
@ -34,6 +36,9 @@ if not "%1"=="" (
if "%1"=="--client" (
set BUILD_CLIENT=true
)
if "%1"=="--ros2" (
set M_ROS2=ON
)
if "%1"=="--clean" (
set REMOVE_INTERMEDIATE=true
)
@ -73,7 +78,11 @@ rem
set LIBCARLA_VSPROJECT_PATH=%INSTALLATION_DIR:/=\%libcarla-visualstudio\
if %GENERATOR% == "" set GENERATOR="Visual Studio 16 2019"
echo.%GENERATOR% | findstr /C:"Visual Studio" >nul && (
set PLATFORM=-A x64
) || (
set PLATFORM=
)
set LIBCARLA_SERVER_INSTALL_PATH=%ROOT_PATH:/=\%Unreal\CarlaUE4\Plugins\Carla\CarlaDependencies\
set LIBCARLA_CLIENT_INSTALL_PATH=%ROOT_PATH:/=\%PythonAPI\carla\dependencies\
@ -104,12 +113,6 @@ if %REMOVE_INTERMEDIATE% == true (
if not exist "%LIBCARLA_VSPROJECT_PATH%" mkdir "%LIBCARLA_VSPROJECT_PATH%"
cd "%LIBCARLA_VSPROJECT_PATH%"
echo.%GENERATOR% | findstr /C:"Visual Studio" >nul && (
set PLATFORM=-A x64
) || (
set PLATFORM=
)
rem For some reason the findstr above sets an errorlevel even if it finds the string in this batch file.
set errorlevel=0
@ -121,6 +124,7 @@ if %BUILD_SERVER% == true (
-DCMAKE_BUILD_TYPE=Server^
-DCMAKE_CXX_FLAGS_RELEASE="/MD /MP"^
-DCMAKE_INSTALL_PREFIX="%LIBCARLA_SERVER_INSTALL_PATH:\=/%"^
-DLIBCARLA_USE_ROS="%M_ROS2%"^
"%ROOT_PATH%"
if %errorlevel% neq 0 goto error_cmake

View File

@ -125,28 +125,31 @@ function build_libcarla {
CMAKE_EXTRA_OPTIONS=''
M_ROS=false
if [ $1 == Server ] ; then
M_TOOLCHAIN=${LIBCPP_TOOLCHAIN_FILE}
M_TOOLCHAIN=${CARLA_SERVER_TOOLCHAIN_FILE}
M_BUILD_FOLDER=${LIBCARLA_BUILD_SERVER_FOLDER}.$(echo "$2" | tr '[:upper:]' '[:lower:]')
M_INSTALL_FOLDER=${LIBCARLA_INSTALL_SERVER_FOLDER}
elif [ $1 == ServerROS ] ; then
BUILD_TYPE='Server'
M_TOOLCHAIN=${CARLA_SERVER_TOOLCHAIN_FILE}
M_BUILD_FOLDER=${LIBCARLA_BUILD_SERVER_FOLDER}.ROS.$(echo "$2" | tr '[:upper:]' '[:lower:]')
M_INSTALL_FOLDER=${LIBCARLA_INSTALL_SERVER_FOLDER}
M_ROS=true
elif [ $1 == Client ] ; then
M_TOOLCHAIN=${LIBSTDCPP_TOOLCHAIN_FILE}
M_TOOLCHAIN=${CARLA_CLIENT_TOOLCHAIN_FILE}
M_BUILD_FOLDER=${LIBCARLA_BUILD_CLIENT_FOLDER}.$(echo "$2" | tr '[:upper:]' '[:lower:]')
M_INSTALL_FOLDER=${LIBCARLA_INSTALL_CLIENT_FOLDER}
elif [ $1 == Pytorch ] ; then
M_TOOLCHAIN=${LIBSTDCPP_TOOLCHAIN_FILE}
M_TOOLCHAIN=${CARLA_SERVER_TOOLCHAIN_FILE}
M_BUILD_FOLDER=${LIBCARLA_BUILD_PYTORCH_FOLDER}.$(echo "$2" | tr '[:upper:]' '[:lower:]')
M_INSTALL_FOLDER=${LIBCARLA_INSTALL_SERVER_FOLDER}
elif [ $1 == ros2 ] ; then
M_TOOLCHAIN=${LIBSTDCPP_TOOLCHAIN_FILE}
M_BUILD_FOLDER=${LIBCARLA_FASTDDS_FOLDER}.$(echo "$2" | tr '[:upper:]' '[:lower:]')
M_INSTALL_FOLDER=${LIBCARLA_INSTALL_SERVER_FOLDER}
elif [ $1 == ClientRSS ] ; then
BUILD_TYPE='Client'
M_TOOLCHAIN=${LIBSTDCPP_TOOLCHAIN_FILE}
M_TOOLCHAIN=${CARLA_CLIENT_TOOLCHAIN_FILE}
M_BUILD_FOLDER=${LIBCARLA_BUILD_CLIENT_FOLDER}.rss.$(echo "$2" | tr '[:upper:]' '[:lower:]')
M_INSTALL_FOLDER=${LIBCARLA_INSTALL_CLIENT_FOLDER}
CMAKE_EXTRA_OPTIONS="${CMAKE_EXTRA_OPTIONS:+${CMAKE_EXTRA_OPTIONS} }-DBUILD_RSS_VARIANT=ON -DADRSS_INSTALL_DIR=${CARLA_BUILD_FOLDER}/ad-rss-4.4.4/install"
CMAKE_EXTRA_OPTIONS="${CMAKE_EXTRA_OPTIONS:+${CMAKE_EXTRA_OPTIONS} }-DBUILD_RSS_VARIANT=ON -DADRSS_INSTALL_DIR=${CARLA_BUILD_FOLDER}/ad-rss-4.4.5/install"
else
fatal_error "Invalid build configuration \"$1\""
fi
@ -184,6 +187,7 @@ function build_libcarla {
-DCMAKE_BUILD_TYPE=${BUILD_TYPE:-$1} \
-DLIBCARLA_BUILD_DEBUG=${M_DEBUG} \
-DLIBCARLA_BUILD_RELEASE=${M_RELEASE} \
-DLIBCARLA_USE_ROS=${M_ROS} \
-DCMAKE_TOOLCHAIN_FILE=${M_TOOLCHAIN} \
-DCMAKE_INSTALL_PREFIX=${M_INSTALL_FOLDER} \
-DCMAKE_EXPORT_COMPILE_COMMANDS=1 \
@ -194,7 +198,7 @@ function build_libcarla {
fi
ninja
ninja
ninja install | grep -v "Up-to-date:"
@ -205,23 +209,22 @@ function build_libcarla {
# -- Build all possible configurations -----------------------------------------
# ==============================================================================
SERVER_VARIANT='Server'
if ${USE_ROS2}; then
SERVER_VARIANT='ServerROS'
fi
if { ${BUILD_SERVER} && ${BUILD_OPTION_DEBUG}; }; then
build_libcarla Server Debug
build_libcarla ${SERVER_VARIANT} Debug
fi
if { ${BUILD_SERVER} && ${BUILD_OPTION_RELEASE}; }; then
build_libcarla Server Release
build_libcarla ${SERVER_VARIANT} Release
if ${USE_PYTORCH} ; then
build_libcarla Pytorch Release
fi
if ${USE_ROS2} ; then
build_libcarla ros2 Release
fi
fi
CLIENT_VARIANT='Client'

View File

@ -6,6 +6,7 @@ rem Run it through a cmd with the x64 Visual C++ Toolset enabled.
set LOCAL_PATH=%~dp0
set FILE_N=-[%~n0]:
set GENERATOR=""
rem Print batch params (debug purpose)
echo %FILE_N% [Batch params]: %*
@ -57,6 +58,13 @@ if not "%1"=="" (
goto :arg-parse
)
if %GENERATOR% == "" set GENERATOR="Visual Studio 16 2019"
echo.%GENERATOR% | findstr /C:"Visual Studio" >nul && (
set PLATFORM=-A x64
) || (
set PLATFORM=
)
if %REMOVE_INTERMEDIATE% == false (
if %BUILD_OSM2ODR% == false (
echo Nothing selected to be done.
@ -76,8 +84,6 @@ set OSM2ODR_INSTALL_PATH=%ROOT_PATH:/=\%PythonAPI\carla\dependencies\
set OSM2ODR__SERVER_INSTALL_PATH=%ROOT_PATH:/=\%Unreal\CarlaUE4\Plugins\Carla\CarlaDependencies
set CARLA_DEPENDENCIES_FOLDER=%ROOT_PATH:/=\%Unreal\CarlaUE4\Plugins\Carla\CarlaDependencies\
if %GENERATOR% == "" set GENERATOR="Visual Studio 16 2019"
if %REMOVE_INTERMEDIATE% == true (
rem Remove directories
for %%G in (
@ -90,6 +96,7 @@ if %REMOVE_INTERMEDIATE% == true (
)
)
rem Build OSM2ODR
if %BUILD_OSM2ODR% == true (
cd "%INSTALLATION_DIR%"
@ -99,7 +106,7 @@ if %BUILD_OSM2ODR% == true (
del OSM2ODR.zip
ren sumo-%CURRENT_OSM2ODR_COMMIT% osm2odr-source
)
cd ..
if not exist "%OSM2ODR_VSPROJECT_PATH%" mkdir "%OSM2ODR_VSPROJECT_PATH%"
cd "%OSM2ODR_VSPROJECT_PATH%"

View File

@ -14,7 +14,7 @@ END
REMOVE_INTERMEDIATE=false
BUILD_OSM2ODR=false
GIT_PULL=true
CURRENT_OSM2ODR_COMMIT=1835e1e9538d0778971acc8b19b111834aae7261
CURRENT_OSM2ODR_COMMIT=2a490962dc54da711ab09265393a4dc2f6d31813
OSM2ODR_BRANCH=aaron/defaultsidewalkwidth
OSM2ODR_REPO=https://github.com/carla-simulator/sumo.git
@ -51,13 +51,15 @@ source $(dirname "$0")/Environment.sh
function get_source_code_checksum {
local EXCLUDE='*__pycache__*'
find "${OSM2ODR_SOURCE_FOLDER}"/* \! -path "${EXCLUDE}" -print0 | sha1sum | awk '{print $1}'
find "${OSM2ODR_BASENAME}-source"/* \! -path "${EXCLUDE}" -print0 | sha1sum | awk '{print $1}'
}
if ! { ${REMOVE_INTERMEDIATE} || ${BUILD_OSM2ODR}; }; then
fatal_error "Nothing selected to be done."
fi
OSM2ODR_BASENAME=${CARLA_BUILD_FOLDER}/osm2odr
# ==============================================================================
# -- Clean intermediate files --------------------------------------------------
# ==============================================================================
@ -66,7 +68,8 @@ if ${REMOVE_INTERMEDIATE} ; then
log "Cleaning intermediate files and folders."
rm -Rf ${OSM2ODR_BUILD_FOLDER}*
rm -Rf ${OSM2ODR_BASENAME}-client-build* ${OSM2ODR_BASENAME}-server-build*
rm -Rf ${OSM2ODR_BASENAME}-server-install* ${OSM2ODR_BASENAME}-client-install*
fi
@ -75,75 +78,64 @@ fi
# ==============================================================================
if ${BUILD_OSM2ODR} ; then
log "Building OSM2ODR."
if [ ! -d ${OSM2ODR_SOURCE_FOLDER} ] ; then
cd ${CARLA_BUILD_FOLDER}
curl --retry 5 --retry-max-time 120 -L -o OSM2ODR.zip https://github.com/carla-simulator/sumo/archive/${CURRENT_OSM2ODR_COMMIT}.zip
unzip -qq OSM2ODR.zip
rm -f OSM2ODR.zip
mv sumo-${CURRENT_OSM2ODR_COMMIT} ${OSM2ODR_SOURCE_FOLDER}
if [[ -d ${OSM2ODR_BASENAME}-client-install && -d ${OSM2ODR_BASENAME}-server-install ]] ; then
log "OSM2ODR already installed."
else
rm -Rf \
${OSM2ODR_BASENAME}-source \
${OSM2ODR_BASENAME}-server-build ${OSM2ODR_BASENAME}-client-build \
${OSM2ODR_BASENAME}-server-install ${OSM2ODR_BASENAME}-client-install
log "Building OSM2ODR."
if [ ! -d ${OSM2ODR_BASENAME}-source ] ; then
cd ${CARLA_BUILD_FOLDER}
curl --retry 5 --retry-max-time 120 -L -o OSM2ODR.zip https://github.com/carla-simulator/sumo/archive/${CURRENT_OSM2ODR_COMMIT}.zip
unzip -qq OSM2ODR.zip
rm -f OSM2ODR.zip
mv sumo-${CURRENT_OSM2ODR_COMMIT} ${OSM2ODR_BASENAME}-source
fi
mkdir -p ${OSM2ODR_BASENAME}-client-build
pushd ${OSM2ODR_BASENAME}-client-build >/dev/null
cmake ${OSM2ODR_BASENAME}-source \
-G "Eclipse CDT4 - Ninja" \
-DCMAKE_INSTALL_PREFIX=${OSM2ODR_BASENAME}-client-install \
-DCMAKE_TOOLCHAIN_FILE="${CARLA_CLIENT_TOOLCHAIN_FILE}" \
-DOSM2ODR_INCLUDE_DIR=${CARLA_BUILD_FOLDER}/proj-client-install/include \
-DOSM2ODR_LIBRARY=${CARLA_BUILD_FOLDER}/proj-client-install/lib/libproj.so \
-DXercesC_INCLUDE_DIR=${CARLA_BUILD_FOLDER}/xerces-c-3.2.3-client-install/include \
-DXercesC_LIBRARY=${CARLA_BUILD_FOLDER}/xerces-c-3.2.3-client-install/lib/libxerces-c.so
ninja osm2odr
ninja install
popd >/dev/null
mkdir -p ${OSM2ODR_BASENAME}-server-build
pushd ${OSM2ODR_BASENAME}-server-build >/dev/null
cmake ${OSM2ODR_BASENAME}-source \
-G "Eclipse CDT4 - Ninja" \
-DCMAKE_INSTALL_PREFIX=${OSM2ODR_BASENAME}-server-install \
-DCMAKE_TOOLCHAIN_FILE="${CARLA_SERVER_TOOLCHAIN_FILE}" \
-DOSM2ODR_INCLUDE_DIR=${CARLA_BUILD_FOLDER}/proj-server-install/include \
-DOSM2ODR_LIBRARY=${CARLA_BUILD_FOLDER}/proj-server-install/lib/libproj.a \
-DXercesC_INCLUDE_DIR=${CARLA_BUILD_FOLDER}/xerces-c-3.2.3-server-install/include \
-DXercesC_LIBRARY=${CARLA_BUILD_FOLDER}/xerces-c-3.2.3-server-install/lib/libxerces-c.a
ninja osm2odr
ninja install
popd >/dev/null
rm -Rf ${OSM2ODR_BASENAME}-server-build ${OSM2ODR_BASENAME}-client-build
fi
mkdir -p ${OSM2ODR_BUILD_FOLDER}
cd ${OSM2ODR_BUILD_FOLDER}
cp -p -r ${OSM2ODR_BASENAME}-server-install/include/* ${LIBCARLA_INSTALL_SERVER_FOLDER}/include/
cp -p ${OSM2ODR_BASENAME}-server-install/lib/*.a ${LIBCARLA_INSTALL_SERVER_FOLDER}/lib
export CC="$UE4_ROOT/Engine/Extras/ThirdPartyNotUE/SDKs/HostLinux/Linux_x64/v17_clang-10.0.1-centos7/x86_64-unknown-linux-gnu/bin/clang"
export CXX="$UE4_ROOT/Engine/Extras/ThirdPartyNotUE/SDKs/HostLinux/Linux_x64/v17_clang-10.0.1-centos7/x86_64-unknown-linux-gnu/bin/clang++"
export PATH="$UE4_ROOT/Engine/Extras/ThirdPartyNotUE/SDKs/HostLinux/Linux_x64/v17_clang-10.0.1-centos7/x86_64-unknown-linux-gnu/bin:$PATH"
cmake ${OSM2ODR_SOURCE_FOLDER} \
-G "Eclipse CDT4 - Ninja" \
-DCMAKE_CXX_FLAGS="-stdlib=libstdc++" \
-DCMAKE_INSTALL_PREFIX=${LIBCARLA_INSTALL_CLIENT_FOLDER} \
-DPROJ_INCLUDE_DIR=${CARLA_BUILD_FOLDER}/proj-install/include \
-DPROJ_LIBRARY=${CARLA_BUILD_FOLDER}/proj-install/lib/libproj.a \
-DXercesC_INCLUDE_DIR=${CARLA_BUILD_FOLDER}/xerces-c-3.2.3-install/include \
-DXercesC_LIBRARY=${CARLA_BUILD_FOLDER}/xerces-c-3.2.3-install/lib/libxerces-c.a
ninja osm2odr
ninja install
mkdir -p ${OSM2ODR_SERVER_BUILD_FOLDER}
cd ${OSM2ODR_SERVER_BUILD_FOLDER}
LLVM_BASENAME=llvm-8.0
LLVM_INCLUDE="$UE4_ROOT/Engine/Source/ThirdParty/Linux/LibCxx/include/c++/v1"
LLVM_LIBPATH="$UE4_ROOT/Engine/Source/ThirdParty/Linux/LibCxx/lib/Linux/x86_64-unknown-linux-gnu"
echo $LLVM_INCLUDE
echo $LLVM_LIBPATH
cmake ${OSM2ODR_SOURCE_FOLDER} \
-G "Eclipse CDT4 - Ninja" \
-DCMAKE_CXX_FLAGS="-fPIC -std=c++14 -stdlib=libc++ -I${LLVM_INCLUDE} -L${LLVM_LIBPATH}" \
-DCMAKE_INSTALL_PREFIX=${LIBCARLA_INSTALL_SERVER_FOLDER} \
-DPROJ_INCLUDE_DIR=${CARLA_BUILD_FOLDER}/proj-install-server/include \
-DPROJ_LIBRARY=${CARLA_BUILD_FOLDER}/proj-install-server/lib/libproj.a \
-DXercesC_INCLUDE_DIR=${CARLA_BUILD_FOLDER}/xerces-c-3.2.3-install-server/include \
-DXercesC_LIBRARY=${CARLA_BUILD_FOLDER}/xerces-c-3.2.3-install-server/lib/libxerces-c.a
ninja osm2odr
ninja install
mkdir -p ${OSM2ODR_SERVER_BUILD_FOLDER}
cd ${OSM2ODR_SERVER_BUILD_FOLDER}
LLVM_BASENAME=llvm-8.0
LLVM_INCLUDE="$UE4_ROOT/Engine/Source/ThirdParty/Linux/LibCxx/include/c++/v1"
LLVM_LIBPATH="$UE4_ROOT/Engine/Source/ThirdParty/Linux/LibCxx/lib/Linux/x86_64-unknown-linux-gnu"
cmake ${OSM2ODR_SOURCE_FOLDER} \
-G "Eclipse CDT4 - Ninja" \
-DCMAKE_CXX_FLAGS="-fPIC -std=c++14 -stdlib=libc++ -I${LLVM_INCLUDE} -L${LLVM_LIBPATH}" \
-DCMAKE_INSTALL_PREFIX=${LIBCARLA_INSTALL_SERVER_FOLDER} \
-DPROJ_INCLUDE_DIR=${CARLA_BUILD_FOLDER}/proj-install-server/include \
-DPROJ_LIBRARY=${CARLA_BUILD_FOLDER}/proj-install-server/lib/libproj.a \
-DXercesC_INCLUDE_DIR=${CARLA_BUILD_FOLDER}/xerces-c-3.2.3-install-server/include \
-DXercesC_LIBRARY=${CARLA_BUILD_FOLDER}/xerces-c-3.2.3-install-server/lib/libxerces-c.a
ninja osm2odr
ninja install
cp -p -r ${OSM2ODR_BASENAME}-client-install/include/* ${LIBCARLA_INSTALL_CLIENT_FOLDER}/include/
cp -p ${OSM2ODR_BASENAME}-client-install/lib/*.a ${LIBCARLA_INSTALL_CLIENT_FOLDER}/lib
fi

View File

@ -75,7 +75,7 @@ if not exist "%OSM_RENDERER_VSPROJECT_PATH%" mkdir "%OSM_RENDERER_VSPROJECT_PATH
cd "%OSM_RENDERER_VSPROJECT_PATH%"
cmake -G "Visual Studio 16 2019" -A x64^
-DCMAKE_CXX_FLAGS_RELEASE="/std:c++17 /wd4251 /I%INSTALLATION_DIR:/=\%boost-1.80.0-install\include"^
-DCMAKE_CXX_FLAGS_RELEASE="/std:c++20 /wd4251 /I%INSTALLATION_DIR:/=\%boost-1.80.0-install\include"^
"%OSM_RENDERER_SOURCE%"
cmake --build . --config Release

View File

@ -68,7 +68,7 @@ echo "Building osm-map-renderer"
mkdir -p ${OSM_RENDERER_BUILD}
cd ${OSM_RENDERER_BUILD}
cmake -DCMAKE_CXX_FLAGS="-std=c++17 -g -pthread -I${CARLA_BUILD_FOLDER}/boost-1.80.0-c10-install/include" \
cmake -DCMAKE_TOOLCHAIN_FILE="${CARLA_CLIENT_TOOLCHAIN_FILE}" -DCMAKE_CXX_FLAGS="-g -I${CARLA_BUILD_FOLDER}/boost-1.80.0-install/include" \
${OSM_RENDERER_SOURCE}
make

View File

@ -48,10 +48,10 @@ while [[ $# -gt 0 ]]; do
esac
done
export CC="$UE4_ROOT/Engine/Extras/ThirdPartyNotUE/SDKs/HostLinux/Linux_x64/v17_clang-10.0.1-centos7/x86_64-unknown-linux-gnu/bin/clang"
export CXX="$UE4_ROOT/Engine/Extras/ThirdPartyNotUE/SDKs/HostLinux/Linux_x64/v17_clang-10.0.1-centos7/x86_64-unknown-linux-gnu/bin/clang++"
export PATH="$UE4_ROOT/Engine/Extras/ThirdPartyNotUE/SDKs/HostLinux/Linux_x64/v17_clang-10.0.1-centos7/x86_64-unknown-linux-gnu/bin:$PATH"
UNREAL_SYSROOT="$UE4_ROOT/Engine/Extras/ThirdPartyNotUE/SDKs/HostLinux/Linux_x64/v17_clang-10.0.1-centos7/x86_64-unknown-linux-gnu"
export CC="${UNREAL_SYSROOT}/bin/clang"
export CXX="${UNREAL_SYSROOT}/bin/clang++"
export PATH="${UNREAL_SYSROOT}/bin:$PATH"
source $(dirname "$0")/Environment.sh
@ -75,7 +75,7 @@ if ${REMOVE_INTERMEDIATE} ; then
rm -Rf build dist source/carla.egg-info
find source -name "*.so" -delete
find source -name "__pycache__" -type d -exec rm -r "{}" \;
find source -name "__pycache__" -type d -exec rm -rf "{}" \;
fi

View File

@ -37,7 +37,7 @@ mkdir -p "${FBX2OBJ_BUILD_FOLDER}"
pushd "${FBX2OBJ_BUILD_FOLDER}" >/dev/null
cmake -G "Ninja" \
-DCMAKE_CXX_FLAGS="-fPIC -std=c++14" \
-DCMAKE_CXX_FLAGS="-fPIC -std=c++20" \
..
# copy the shared object 'libfbxsdk.so' to 'dist' folder

View File

@ -7,6 +7,10 @@ launch: LibCarla.server.release osm2odr downloadplugins
@${CARLA_BUILD_TOOLS_FOLDER}/BuildUE4Plugins.sh --build $(ARGS)
@${CARLA_BUILD_TOOLS_FOLDER}/BuildCarlaUE4.sh --build --launch $(ARGS)
launch.debug: LibCarla.server.debug osm2odr downloadplugins
@${CARLA_BUILD_TOOLS_FOLDER}/BuildUE4Plugins.sh --build $(ARGS)
@${CARLA_BUILD_TOOLS_FOLDER}/BuildCarlaUE4.sh --build --debug --launch $(ARGS)
launch-only:
@${CARLA_BUILD_TOOLS_FOLDER}/BuildCarlaUE4.sh --launch $(ARGS)
@ -138,7 +142,7 @@ LibCarla.client.rss.release: setup ad-rss
plugins:
@${CARLA_BUILD_TOOLS_FOLDER}/Plugins.sh $(ARGS)
setup downloadplugins:
setup: downloadplugins
@${CARLA_BUILD_TOOLS_FOLDER}/Setup.sh $(ARGS)
ad-rss:

View File

@ -6,7 +6,7 @@
DOC_STRING="Makes a packaged version of CARLA and other content packages ready for distribution."
USAGE_STRING="Usage: $0 [-h|--help] [--config={Debug,Development,Shipping}] [--no-zip] [--clean-intermediate] [--packages=Name1,Name2,...] [--target-archive=] [--archive-sufix=]"
USAGE_STRING="Usage: $0 [-h|--help] [--config={Debug,Development,Shipping}] [--no-zip] [--clean-intermediate] [--packages=Name1,Name2,...] [--target-archive=] [--archive-sufix=] [--ros2]"
PACKAGES="Carla"
DO_TARBALL=true
@ -17,7 +17,10 @@ USE_CARSIM=false
SINGLE_PACKAGE=false
ARCHIVE_SUFIX=""
OPTS=`getopt -o h --long help,config:,no-zip,clean-intermediate,carsim,packages:,python-version,target-archive:,archive-sufix:, -n 'parse-options' -- "$@"`
EDITOR_ROS2_FLAGS=""
OPTS=`getopt -o h --long help,config:,no-zip,clean-intermediate,carsim,packages:,python-version,target-archive:,archive-sufix:,ros2 -n 'parse-options' -- "$@"`
eval set -- "$OPTS"
@ -42,6 +45,11 @@ while [[ $# -gt 0 ]]; do
--archive-sufix )
ARCHIVE_SUFIX="$2"
shift 2 ;;
--ros2 )
# Due to continued segfaults in reallocations of MallocBinned2 enforce using AnsiMalloc calls
# (see https://forums.unrealengine.com/t/dealing-with-allocator-mismatches-with-external-libraries/1416830)
EDITOR_ROS2_FLAGS="-ansimalloc"
shift ;;
--carsim )
USE_CARSIM=true;
shift ;;
@ -182,12 +190,14 @@ if ${DO_CARLA_RELEASE} ; then
fi
if [ -d "./Unreal/CarlaUE4/Plugins/Carla/CarlaDependencies/lib" ] ; then
cp -r "./Unreal/CarlaUE4/Plugins/Carla/CarlaDependencies/lib" "${DESTINATION}/CarlaUE4/Plugins/Carla/CarlaDependencies"
cp -r "./Unreal/CarlaUE4/Plugins/Carla/CarlaDependencies/lib/" "${DESTINATION}/CarlaUE4/Plugins/Carla/CarlaDependencies"
fi
copy_if_changed "./Unreal/CarlaUE4/Content/Carla/HDMaps/*.pcd" "${DESTINATION}/HDMaps/"
copy_if_changed "./Unreal/CarlaUE4/Content/Carla/HDMaps/Readme.md" "${DESTINATION}/HDMaps/README"
sed -i "s/CarlaUE4 /CarlaUE4 ${EDITOR_ROS2_FLAGS} /g" "${DESTINATION}/CarlaUE4.sh"
popd >/dev/null
fi

View File

@ -65,7 +65,7 @@ if not "%1"=="" (
rem If not defined, use Visual Studio 2019 as tool set
if "%TOOLSET%" == "" set TOOLSET=msvc-14.2
if %GENERATOR% == "" set GENERATOR="Visual Studio 16 2019"
if "%GENERATOR%" == "" set GENERATOR="Visual Studio 16 2019"
rem If is not set, set the number of parallel jobs to the number of CPU threads
if "%NUMBER_OF_ASYNC_JOBS%" == "" set NUMBER_OF_ASYNC_JOBS=%NUMBER_OF_PROCESSORS%
@ -81,14 +81,17 @@ echo %FILE_N% Boost toolset: %TOOLSET%
echo %FILE_N% Generator: %GENERATOR%
echo %FILE_N% Install directory: "%INSTALLATION_DIR%"
if not exist "%CONTENT_DIR%" (
echo %FILE_N% Creating "%CONTENT_DIR%" folder...
mkdir "%CONTENT_DIR%"
)
if not exist "%INSTALLATION_DIR%" (
echo %FILE_N% Creating "%INSTALLATION_DIR%" folder...
mkdir "%INSTALLATION_DIR%"
rem creating some folders
for %%G in (
"%CONTENT_DIR%",
"%INSTALLATION_DIR%",
"%CARLA_DEPENDENCIES_FOLDER%\include",
"%CARLA_DEPENDENCIES_FOLDER%\lib"
) do (
if not exist %%G (
echo %FILE_N% Creating "%%G" folder...
mkdir "%%G"
)
)
rem ============================================================================
@ -141,6 +144,8 @@ if not defined install_rpclib (
echo %FILE_N% Failed while installing rpclib.
goto failed
)
xcopy /Y /S /I %INSTALLATION_DIR%rpclib-install\include\rpc\* %CARLA_DEPENDENCIES_FOLDER%\include\rpc\* > NUL
copy %INSTALLATION_DIR%rpclib-install\lib\*.* %CARLA_DEPENDENCIES_FOLDER%\lib\ > NUL
rem ============================================================================
rem -- Download and install Google Test ----------------------------------------
@ -178,26 +183,6 @@ if not defined install_recast (
set RECAST_INSTALL_DIR=%install_recast:\=/%
)
rem ============================================================================
rem -- Download and install Fast-DDS (for ROS2)---------------------------------
rem ============================================================================
if %USE_ROS2% == true (
echo %FILE_N% Installing "Fast-DDS"...
call "%INSTALLERS_DIR%install_fastDDS.bat"^
--build-dir "%INSTALLATION_DIR%"
if %errorlevel% neq 0 goto failed
if not defined install_dds (
echo %FILE_N% Failed while installing "Fast-DDS".
goto failed
) else (
set FASTDDS_INSTALL_DIR=%install_dds:\=/%
)
)
rem ============================================================================
rem -- Download and install Boost ----------------------------------------------
rem ============================================================================
@ -216,6 +201,27 @@ if not defined install_boost (
goto failed
)
rem ============================================================================
rem -- Download and install Fast-DDS (for ROS2)---------------------------------
rem ============================================================================
if %USE_ROS2% == true (
echo %FILE_N% Installing "Fast-DDS"...
call "%INSTALLERS_DIR%install_fastDDS.bat"^
--boost-version %BOOST_VERSION%^
--build-dir "%INSTALLATION_DIR%"^
--install-dir "%INSTALLATION_DIR%fastDDS-install\"
if %errorlevel% neq 0 goto failed
if not defined install_dds (
echo %FILE_N% Failed while installing "Fast-DDS".
goto failed
)
copy %INSTALLATION_DIR%fastDDS-install\lib\*.lib %CARLA_DEPENDENCIES_FOLDER%\lib > NUL
xcopy /Y /S /I %INSTALLATION_DIR%fastDDS-install\include\* %CARLA_DEPENDENCIES_FOLDER%\include\* > NUL
)
rem ============================================================================
rem -- Download and install Xercesc --------------------------------------------
rem ============================================================================
@ -285,81 +291,6 @@ if %USE_CHRONO% == true (
xcopy /Y /S /I "%INSTALLATION_DIR%eigen-install\include\*" "%CARLA_DEPENDENCIES_FOLDER%include\*" > NUL
)
REM ==============================================================================
REM -- Download Fast DDS and dependencies ----------------------------------------
REM ==============================================================================
SET FASTDDS_BASENAME=fast-dds
SET FASTDDS_INSTALL_DIR=%CD%\%FASTDDS_BASENAME%-install
SET FASTDDS_INCLUDE=%FASTDDS_INSTALL_DIR%\include
SET FASTDDS_LIB=%FASTDDS_INSTALL_DIR%\lib
IF "%USE_ROS2%"=="true" (
:build_fastdds_extension
SET LIB_SOURCE=%1
SET LIB_REPO=%2
SET CMAKE_FLAGS=%3
IF NOT EXIST "%LIB_SOURCE%" (
mkdir "%LIB_SOURCE%"
echo %LIB_REPO%
git clone %LIB_REPO% %LIB_SOURCE%
mkdir "%LIB_SOURCE%\build"
)
IF NOT EXIST "%FASTDDS_INSTALL_DIR%" (
mkdir "%FASTDDS_INSTALL_DIR%"
echo Build foonathan memory vendor
SET FOONATHAN_MEMORY_VENDOR_BASENAME=foonathan-memory-vendor
SET FOONATHAN_MEMORY_VENDOR_SOURCE_DIR=%CD%\%FOONATHAN_MEMORY_VENDOR_BASENAME%-source
SET FOONATHAN_MEMORY_VENDOR_REPO="https://github.com/eProsima/foonathan_memory_vendor.git"
SET FOONATHAN_MEMORY_VENDOR_CMAKE_FLAGS=-DBUILD_SHARED_LIBS=ON
CALL :build_fastdds_extension "%FOONATHAN_MEMORY_VENDOR_SOURCE_DIR%" "%FOONATHAN_MEMORY_VENDOR_REPO%"
pushd "%FOONATHAN_MEMORY_VENDOR_SOURCE_DIR%\build" >nul
cmake -G "Ninja" ^
-DCMAKE_INSTALL_PREFIX="%FASTDDS_INSTALL_DIR%" ^
-DBUILD_SHARED_LIBS=ON ^
-DCMAKE_CXX_FLAGS_RELEASE="-D_GLIBCXX_USE_CXX11_ABI=0" ^
-DFOONATHAN_MEMORY_FORCE_VENDORED_BUILD=ON ^
..
ninja
ninja install
popd >nul
rmdir /s /q "%FOONATHAN_MEMORY_VENDOR_SOURCE_DIR%"
echo Build fast cdr
SET FAST_CDR_BASENAME=fast-cdr
SET FAST_CDR_SOURCE_DIR=%CD%\%FAST_CDR_BASENAME%-source
SET FAST_CDR_REPO="https://github.com/eProsima/Fast-CDR.git"
CALL :build_fastdds_extension "%FAST_CDR_SOURCE_DIR%" "%FAST_CDR_REPO%"
pushd "%FAST_CDR_SOURCE_DIR%\build" >nul
cmake -G "Ninja" ^
-DCMAKE_INSTALL_PREFIX="%FASTDDS_INSTALL_DIR%" ^
-DCMAKE_CXX_FLAGS_RELEASE="-D_GLIBCXX_USE_CXX11_ABI=0" ^
..
ninja
ninja install
popd >nul
rmdir /s /q "%FAST_CDR_SOURCE_DIR%"
echo Build fast dds
SET FAST_DDS_LIB_BASENAME=fast-dds-lib
SET FAST_DDS_LIB_SOURCE_DIR=%CD%\%FAST_DDS_LIB_BASENAME%-source
SET FAST_DDS_LIB_REPO="https://github.com/eProsima/Fast-DDS.git"
CALL :build_fastdds_extension "%FAST_DDS_LIB_SOURCE_DIR%" "%FAST_DDS_LIB_REPO%"
pushd "%FAST_DDS_LIB_SOURCE_DIR%\build" >nul
cmake -G "Ninja" ^
-DCMAKE_INSTALL_PREFIX="%FASTDDS_INSTALL_DIR%" ^
-DCMAKE_CXX_FLAGS=-latomic ^
-DCMAKE_CXX_FLAGS_RELEASE="-D_GLIBCXX_USE_CXX11_ABI=0" ^
..
ninja
ninja install
popd >nul
rmdir /
)
)
rem ============================================================================
rem -- Assets download URL -----------------------------------------------------
rem ============================================================================
@ -384,7 +315,7 @@ set CMAKE_CONFIG_FILE=%INSTALLATION_DIR%CMakeLists.txt.in
>"%CMAKE_CONFIG_FILE%" echo # Automatically generated by Setup.bat
>>"%CMAKE_CONFIG_FILE%" echo set(CARLA_VERSION %carla_version%)
>>"%CMAKE_CONFIG_FILE%" echo.
>>"%CMAKE_CONFIG_FILE%" echo set(CMAKE_CXX_STANDARD 14)
>>"%CMAKE_CONFIG_FILE%" echo set(CMAKE_CXX_STANDARD 20)
>>"%CMAKE_CONFIG_FILE%" echo set(CMAKE_CXX_STANDARD_REQUIRED ON)
>>"%CMAKE_CONFIG_FILE%" echo.
>>"%CMAKE_CONFIG_FILE%" echo add_definitions(-D_WIN32_WINNT=0x0600)
@ -400,6 +331,11 @@ set CMAKE_CONFIG_FILE=%INSTALLATION_DIR%CMakeLists.txt.in
>>"%CMAKE_CONFIG_FILE%" echo set(RPCLIB_INCLUDE_PATH "%CMAKE_INSTALLATION_DIR%rpclib-install/include")
>>"%CMAKE_CONFIG_FILE%" echo set(RPCLIB_LIB_PATH "%CMAKE_INSTALLATION_DIR%rpclib-install/lib")
>>"%CMAKE_CONFIG_FILE%" echo.
>>"%CMAKE_CONFIG_FILE%" echo set(ROS2_MW_INCLUDE_PATH "%CMAKE_INSTALLATION_DIR%fastDDS-install/include")
>>"%CMAKE_CONFIG_FILE%" echo set(ROS2_MW_LIB_PATH "%CMAKE_INSTALLATION_DIR%fastDDS-install/lib")
>>"%CMAKE_CONFIG_FILE%" echo set(ROS2_MW_LINK_LIBRARIES "fastrtps;fastcdr")
>>"%CMAKE_CONFIG_FILE%" echo set(ROS2_MW_NAME "fastdds")
>>"%CMAKE_CONFIG_FILE%" echo.
>>"%CMAKE_CONFIG_FILE%" echo if (CMAKE_BUILD_TYPE STREQUAL "Server")
>>"%CMAKE_CONFIG_FILE%" echo # Prevent exceptions
>>"%CMAKE_CONFIG_FILE%" echo add_definitions(-DBOOST_TYPE_INDEX_FORCE_NO_RTTI_COMPATIBILITY)

File diff suppressed because it is too large Load Diff

View File

@ -16,7 +16,6 @@ CARLA_PYTHONAPI_SOURCE_FOLDER=${CARLA_PYTHONAPI_ROOT_FOLDER}/carla
LIBCARLA_ROOT_FOLDER=${CURDIR}/LibCarla
LIBCARLA_BUILD_SERVER_FOLDER=${CARLA_BUILD_FOLDER}/libcarla-server-build
LIBCARLA_BUILD_PYTORCH_FOLDER=${CARLA_BUILD_FOLDER}/libcarla-pytorch-build
LIBCARLA_FASTDDS_FOLDER=${CARLA_BUILD_FOLDER}/libcarla-fastdds-install
LIBCARLA_BUILD_CLIENT_FOLDER=${CARLA_BUILD_FOLDER}/libcarla-client-build
LIBCARLA_INSTALL_SERVER_FOLDER=${CARLAUE4_PLUGIN_ROOT_FOLDER}/CarlaDependencies
LIBCARLA_INSTALL_CLIENT_FOLDER=${CARLA_PYTHONAPI_SOURCE_FOLDER}/dependencies
@ -27,8 +26,8 @@ OSM2ODR_SOURCE_FOLDER=${CARLA_BUILD_FOLDER}/libosm2dr-source
CARLAUE4_PLUGIN_DEPS_FOLDER=${CARLAUE4_PLUGIN_ROOT_FOLDER}/CarlaDependencies
LIBSTDCPP_TOOLCHAIN_FILE=${CARLA_BUILD_FOLDER}/LibStdCppToolChain.cmake
LIBCPP_TOOLCHAIN_FILE=${CARLA_BUILD_FOLDER}/LibCppToolChain.cmake
CARLA_CLIENT_TOOLCHAIN_FILE=${CARLA_BUILD_FOLDER}/CarlaClientToolChain.cmake
CARLA_SERVER_TOOLCHAIN_FILE=${CARLA_BUILD_FOLDER}/CarlaServerToolChain.cmake
CMAKE_CONFIG_FILE=${CARLA_BUILD_FOLDER}/CMakeLists.txt.in
LIBCARLA_TEST_CONTENT_FOLDER=${CARLA_BUILD_FOLDER}/test-content

View File

@ -62,14 +62,14 @@ PythonAPI: LibCarla osm2odr
@"${CARLA_BUILD_TOOLS_FOLDER}/BuildPythonAPI.bat" --py3
server: setup
@"${CARLA_BUILD_TOOLS_FOLDER}/BuildLibCarla.bat" --server --generator "$(GENERATOR)"
@"${CARLA_BUILD_TOOLS_FOLDER}/BuildLibCarla.bat" --server --generator "$(GENERATOR)" $(ARGS)
client: setup
@"${CARLA_BUILD_TOOLS_FOLDER}/BuildLibCarla.bat" --client --generator "$(GENERATOR)"
@"${CARLA_BUILD_TOOLS_FOLDER}/BuildLibCarla.bat" --client --generator "$(GENERATOR)" $(ARGS)
.PHONY: LibCarla
LibCarla: setup
@"${CARLA_BUILD_TOOLS_FOLDER}/BuildLibCarla.bat" --server --client --generator "$(GENERATOR)"
@"${CARLA_BUILD_TOOLS_FOLDER}/BuildLibCarla.bat" --server --client --generator "$(GENERATOR)" $(ARGS)
setup: downloadplugin
@"${CARLA_BUILD_TOOLS_FOLDER}/Setup.bat" --boost-toolset msvc-14.2 --generator "$(GENERATOR)" $(ARGS)

View File

@ -1,15 +1,14 @@
#!/usr/bin/python
#
# Copyright (c) 2017-2020 Intel Corporation
# Copyright (c) 2017-2024 Intel Corporation
#
# Helper script for code formatting using clang-format-3.9 and autopep
# Helper script for code formatting using clang-format-14 and autopep
import argparse
import filecmp
import os
import re
import sets
import subprocess
import sys
from termcolor import cprint
@ -31,9 +30,10 @@ class CodeFormatter:
def verifyFormatterVersion(self):
try:
versionOutput = subprocess.check_output([self.command, "--version"]).rstrip('\r\n')
versionOutputByteString = subprocess.check_output([self.command, "--version"])
versionOutput = versionOutputByteString.decode(encoding='UTF-8')
if self.expectedVersion != "":
if versionOutput.startswith(self.expectedVersion):
if self.expectedVersion in versionOutput:
print("[OK] Found formatter '" + versionOutput + "'")
return
else:
@ -41,8 +41,9 @@ class CodeFormatter:
cprint("[NOT OK] Version string does not start with '" + self.expectedVersion + "'", "red")
else:
return
except:
except subprocess.CalledProcessError as exc:
cprint("[ERROR] Could not run " + self.command, "red")
cprint("[ERROR] '" + exc.output + "'", "red")
cprint("[INFO] Please check if correct version is installed or install with '" +
self.installCommand + "'", "blue")
sys.exit(1)
@ -70,9 +71,9 @@ class CodeFormatter:
try:
diffProcess = subprocess.Popen(
["git", "diff", "--color=always", "--exit-code", "--no-index", "--", fileName, "-"],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
diffOutput, _ = diffProcess.communicate(verifyOutput)
if diffProcess.returncode == 0:
diffOutput = ""
@ -99,6 +100,8 @@ class CodeFormatter:
if status:
return True
if not type(diffOutput) is str:
diffOutput = diffOutput.decode("utf-8")
if diffOutput != "":
cprint("[NOT OK] " + fileName, "red")
if printDiff:
@ -108,6 +111,9 @@ class CodeFormatter:
print("[OK] " + fileName)
return False
def setArgs(self, args):
self.args = args
class CodeFormatterClang(CodeFormatter):
CLANG_FORMAT_FILE = ".clang-format"
@ -116,14 +122,14 @@ class CodeFormatterClang(CodeFormatter):
def __init__(self):
CodeFormatter.__init__(self,
command="clang-format-3.9",
expectedVersion="clang-format version 3.9",
command="clang-format-14",
expectedVersion="clang-format version 14",
formatCommandArguments=["-style=file", "-fallback-style=none", "-i"],
verifyCommandArguments=["-style=file", "-fallback-style=none"],
verifyOutputIsDiff=False,
fileEndings=["cpp", "hpp", "c", "h", "cc"],
fileDescription="source and header",
installCommand="sudo apt-get install clang-format-3.9")
installCommand="sudo apt-get install clang-format-14")
self.scriptPath = os.path.dirname(os.path.abspath(__file__))
self.checkedInClangFormatFile = os.path.join(self.scriptPath, CodeFormatterClang.CHECKED_IN_CLANG_FORMAT_FILE)
@ -142,13 +148,13 @@ class CodeFormatterClang(CodeFormatter):
def confirmWithUserClangFormatFileCantBeVerified(self):
if not self.args.yes:
answer = raw_input("Are you sure your .clang-format file is up-to-date and you want to continue? (y/N)")
answer = input("Are you sure your .clang-format file is up-to-date and you want to continue? (y/N)")
if answer != "y":
sys.exit(1)
def verifyClangFormatFileExistsAndMatchesCheckedIn(self):
self.verifyCheckedInClangFormatFileExists()
foundClangFormatFiles = sets.Set()
foundClangFormatFiles = set()
for fileName in self.inputFiles:
dirName = os.path.dirname(os.path.abspath(fileName))
if not self.findClangFormatFileStartingFrom(dirName, fileName, foundClangFormatFiles):
@ -219,6 +225,7 @@ class CodeFormat:
def addCodeFormatter(self, codeFormatterInstance):
self.codeFormatterInstances.append(codeFormatterInstance)
codeFormatterInstance.setArgs(self.args)
def scanForInputFiles(self):
for formatterInstance in self.codeFormatterInstances:
@ -263,26 +270,26 @@ class CodeFormat:
def confirmWithUserFileIsOutsideGit(self, fileName):
cprint("[WARN] File is not in a Git repo: " + fileName, "yellow")
answer = raw_input("Are you sure to code format it anyway? (y/Q)")
answer = input("Are you sure to code format it anyway? (y/Q)")
if answer != "y":
sys.exit(1)
def confirmWithUserFileIsUntracked(self, fileName):
cprint("[WARN] File is untracked in Git: " + fileName, "yellow")
answer = raw_input("Are you sure to code format it anyway? (y/Q)")
answer = input("Are you sure to code format it anyway? (y/Q)")
if answer != "y":
sys.exit(1)
def confirmWithUserGitRepoIsNotClean(self, gitRepo):
cprint("[WARN] Git repo is not clean: " + gitRepo, "yellow")
answer = raw_input("Are you sure to code format files in it anyway? (y/Q)")
answer = input("Are you sure to code format files in it anyway? (y/Q)")
if answer != "y":
sys.exit(1)
def checkInputFilesAreInCleanGitReposAndAreTracked(self):
if self.args.verify or self.args.yes:
return
gitRepos = sets.Set()
gitRepos = set()
for formatterInstance in self.codeFormatterInstances:
for fileName in formatterInstance.inputFiles:
gitRepo = self.getGitRepoForFile(fileName)
@ -308,7 +315,7 @@ class CodeFormat:
cwd=os.path.dirname(fileName))
gitOutput, _ = gitProcess.communicate()
if gitProcess.returncode == 0:
return gitOutput.rstrip('\r\n')
return gitOutput.decode(encoding='UTF-8').rstrip('\r\n')
except OSError:
cprint("[ERROR] Failed to run 'git rev-parse --show-toplevel' for " + fileName, "red")
return None
@ -322,7 +329,7 @@ class CodeFormat:
cwd=os.path.dirname(fileName))
gitOutput, _ = gitProcess.communicate()
if gitProcess.returncode == 0:
return gitOutput.rstrip('\r\n') == "true"
return gitOutput.decode(encoding='UTF-8').rstrip('\r\n') == "true"
except OSError:
cprint("[ERROR] Failed to run 'git rev-parse --is-inside-work-tree' for " + fileName, "red")
return False
@ -400,13 +407,19 @@ class CodeFormat:
elif (not self.args.verify) and (not self.args.yes) and self.numberOfInputFiles() > 1:
for formatterInstance in self.codeFormatterInstances:
formatterInstance.printInputFiles()
answer = raw_input("Are you sure to code format " + str(self.numberOfInputFiles()) + " files? (y/N)")
answer = input("Are you sure to code format " + str(self.numberOfInputFiles()) + " files? (y/N)")
if answer != "y":
sys.exit(1)
def checkPythonVersion(self):
if sys.version_info.major != 3:
cprint("[ERROR] Code Formatter runs in Python3 ", "red")
sys.exit(1)
def main():
codeFormat = CodeFormat()
codeFormat.checkPythonVersion()
codeFormat.parseCommandLine()
codeFormat.printMode()
@ -425,5 +438,6 @@ def main():
cprint("SUCCESS", "green")
sys.exit(0)
if __name__ == "__main__":
main()

View File

@ -14,6 +14,7 @@ echo %FILE_N% [Batch params]: %*
rem ============================================================================
rem -- Parse arguments ---------------------------------------------------------
rem ============================================================================
set GENERATOR=""
:arg-parse
if not "%1"=="" (
@ -39,6 +40,11 @@ rem If not set set the build dir to the current dir
if "%BUILD_DIR%" == "" set BUILD_DIR=%~dp0
if not "%BUILD_DIR:~-1%"=="\" set BUILD_DIR=%BUILD_DIR%\
if %GENERATOR% == "" set GENERATOR="Visual Studio 16 2019"
echo.%GENERATOR% | findstr /C:"Visual Studio" >nul && (
set PLATFORM=-A x64
) || (
set PLATFORM=
)
rem ============================================================================
rem -- Get Eigen (Chrono dependency) -------------------------------------------
@ -101,12 +107,6 @@ if not exist %CHRONO_INSTALL_DIR% (
cd "%CHRONO_BUILD_DIR%"
echo.%GENERATOR% | findstr /C:"Visual Studio" >nul && (
set PLATFORM=-A x64
) || (
set PLATFORM=
)
echo %FILE_N% Compiling Chrono.
cmake -G %GENERATOR% %PLATFORM%^
-DCMAKE_BUILD_TYPE=Release^

View File

@ -74,8 +74,18 @@ if not exist "%EIGEN_INSTALL_DIR%" (
xcopy /q /Y /S /I /d "%EIGEN_SRC_DIR%\Eigen" "%EIGEN_INCLUDE%\Eigen"
xcopy /q /Y /S /I /d "%EIGEN_SRC_DIR%\unsupported\Eigen" "%EIGEN_INCLUDE%\unsupported\Eigen"
copy "%BUILD_DIR%..\Util\Patches\Eigen3.1.0\Macros.h" "%EIGEN_INCLUDE%\Eigen\src\Core\util\Macros.h"
copy "%BUILD_DIR%..\Util\Patches\Eigen3.1.0\Functors.h" "%EIGEN_INCLUDE%\Eigen\src\Core\Functors.h"
copy "%BUILD_DIR%..\Util\Patches\Eigen3.1.0\VectorBlock.h" "%EIGEN_INCLUDE%\Eigen\src\Core\VectorBlock.h"
copy "%BUILD_DIR%..\Util\Patches\Eigen3.1.0\PacketMath.h" "%EIGEN_INCLUDE%\Eigen\src\Core\arch\SSE\PacketMath.h"
copy "%BUILD_DIR%..\Util\Patches\Eigen3.1.0\SelfadjointMatrixVector.h" "%EIGEN_INCLUDE%\Eigen\src\Core\products\SelfadjointMatrixVector.h"
copy "%BUILD_DIR%..\Util\Patches\Eigen3.1.0\Macros.h" "%EIGEN_INCLUDE%\Eigen\src\Core\util\Macros.h"
copy "%BUILD_DIR%..\Util\Patches\Eigen3.1.0\ArrayCwiseUnaryOps.h" "%EIGEN_INCLUDE%\Eigen\src\plugins\ArrayCwiseUnaryOps.h"
copy "%BUILD_DIR%..\Util\Patches\Eigen3.1.0\MatrixCwiseUnaryOps.h" "%EIGEN_INCLUDE%\Eigen\src\plugins\MatrixCwiseUnaryOps.h"
cp $CARLA_ROOT_FOLDER/Util/Patches/Eigen${EIGEN_VERSION}/Macros.h "${EIGEN_BASENAME}-source/Eigen/src/Core/util/Macros.h"
cp $CARLA_ROOT_FOLDER/Util/Patches/Eigen${EIGEN_VERSION}/ArrayCwiseUnaryOps.h "${EIGEN_BASENAME}-source/Eigen/src/plugins/ArrayCwiseUnaryOps.h"
cp $CARLA_ROOT_FOLDER/Util/Patches/Eigen${EIGEN_VERSION}/MatrixCwiseUnaryOps.h "${EIGEN_BASENAME}-source/Eigen/src/plugins/MatrixCwiseUnaryOps.h"
goto success

View File

@ -14,7 +14,11 @@ rem ============================================================================
rem -- Parse arguments ---------------------------------------------------------
rem ============================================================================
set DEL_SRC=false
set BOOST_VERSION="unknown"
set FASTDDS_INSTALL_DIR=""
set GENERATOR=""
:arg-parse
if not "%1"=="" (
@ -27,20 +31,48 @@ if not "%1"=="" (
set DEL_SRC=true
)
if "%1"=="--boost-version" (
set BOOST_VERSION=%2
shift
)
if "%1"=="--install-dir" (
set FASTDDS_INSTALL_DIR=%2
shift
)
if "%1"=="--generator" (
set GENERATOR=%2
shift
)
shift
goto :arg-parse
)
if %GENERATOR% == "" set GENERATOR="Visual Studio 16 2019"
echo.%GENERATOR% | findstr /C:"Visual Studio" >nul && (
set PLATFORM=-A x64
) || (
set PLATFORM=
)
echo "%GENERATOR%" "%PLATFORM%"
rem If not set set the build dir to the current dir
if "%BUILD_DIR%" == "" set BUILD_DIR=%~dp0
if not "%BUILD_DIR:~-1%"=="\" set BUILD_DIR=%BUILD_DIR%\
set FASTDDS_SRC=fastDDS-src
set FASTDDS_SRC_DIR=%BUILD_DIR%%FASTDDS_SRC%\
set FASTDDS_INSTALL=fastDDS-install
set FASTDDS_INSTALL_DIR=%BUILD_DIR%%FASTDDS_INSTALL%\
set FASTDDS_BUILD_DIR=%FASTDDS_SRC_DIR%build\
if "%FASTDDS_INSTALL_DIR%" == "" (
set FASTDDS_INSTALL=fastDDS-install
set FASTDDS_INSTALL_DIR=%BUILD_DIR%%FASTDDS_INSTALL%\
)
set FASTDDS_BUILD_DIR=%FASTDDS_SRC_DIR%build\fastdds
set FASTDDS_BASENAME=%FASTDDS_SRC%
set FOONATHAN_MEMORY_VENDOR_BASENAME=foonathan-memory-vendor
set FOONATHAN_MEMORY_VENDOR_SOURCE_DIR=%FASTDDS_SRC_DIR%\thirdparty\foonathan-memory-vendor
set FOONATHAN_MEMORY_VENDOR_BUILD_DIR=%FASTDDS_SRC_DIR%build\foonathan-memory-vendor
if exist "%FASTDDS_INSTALL_DIR%" (
goto already_build
@ -49,86 +81,86 @@ if exist "%FASTDDS_INSTALL_DIR%" (
if not exist "%FASTDDS_SRC_DIR%" (
echo %FILE_N% Cloning "Fast-DDS"
call git clone https://github.com/eProsima/Fast-DDS.git "%FASTDDS_SRC_DIR:~0,-1%"
call git submodule init
call git submodule update
git clone --depth 1 --branch 2.11.3 https://github.com/eProsima/Fast-DDS.git "%FASTDDS_SRC_DIR:~0,-1%"
if %errorlevel% neq 0 goto error_git
git submodule init
if %errorlevel% neq 0 goto error_git
git submodule update
if %errorlevel% neq 0 goto error_git
git clone --depth 1 --branch master https://github.com/eProsima/foonathan_memory_vendor.git "%FOONATHAN_MEMORY_VENDOR_SOURCE_DIR%"
) else (
echo %FILE_N% Not cloning "Fast-DDS" because already exists a folder called "%FASTDDS_SRC%".
)
echo Compiling fastCDR dependency...
if not exist "%FASTDDS_SRC_DIR%/thirdparty/fastcdr/build" (
echo %FILE_N% Creating "%FASTDDS_SRC_DIR%/thirdparty/fastcdr/build"
cd "%FASTDDS_SRC_DIR%/thirdparty/fastcdr"
mkdir build
cd ../../
if not exist "%FOONATHAN_MEMORY_VENDOR_BUILD_DIR%" (
echo %FILE_N% Creating "%FOONATHAN_MEMORY_VENDOR_BUILD_DIR%"
mkdir "%FOONATHAN_MEMORY_VENDOR_BUILD_DIR%"
)
cd "%FOONATHAN_MEMORY_VENDOR_BUILD_DIR%"
cd "%FASTDDS_SRC_DIR%/thirdparty/fastcdr/build"
echo %FILE_N% Generating build...
cmake .. -G "Visual Studio 16 2019" -A x64^
echo %FILE_N% Generating build: foonathan memory vendor ...
cmake -G %GENERATOR% %PLATFORM%^
-DCMAKE_BUILD_TYPE=Release^
-DCMAKE_CXX_FLAGS_RELEASE="/MD /MP"^
-DCMAKE_INSTALL_PREFIX="%FASTDDS_INSTALL_DIR:\=/%"^
-DCMAKE_CXX_FLAGS=/D_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING
-DBUILD_STATIC_LIBS=ON^
-DBUILD_SHARED_LIBS=OFF^
-DCMAKE_CXX_FLAGS="/DBOOST_NO_EXCEPTIONS /DASIO_NO_EXCEPTIONS"^
"%FOONATHAN_MEMORY_VENDOR_SOURCE_DIR%"
if %errorlevel% neq 0 goto error_cmake
echo %FILE_N% Building...
echo %FILE_N% Building foonathan memory vendor...
cmake --build . --config Release --target install
if errorlevel neq 0 goto error_install
if exist "%FASTDDS_SRC_DIR%\thirdparty\boost\include\boost" (
echo %FILE_N% Preparing fastdds boost ...
@REM remove their boost includes, but keep their entry point
rd /s /q "%FASTDDS_SRC_DIR%\thirdparty\boost\include\boost"
@REM ensure the find boost compiles without exceptions
sed -i s/"CXX_STANDARD 11"/"CXX_STANDARD 11\n COMPILE_DEFINITIONS \"-DBOOST_NO_EXCEPTIONS\""/ "%FASTDDS_SRC_DIR%\cmake\modules\FindThirdpartyBoost.cmake"
sed -i s/"class ThirdpartyBoostCompileTest"/"#ifdef BOOST_NO_EXCEPTIONS\nnamespace boost {void throw_exception(std::exception const \& e) {}}\n#endif\nclass ThirdpartyBoostCompileTest"/ "%FASTDDS_SRC_DIR%\thirdparty\boost\test\ThirdpartyBoostCompile_test.cpp"
)
cd ../../..
@REM echo Compiling asio dependency...
@REM if not exist "%FASTDDS_SRC_DIR%/thirdparty/asio/asio/build" (
@REM echo %FILE_N% Creating "%FASTDDS_SRC_DIR%/thirdparty/asio/asio/build"
@REM cd "%FASTDDS_SRC_DIR%/thirdparty/asio/asio"
@REM mkdir build
@REM cd ../../
@REM )
@REM cd "%FASTDDS_SRC_DIR%/thirdparty/asio/asio/build"
@REM echo %FILE_N% Generating build...
@REM cmake .. -G "Visual Studio 16 2019" -A x64^
@REM -DCMAKE_BUILD_TYPE=Release^
@REM -DCMAKE_CXX_FLAGS_RELEASE="/MD /MP"^
@REM -DCMAKE_INSTALL_PREFIX="%FASTDDS_INSTALL_DIR:\=/%"^
@REM -DCMAKE_CXX_FLAGS=/D_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING
@REM if %errorlevel% neq 0 goto error_cmake
@REM echo %FILE_N% Building...
@REM cmake --build . --config Release --target install
@REM if errorlevel neq 0 goto error_install
@REM cd ../../../..
if exist "%FASTDDS_SRC_DIR%\src\cpp\utils\StringMatching.cpp" (
echo %FILE_N% Patching fastdds ...
sed -i s/"defined(__cplusplus_winrt)"/"(1)"/ "%FASTDDS_SRC_DIR%\src\cpp\utils\StringMatching.cpp"
sed -i s/"replace_all(pattern"/"replace_all(path"/ "%FASTDDS_SRC_DIR%\src\cpp\utils\StringMatching.cpp"
)
if not exist "%FASTDDS_BUILD_DIR%" (
echo %FILE_N% Creating "%FASTDDS_BUILD_DIR%"
mkdir "%FASTDDS_BUILD_DIR%"
)
cd "%FASTDDS_BUILD_DIR%"
echo %FILE_N% Generating build...
echo %FILE_N% Generating build: fastdds ...
cmake .. -G "Visual Studio 16 2019" -A x64^
cmake -G %GENERATOR% %PLATFORM%^
-DCMAKE_BUILD_TYPE=Release^
-DCMAKE_CXX_FLAGS_RELEASE="/MD /MP"^
-DCMAKE_INSTALL_PREFIX="%FASTDDS_INSTALL_DIR:\=/%"^
-DCMAKE_CXX_FLAGS=/D_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING^
-DCMAKE_MODULE_PATH="%FASTDDS_INSTALL_DIR:\=/%"^
-DBUILD_STATIC_LIBS=ON^
-DBUILD_SHARED_LIBS=OFF^
-DBUILD_TESTING=OFF^
-DCOMPILE_EXAMPLES=OFF^
-DCOMPILE_TOOLS=OFF^
-DTHIRDPARTY_Asio=FORCE^
-DTHIRDPARTY_fastcdr=FORCE^
-DTHIRDPARTY_TinyXML2=FORCE^
-DTHIRDPARTY_BOOST_INCLUDE_DIR="%BUILD_DIR%boost-%BOOST_VERSION%-install\include;%FASTDDS_SRC_DIR%\thirdparty\boost\include"^
-DCMAKE_CXX_FLAGS="/D_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING /DBOOST_NO_EXCEPTIONS /DASIO_NO_EXCEPTIONS"^
"%FASTDDS_SRC_DIR%"
if %errorlevel% neq 0 goto error_cmake
echo %FILE_N% Building...
echo %FILE_N% Building fastdds...
cmake --build . --config Release --target install
if errorlevel neq 0 goto error_install
if %errorlevel% neq 0 goto error_install
rem copy asio header files as they are not copied automatically by the above build, but we need those for handling the asio-exceptions
copy %FASTDDS_SRC_DIR%thirdparty\asio\asio\include\asio.hpp %INSTALLATION_DIR%fastDDS-install\include\ > NUL
xcopy /Y /S /I %FASTDDS_SRC_DIR%thirdparty\asio\asio\include\asio\* %INSTALLATION_DIR%fastDDS-install\include\asio\* > NUL
if %errorlevel% neq 0 goto error_install
rem Remove the downloaded Fast-DDS source because is no more needed
if %DEL_SRC% == true (
@ -179,7 +211,7 @@ rem ============================================================================
:good_exit
echo %FILE_N% Exiting...
endlocal & set install_recast=%FASTDDS_INSTALL_DIR%
endlocal & set install_dds=%FASTDDS_INSTALL_DIR%
exit /b 0
:bad_exit

View File

@ -16,6 +16,7 @@ rem -- Parse arguments ---------------------------------------------------------
rem ============================================================================
set DEL_SRC=false
set GENERATOR=""
:arg-parse
if not "%1"=="" (
@ -36,6 +37,11 @@ if not "%1"=="" (
)
if %GENERATOR% == "" set GENERATOR="Visual Studio 16 2019"
echo.%GENERATOR% | findstr /C:"Visual Studio" >nul && (
set PLATFORM=-A x64
) || (
set PLATFORM=
)
rem If not set set the build dir to the current dir
if "%BUILD_DIR%" == "" set BUILD_DIR=%~dp0
@ -69,12 +75,6 @@ if not exist "%GT_BUILD_DIR%" (
cd "%GT_BUILD_DIR%"
echo %FILE_N% Generating build...
echo.%GENERATOR% | findstr /C:"Visual Studio" >nul && (
set PLATFORM=-A x64
) || (
set PLATFORM=
)
cmake .. -G %GENERATOR% %PLATFORM%^
-DCMAKE_BUILD_TYPE=Release^
-DCMAKE_CXX_FLAGS_RELEASE="/MD /MP"^

View File

@ -15,6 +15,8 @@ rem ============================================================================
rem -- Parse arguments ---------------------------------------------------------
rem ============================================================================
set GENERATOR=""
:arg-parse
if not "%1"=="" (
if "%1"=="--build-dir" (
@ -36,6 +38,11 @@ if not "%1"=="" (
)
if %GENERATOR% == "" set GENERATOR="Visual Studio 16 2019"
echo.%GENERATOR% | findstr /C:"Visual Studio" >nul && (
set PLATFORM=-A x64
) || (
set PLATFORM=
)
rem If not set set the build dir to the current dir
if "%BUILD_DIR%" == "" set BUILD_DIR=%~dp0
@ -79,12 +86,6 @@ move %BUILD_DIR%%PROJ_BASE_NAME% %PROJ_SRC_DIR%
mkdir %PROJ_BUILD_DIR%
cd %PROJ_BUILD_DIR%
echo.%GENERATOR% | findstr /C:"Visual Studio" >nul && (
set PLATFORM=-A x64
) || (
set PLATFORM=
)
cmake .. -G %GENERATOR% %PLATFORM%^
-DCMAKE_CXX_FLAGS_RELEASE="/MD /MP"^
-DCMAKE_CXX_FLAGS="/MD /MP"^

View File

@ -15,6 +15,7 @@ rem -- Parse arguments ---------------------------------------------------------
rem ============================================================================
set DEL_SRC=false
set GENERATOR=""
:arg-parse
if not "%1"=="" (
@ -35,6 +36,11 @@ if not "%1"=="" (
)
if %GENERATOR% == "" set GENERATOR="Visual Studio 16 2019"
echo.%GENERATOR% | findstr /C:"Visual Studio" >nul && (
set PLATFORM=-A x64
) || (
set PLATFORM=
)
rem If not set set the build dir to the current dir
if "%BUILD_DIR%" == "" set BUILD_DIR=%~dp0
@ -71,12 +77,6 @@ if not exist "%RECAST_BUILD_DIR%" (
cd "%RECAST_BUILD_DIR%"
echo %FILE_N% Generating build...
echo.%GENERATOR% | findstr /C:"Visual Studio" >nul && (
set PLATFORM=-A x64
) || (
set PLATFORM=
)
cmake .. -G %GENERATOR% %PLATFORM%^
-DCMAKE_BUILD_TYPE=Release^
-DCMAKE_CXX_FLAGS_RELEASE="/MD /MP"^

View File

@ -16,6 +16,7 @@ rem -- Parse arguments ---------------------------------------------------------
rem ============================================================================
set DEL_SRC=false
set GENERATOR=""
:arg-parse
if not "%1"=="" (

View File

@ -14,6 +14,7 @@ echo %FILE_N% [Batch params]: %*
rem ============================================================================
rem -- Parse arguments ---------------------------------------------------------
rem ============================================================================
set GENERATOR=""
:arg-parse
if not "%1"=="" (
@ -36,6 +37,11 @@ if not "%1"=="" (
)
if %GENERATOR% == "" set GENERATOR="Visual Studio 16 2019"
echo.%GENERATOR% | findstr /C:"Visual Studio" >nul && (
set PLATFORM=-A x64
) || (
set PLATFORM=
)
rem If not set set the build dir to the current dir
if "%BUILD_DIR%" == "" set BUILD_DIR=%~dp0
@ -121,12 +127,6 @@ if not exist "%XERCESC_INSTALL_DIR%include" (
mkdir "%XERCESC_INSTALL_DIR%include"
)
echo.%GENERATOR% | findstr /C:"Visual Studio" >nul && (
set PLATFORM=-A x64
) || (
set PLATFORM=
)
cmake .. -G %GENERATOR% %PLATFORM%^
-DCMAKE_INSTALL_PREFIX="%XERCESC_INSTALL_DIR:\=/%"^
-DBUILD_SHARED_LIBS=OFF^

View File

@ -0,0 +1,205 @@
/** \returns an expression of the coefficient-wise absolute value of \c *this
*
* Example: \include Cwise_abs.cpp
* Output: \verbinclude Cwise_abs.out
*
* \sa abs2()
*/
EIGEN_STRONG_INLINE const CwiseUnaryOp<internal::scalar_abs_op<Scalar>, const Derived>
abs() const
{
return derived();
}
/** \returns an expression of the coefficient-wise squared absolute value of \c *this
*
* Example: \include Cwise_abs2.cpp
* Output: \verbinclude Cwise_abs2.out
*
* \sa abs(), square()
*/
EIGEN_STRONG_INLINE const CwiseUnaryOp<internal::scalar_abs2_op<Scalar>, const Derived>
abs2() const
{
return derived();
}
/** \returns an expression of the coefficient-wise exponential of *this.
*
* Example: \include Cwise_exp.cpp
* Output: \verbinclude Cwise_exp.out
*
* \sa pow(), log(), sin(), cos()
*/
inline const CwiseUnaryOp<internal::scalar_exp_op<Scalar>, const Derived>
exp() const
{
return derived();
}
/** \returns an expression of the coefficient-wise logarithm of *this.
*
* Example: \include Cwise_log.cpp
* Output: \verbinclude Cwise_log.out
*
* \sa exp()
*/
inline const CwiseUnaryOp<internal::scalar_log_op<Scalar>, const Derived>
log() const
{
return derived();
}
/** \returns an expression of the coefficient-wise square root of *this.
*
* Example: \include Cwise_sqrt.cpp
* Output: \verbinclude Cwise_sqrt.out
*
* \sa pow(), square()
*/
inline const CwiseUnaryOp<internal::scalar_sqrt_op<Scalar>, const Derived>
sqrt() const
{
return derived();
}
/** \returns an expression of the coefficient-wise cosine of *this.
*
* Example: \include Cwise_cos.cpp
* Output: \verbinclude Cwise_cos.out
*
* \sa sin(), acos()
*/
inline const CwiseUnaryOp<internal::scalar_cos_op<Scalar>, const Derived>
cos() const
{
return derived();
}
/** \returns an expression of the coefficient-wise sine of *this.
*
* Example: \include Cwise_sin.cpp
* Output: \verbinclude Cwise_sin.out
*
* \sa cos(), asin()
*/
inline const CwiseUnaryOp<internal::scalar_sin_op<Scalar>, const Derived>
sin() const
{
return derived();
}
/** \returns an expression of the coefficient-wise arc cosine of *this.
*
* Example: \include Cwise_acos.cpp
* Output: \verbinclude Cwise_acos.out
*
* \sa cos(), asin()
*/
inline const CwiseUnaryOp<internal::scalar_acos_op<Scalar>, const Derived>
acos() const
{
return derived();
}
/** \returns an expression of the coefficient-wise arc sine of *this.
*
* Example: \include Cwise_asin.cpp
* Output: \verbinclude Cwise_asin.out
*
* \sa sin(), acos()
*/
inline const CwiseUnaryOp<internal::scalar_asin_op<Scalar>, const Derived>
asin() const
{
return derived();
}
/** \returns an expression of the coefficient-wise tan of *this.
*
* Example: \include Cwise_tan.cpp
* Output: \verbinclude Cwise_tan.out
*
* \sa cos(), sin()
*/
inline const CwiseUnaryOp<internal::scalar_tan_op<Scalar>, Derived>
tan() const
{
return derived();
}
/** \returns an expression of the coefficient-wise power of *this to the given exponent.
*
* Example: \include Cwise_pow.cpp
* Output: \verbinclude Cwise_pow.out
*
* \sa exp(), log()
*/
inline const CwiseUnaryOp<internal::scalar_pow_op<Scalar>, const Derived>
pow(const Scalar& exponent) const
{
return CwiseUnaryOp<internal::scalar_pow_op<Scalar>, const Derived>
(derived(), internal::scalar_pow_op<Scalar>(exponent));
}
/** \returns an expression of the coefficient-wise inverse of *this.
*
* Example: \include Cwise_inverse.cpp
* Output: \verbinclude Cwise_inverse.out
*
* \sa operator/(), operator*()
*/
inline const CwiseUnaryOp<internal::scalar_inverse_op<Scalar>, const Derived>
inverse() const
{
return derived();
}
/** \returns an expression of the coefficient-wise square of *this.
*
* Example: \include Cwise_square.cpp
* Output: \verbinclude Cwise_square.out
*
* \sa operator/(), operator*(), abs2()
*/
inline const CwiseUnaryOp<internal::scalar_square_op<Scalar>, const Derived>
square() const
{
return derived();
}
/** \returns an expression of the coefficient-wise cube of *this.
*
* Example: \include Cwise_cube.cpp
* Output: \verbinclude Cwise_cube.out
*
* \sa square(), pow()
*/
inline const CwiseUnaryOp<internal::scalar_cube_op<Scalar>, const Derived>
cube() const
{
return derived();
}
#if __cplusplus < 201703L
#define EIGEN_MAKE_SCALAR_CWISE_UNARY_OP(METHOD_NAME,FUNCTOR) \
inline const CwiseUnaryOp<std::binder2nd<FUNCTOR<Scalar> >, const Derived> \
METHOD_NAME(const Scalar& s) const { \
return CwiseUnaryOp<std::binder2nd<FUNCTOR<Scalar> >, const Derived> \
(derived(), std::bind2nd(FUNCTOR<Scalar>(), s)); \
}
EIGEN_MAKE_SCALAR_CWISE_UNARY_OP(operator==, std::equal_to)
EIGEN_MAKE_SCALAR_CWISE_UNARY_OP(operator!=, std::not_equal_to)
EIGEN_MAKE_SCALAR_CWISE_UNARY_OP(operator<, std::less)
EIGEN_MAKE_SCALAR_CWISE_UNARY_OP(operator<=, std::less_equal)
EIGEN_MAKE_SCALAR_CWISE_UNARY_OP(operator>, std::greater)
EIGEN_MAKE_SCALAR_CWISE_UNARY_OP(operator>=, std::greater_equal)
#endif

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,85 @@
// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>
// Copyright (C) 2006-2008 Benoit Jacob <jacob.benoit.1@gmail.com>
//
// Eigen is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 3 of the License, or (at your option) any later version.
//
// Alternatively, you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
// published by the Free Software Foundation; either version 2 of
// the License, or (at your option) any later version.
//
// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License and a copy of the GNU General Public License along with
// Eigen. If not, see <http://www.gnu.org/licenses/>.
// This file is a base class plugin containing matrix specifics coefficient wise functions.
/** \returns an expression of the coefficient-wise absolute value of \c *this
*
* Example: \include MatrixBase_cwiseAbs.cpp
* Output: \verbinclude MatrixBase_cwiseAbs.out
*
* \sa cwiseAbs2()
*/
EIGEN_STRONG_INLINE const CwiseUnaryOp<internal::scalar_abs_op<Scalar>, const Derived>
cwiseAbs() const { return derived(); }
/** \returns an expression of the coefficient-wise squared absolute value of \c *this
*
* Example: \include MatrixBase_cwiseAbs2.cpp
* Output: \verbinclude MatrixBase_cwiseAbs2.out
*
* \sa cwiseAbs()
*/
EIGEN_STRONG_INLINE const CwiseUnaryOp<internal::scalar_abs2_op<Scalar>, const Derived>
cwiseAbs2() const { return derived(); }
/** \returns an expression of the coefficient-wise square root of *this.
*
* Example: \include MatrixBase_cwiseSqrt.cpp
* Output: \verbinclude MatrixBase_cwiseSqrt.out
*
* \sa cwisePow(), cwiseSquare()
*/
inline const CwiseUnaryOp<internal::scalar_sqrt_op<Scalar>, const Derived>
cwiseSqrt() const { return derived(); }
/** \returns an expression of the coefficient-wise inverse of *this.
*
* Example: \include MatrixBase_cwiseInverse.cpp
* Output: \verbinclude MatrixBase_cwiseInverse.out
*
* \sa cwiseProduct()
*/
inline const CwiseUnaryOp<internal::scalar_inverse_op<Scalar>, const Derived>
cwiseInverse() const { return derived(); }
#if __cplusplus < 201703L
/** \returns an expression of the coefficient-wise == operator of \c *this and a scalar \a s
*
* \warning this performs an exact comparison, which is generally a bad idea with floating-point types.
* In order to check for equality between two vectors or matrices with floating-point coefficients, it is
* generally a far better idea to use a fuzzy comparison as provided by isApprox() and
* isMuchSmallerThan().
*
* \sa cwiseEqual(const MatrixBase<OtherDerived> &) const
*/
inline const CwiseUnaryOp<std::binder1st<std::equal_to<Scalar> >, const Derived>
cwiseEqual(const Scalar& s) const
{
return CwiseUnaryOp<std::binder1st<std::equal_to<Scalar> >,const Derived>
(derived(), std::bind1st(std::equal_to<Scalar>(), s));
}
#endif

View File

@ -0,0 +1,647 @@
// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>
//
// Eigen is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 3 of the License, or (at your option) any later version.
//
// Alternatively, you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
// published by the Free Software Foundation; either version 2 of
// the License, or (at your option) any later version.
//
// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License and a copy of the GNU General Public License along with
// Eigen. If not, see <http://www.gnu.org/licenses/>.
#ifndef EIGEN_PACKET_MATH_SSE_H
#define EIGEN_PACKET_MATH_SSE_H
namespace Eigen {
namespace internal {
#ifndef EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD
#define EIGEN_CACHEFRIENDLY_PRODUCT_THRESHOLD 8
#endif
#ifndef EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS
#define EIGEN_ARCH_DEFAULT_NUMBER_OF_REGISTERS (2*sizeof(void*))
#endif
typedef __m128 Packet4f;
typedef __m128i Packet4i;
typedef __m128d Packet2d;
template<> struct is_arithmetic<__m128> { enum { value = true }; };
template<> struct is_arithmetic<__m128i> { enum { value = true }; };
template<> struct is_arithmetic<__m128d> { enum { value = true }; };
#define vec4f_swizzle1(v,p,q,r,s) \
(_mm_castsi128_ps(_mm_shuffle_epi32( _mm_castps_si128(v), ((s)<<6|(r)<<4|(q)<<2|(p)))))
#define vec4i_swizzle1(v,p,q,r,s) \
(_mm_shuffle_epi32( v, ((s)<<6|(r)<<4|(q)<<2|(p))))
#define vec2d_swizzle1(v,p,q) \
(_mm_castsi128_pd(_mm_shuffle_epi32( _mm_castpd_si128(v), ((q*2+1)<<6|(q*2)<<4|(p*2+1)<<2|(p*2)))))
#define vec4f_swizzle2(a,b,p,q,r,s) \
(_mm_shuffle_ps( (a), (b), ((s)<<6|(r)<<4|(q)<<2|(p))))
#define vec4i_swizzle2(a,b,p,q,r,s) \
(_mm_castps_si128( (_mm_shuffle_ps( _mm_castsi128_ps(a), _mm_castsi128_ps(b), ((s)<<6|(r)<<4|(q)<<2|(p))))))
#define _EIGEN_DECLARE_CONST_Packet4f(NAME,X) \
const Packet4f p4f_##NAME = pset1<Packet4f>(X)
#define _EIGEN_DECLARE_CONST_Packet4f_FROM_INT(NAME,X) \
const Packet4f p4f_##NAME = _mm_castsi128_ps(pset1<Packet4i>(X))
#define _EIGEN_DECLARE_CONST_Packet4i(NAME,X) \
const Packet4i p4i_##NAME = pset1<Packet4i>(X)
template<> struct packet_traits<float> : default_packet_traits
{
typedef Packet4f type;
enum {
Vectorizable = 1,
AlignedOnScalar = 1,
size=4,
HasDiv = 1,
HasSin = EIGEN_FAST_MATH,
HasCos = EIGEN_FAST_MATH,
HasLog = 1,
HasExp = 1,
HasSqrt = 1
};
};
template<> struct packet_traits<double> : default_packet_traits
{
typedef Packet2d type;
enum {
Vectorizable = 1,
AlignedOnScalar = 1,
size=2,
HasDiv = 1
};
};
template<> struct packet_traits<int> : default_packet_traits
{
typedef Packet4i type;
enum {
// FIXME check the Has*
Vectorizable = 1,
AlignedOnScalar = 1,
size=4
};
};
template<> struct unpacket_traits<Packet4f> { typedef float type; enum {size=4}; };
template<> struct unpacket_traits<Packet2d> { typedef double type; enum {size=2}; };
template<> struct unpacket_traits<Packet4i> { typedef int type; enum {size=4}; };
#if defined(_MSC_VER) && (_MSC_VER==1500)
// Workaround MSVC 9 internal compiler error.
// TODO: It has been detected with win64 builds (amd64), so let's check whether it also happens in 32bits+SSE mode
// TODO: let's check whether there does not exist a better fix, like adding a pset0() function. (it crashed on pset1(0)).
template<> EIGEN_STRONG_INLINE Packet4f pset1<Packet4f>(const float& from) { return _mm_set_ps(from,from,from,from); }
template<> EIGEN_STRONG_INLINE Packet2d pset1<Packet2d>(const double& from) { return _mm_set_pd(from,from); }
template<> EIGEN_STRONG_INLINE Packet4i pset1<Packet4i>(const int& from) { return _mm_set_epi32(from,from,from,from); }
#else
template<> EIGEN_STRONG_INLINE Packet4f pset1<Packet4f>(const float& from) { return _mm_set1_ps(from); }
template<> EIGEN_STRONG_INLINE Packet2d pset1<Packet2d>(const double& from) { return _mm_set1_pd(from); }
template<> EIGEN_STRONG_INLINE Packet4i pset1<Packet4i>(const int& from) { return _mm_set1_epi32(from); }
#endif
template<> EIGEN_STRONG_INLINE Packet4f plset<float>(const float& a) { return _mm_add_ps(pset1<Packet4f>(a), _mm_set_ps(3,2,1,0)); }
template<> EIGEN_STRONG_INLINE Packet2d plset<double>(const double& a) { return _mm_add_pd(pset1<Packet2d>(a),_mm_set_pd(1,0)); }
template<> EIGEN_STRONG_INLINE Packet4i plset<int>(const int& a) { return _mm_add_epi32(pset1<Packet4i>(a),_mm_set_epi32(3,2,1,0)); }
template<> EIGEN_STRONG_INLINE Packet4f padd<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_add_ps(a,b); }
template<> EIGEN_STRONG_INLINE Packet2d padd<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_add_pd(a,b); }
template<> EIGEN_STRONG_INLINE Packet4i padd<Packet4i>(const Packet4i& a, const Packet4i& b) { return _mm_add_epi32(a,b); }
template<> EIGEN_STRONG_INLINE Packet4f psub<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_sub_ps(a,b); }
template<> EIGEN_STRONG_INLINE Packet2d psub<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_sub_pd(a,b); }
template<> EIGEN_STRONG_INLINE Packet4i psub<Packet4i>(const Packet4i& a, const Packet4i& b) { return _mm_sub_epi32(a,b); }
template<> EIGEN_STRONG_INLINE Packet4f pnegate(const Packet4f& a)
{
const Packet4f mask = _mm_castsi128_ps(_mm_setr_epi32(0x80000000,0x80000000,0x80000000,0x80000000));
return _mm_xor_ps(a,mask);
}
template<> EIGEN_STRONG_INLINE Packet2d pnegate(const Packet2d& a)
{
const Packet2d mask = _mm_castsi128_pd(_mm_setr_epi32(0x0,0x80000000,0x0,0x80000000));
return _mm_xor_pd(a,mask);
}
template<> EIGEN_STRONG_INLINE Packet4i pnegate(const Packet4i& a)
{
return psub(_mm_setr_epi32(0,0,0,0), a);
}
template<> EIGEN_STRONG_INLINE Packet4f pmul<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_mul_ps(a,b); }
template<> EIGEN_STRONG_INLINE Packet2d pmul<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_mul_pd(a,b); }
template<> EIGEN_STRONG_INLINE Packet4i pmul<Packet4i>(const Packet4i& a, const Packet4i& b)
{
#ifdef EIGEN_VECTORIZE_SSE4_1
return _mm_mullo_epi32(a,b);
#else
// this version is slightly faster than 4 scalar products
return vec4i_swizzle1(
vec4i_swizzle2(
_mm_mul_epu32(a,b),
_mm_mul_epu32(vec4i_swizzle1(a,1,0,3,2),
vec4i_swizzle1(b,1,0,3,2)),
0,2,0,2),
0,2,1,3);
#endif
}
template<> EIGEN_STRONG_INLINE Packet4f pdiv<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_div_ps(a,b); }
template<> EIGEN_STRONG_INLINE Packet2d pdiv<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_div_pd(a,b); }
template<> EIGEN_STRONG_INLINE Packet4i pdiv<Packet4i>(const Packet4i& /*a*/, const Packet4i& /*b*/)
{ eigen_assert(false && "packet integer division are not supported by SSE");
return pset1<Packet4i>(0);
}
// for some weird raisons, it has to be overloaded for packet of integers
template<> EIGEN_STRONG_INLINE Packet4i pmadd(const Packet4i& a, const Packet4i& b, const Packet4i& c) { return padd(pmul(a,b), c); }
template<> EIGEN_STRONG_INLINE Packet4f pmin<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_min_ps(a,b); }
template<> EIGEN_STRONG_INLINE Packet2d pmin<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_min_pd(a,b); }
template<> EIGEN_STRONG_INLINE Packet4i pmin<Packet4i>(const Packet4i& a, const Packet4i& b)
{
// after some bench, this version *is* faster than a scalar implementation
Packet4i mask = _mm_cmplt_epi32(a,b);
return _mm_or_si128(_mm_and_si128(mask,a),_mm_andnot_si128(mask,b));
}
template<> EIGEN_STRONG_INLINE Packet4f pmax<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_max_ps(a,b); }
template<> EIGEN_STRONG_INLINE Packet2d pmax<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_max_pd(a,b); }
template<> EIGEN_STRONG_INLINE Packet4i pmax<Packet4i>(const Packet4i& a, const Packet4i& b)
{
// after some bench, this version *is* faster than a scalar implementation
Packet4i mask = _mm_cmpgt_epi32(a,b);
return _mm_or_si128(_mm_and_si128(mask,a),_mm_andnot_si128(mask,b));
}
template<> EIGEN_STRONG_INLINE Packet4f pand<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_and_ps(a,b); }
template<> EIGEN_STRONG_INLINE Packet2d pand<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_and_pd(a,b); }
template<> EIGEN_STRONG_INLINE Packet4i pand<Packet4i>(const Packet4i& a, const Packet4i& b) { return _mm_and_si128(a,b); }
template<> EIGEN_STRONG_INLINE Packet4f por<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_or_ps(a,b); }
template<> EIGEN_STRONG_INLINE Packet2d por<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_or_pd(a,b); }
template<> EIGEN_STRONG_INLINE Packet4i por<Packet4i>(const Packet4i& a, const Packet4i& b) { return _mm_or_si128(a,b); }
template<> EIGEN_STRONG_INLINE Packet4f pxor<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_xor_ps(a,b); }
template<> EIGEN_STRONG_INLINE Packet2d pxor<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_xor_pd(a,b); }
template<> EIGEN_STRONG_INLINE Packet4i pxor<Packet4i>(const Packet4i& a, const Packet4i& b) { return _mm_xor_si128(a,b); }
template<> EIGEN_STRONG_INLINE Packet4f pandnot<Packet4f>(const Packet4f& a, const Packet4f& b) { return _mm_andnot_ps(a,b); }
template<> EIGEN_STRONG_INLINE Packet2d pandnot<Packet2d>(const Packet2d& a, const Packet2d& b) { return _mm_andnot_pd(a,b); }
template<> EIGEN_STRONG_INLINE Packet4i pandnot<Packet4i>(const Packet4i& a, const Packet4i& b) { return _mm_andnot_si128(a,b); }
template<> EIGEN_STRONG_INLINE Packet4f pload<Packet4f>(const float* from) { EIGEN_DEBUG_ALIGNED_LOAD return _mm_load_ps(from); }
template<> EIGEN_STRONG_INLINE Packet2d pload<Packet2d>(const double* from) { EIGEN_DEBUG_ALIGNED_LOAD return _mm_load_pd(from); }
template<> EIGEN_STRONG_INLINE Packet4i pload<Packet4i>(const int* from) { EIGEN_DEBUG_ALIGNED_LOAD return _mm_load_si128(reinterpret_cast<const Packet4i*>(from)); }
#if defined(_MSC_VER)
template<> EIGEN_STRONG_INLINE Packet4f ploadu<Packet4f>(const float* from) {
EIGEN_DEBUG_UNALIGNED_LOAD
#if (_MSC_VER==1600)
// NOTE Some version of MSVC10 generates bad code when using _mm_loadu_ps
// (i.e., it does not generate an unaligned load!!
// TODO On most architectures this version should also be faster than a single _mm_loadu_ps
// so we could also enable it for MSVC08 but first we have to make this later does not generate crap when doing so...
__m128 res = _mm_loadl_pi(_mm_set1_ps(0.0f), (const __m64*)(from));
res = _mm_loadh_pi(res, (const __m64*)(from+2));
return res;
#else
return _mm_loadu_ps(from);
#endif
}
template<> EIGEN_STRONG_INLINE Packet2d ploadu<Packet2d>(const double* from) { EIGEN_DEBUG_UNALIGNED_LOAD return _mm_loadu_pd(from); }
template<> EIGEN_STRONG_INLINE Packet4i ploadu<Packet4i>(const int* from) { EIGEN_DEBUG_UNALIGNED_LOAD return _mm_loadu_si128(reinterpret_cast<const Packet4i*>(from)); }
#else
// Fast unaligned loads. Note that here we cannot directly use intrinsics: this would
// require pointer casting to incompatible pointer types and leads to invalid code
// because of the strict aliasing rule. The "dummy" stuff are required to enforce
// a correct instruction dependency.
// TODO: do the same for MSVC (ICC is compatible)
// NOTE: with the code below, MSVC's compiler crashes!
#if defined(__GNUC__) && defined(__i386__)
// bug 195: gcc/i386 emits weird x87 fldl/fstpl instructions for _mm_load_sd
#define EIGEN_AVOID_CUSTOM_UNALIGNED_LOADS 1
#elif defined(__clang__)
// bug 201: Segfaults in __mm_loadh_pd with clang 2.8
#define EIGEN_AVOID_CUSTOM_UNALIGNED_LOADS 1
#else
#define EIGEN_AVOID_CUSTOM_UNALIGNED_LOADS 0
#endif
template<> EIGEN_STRONG_INLINE Packet4f ploadu<Packet4f>(const float* from)
{
EIGEN_DEBUG_UNALIGNED_LOAD
#if EIGEN_AVOID_CUSTOM_UNALIGNED_LOADS
return _mm_loadu_ps(from);
#else
__m128d res;
res = _mm_load_sd((const double*)(from)) ;
res = _mm_loadh_pd(res, (const double*)(from+2)) ;
return _mm_castpd_ps(res);
#endif
}
template<> EIGEN_STRONG_INLINE Packet2d ploadu<Packet2d>(const double* from)
{
EIGEN_DEBUG_UNALIGNED_LOAD
#if EIGEN_AVOID_CUSTOM_UNALIGNED_LOADS
return _mm_loadu_pd(from);
#else
__m128d res;
res = _mm_load_sd(from) ;
res = _mm_loadh_pd(res,from+1);
return res;
#endif
}
template<> EIGEN_STRONG_INLINE Packet4i ploadu<Packet4i>(const int* from)
{
EIGEN_DEBUG_UNALIGNED_LOAD
#if EIGEN_AVOID_CUSTOM_UNALIGNED_LOADS
return _mm_loadu_si128(reinterpret_cast<const Packet4i*>(from));
#else
__m128d res;
res = _mm_load_sd((const double*)(from)) ;
res = _mm_loadh_pd(res, (const double*)(from+2)) ;
return _mm_castpd_si128(res);
#endif
}
#endif
template<> EIGEN_STRONG_INLINE Packet4f ploaddup<Packet4f>(const float* from)
{
return vec4f_swizzle1(_mm_castpd_ps(_mm_load_sd(reinterpret_cast<const double*>(from))), 0, 0, 1, 1);
}
template<> EIGEN_STRONG_INLINE Packet2d ploaddup<Packet2d>(const double* from)
{ return pset1<Packet2d>(from[0]); }
template<> EIGEN_STRONG_INLINE Packet4i ploaddup<Packet4i>(const int* from)
{
Packet4i tmp;
tmp = _mm_loadl_epi64(reinterpret_cast<const Packet4i*>(from));
return vec4i_swizzle1(tmp, 0, 0, 1, 1);
}
template<> EIGEN_STRONG_INLINE void pstore<float>(float* to, const Packet4f& from) { EIGEN_DEBUG_ALIGNED_STORE _mm_store_ps(to, from); }
template<> EIGEN_STRONG_INLINE void pstore<double>(double* to, const Packet2d& from) { EIGEN_DEBUG_ALIGNED_STORE _mm_store_pd(to, from); }
template<> EIGEN_STRONG_INLINE void pstore<int>(int* to, const Packet4i& from) { EIGEN_DEBUG_ALIGNED_STORE _mm_store_si128(reinterpret_cast<Packet4i*>(to), from); }
template<> EIGEN_STRONG_INLINE void pstoreu<double>(double* to, const Packet2d& from) {
EIGEN_DEBUG_UNALIGNED_STORE
_mm_storel_pd((to), from);
_mm_storeh_pd((to+1), from);
}
template<> EIGEN_STRONG_INLINE void pstoreu<float>(float* to, const Packet4f& from) { EIGEN_DEBUG_UNALIGNED_STORE pstoreu(reinterpret_cast<double*>(to), _mm_castps_pd(from)); }
template<> EIGEN_STRONG_INLINE void pstoreu<int>(int* to, const Packet4i& from) { EIGEN_DEBUG_UNALIGNED_STORE pstoreu(reinterpret_cast<double*>(to), _mm_castsi128_pd(from)); }
// some compilers might be tempted to perform multiple moves instead of using a vector path.
template<> EIGEN_STRONG_INLINE void pstore1<Packet4f>(float* to, const float& a)
{
Packet4f pa = _mm_set_ss(a);
pstore(to, vec4f_swizzle1(pa,0,0,0,0));
}
// some compilers might be tempted to perform multiple moves instead of using a vector path.
template<> EIGEN_STRONG_INLINE void pstore1<Packet2d>(double* to, const double& a)
{
Packet2d pa = _mm_set_sd(a);
pstore(to, vec2d_swizzle1(pa,0,0));
}
template<> EIGEN_STRONG_INLINE void prefetch<float>(const float* addr) { _mm_prefetch((const char*)(addr), _MM_HINT_T0); }
template<> EIGEN_STRONG_INLINE void prefetch<double>(const double* addr) { _mm_prefetch((const char*)(addr), _MM_HINT_T0); }
template<> EIGEN_STRONG_INLINE void prefetch<int>(const int* addr) { _mm_prefetch((const char*)(addr), _MM_HINT_T0); }
#if defined(_MSC_VER) && defined(_WIN64) && !defined(__INTEL_COMPILER)
// The temporary variable fixes an internal compilation error in vs <= 2008 and a wrong-result bug in vs 2010
// Direct of the struct members fixed bug #62.
template<> EIGEN_STRONG_INLINE float pfirst<Packet4f>(const Packet4f& a) { return a.m128_f32[0]; }
template<> EIGEN_STRONG_INLINE double pfirst<Packet2d>(const Packet2d& a) { return a.m128d_f64[0]; }
template<> EIGEN_STRONG_INLINE int pfirst<Packet4i>(const Packet4i& a) { int x = _mm_cvtsi128_si32(a); return x; }
#elif defined(_MSC_VER) && !defined(__INTEL_COMPILER)
// The temporary variable fixes an internal compilation error in vs <= 2008 and a wrong-result bug in vs 2010
template<> EIGEN_STRONG_INLINE float pfirst<Packet4f>(const Packet4f& a) { float x = _mm_cvtss_f32(a); return x; }
template<> EIGEN_STRONG_INLINE double pfirst<Packet2d>(const Packet2d& a) { double x = _mm_cvtsd_f64(a); return x; }
template<> EIGEN_STRONG_INLINE int pfirst<Packet4i>(const Packet4i& a) { int x = _mm_cvtsi128_si32(a); return x; }
#else
template<> EIGEN_STRONG_INLINE float pfirst<Packet4f>(const Packet4f& a) { return _mm_cvtss_f32(a); }
template<> EIGEN_STRONG_INLINE double pfirst<Packet2d>(const Packet2d& a) { return _mm_cvtsd_f64(a); }
template<> EIGEN_STRONG_INLINE int pfirst<Packet4i>(const Packet4i& a) { return _mm_cvtsi128_si32(a); }
#endif
template<> EIGEN_STRONG_INLINE Packet4f preverse(const Packet4f& a)
{ return _mm_shuffle_ps(a,a,0x1B); }
template<> EIGEN_STRONG_INLINE Packet2d preverse(const Packet2d& a)
{ return _mm_shuffle_pd(a,a,0x1); }
template<> EIGEN_STRONG_INLINE Packet4i preverse(const Packet4i& a)
{ return _mm_shuffle_epi32(a,0x1B); }
template<> EIGEN_STRONG_INLINE Packet4f pabs(const Packet4f& a)
{
const Packet4f mask = _mm_castsi128_ps(_mm_setr_epi32(0x7FFFFFFF,0x7FFFFFFF,0x7FFFFFFF,0x7FFFFFFF));
return _mm_and_ps(a,mask);
}
template<> EIGEN_STRONG_INLINE Packet2d pabs(const Packet2d& a)
{
const Packet2d mask = _mm_castsi128_pd(_mm_setr_epi32(0xFFFFFFFF,0x7FFFFFFF,0xFFFFFFFF,0x7FFFFFFF));
return _mm_and_pd(a,mask);
}
template<> EIGEN_STRONG_INLINE Packet4i pabs(const Packet4i& a)
{
#ifdef EIGEN_VECTORIZE_SSSE3
return _mm_abs_epi32(a);
#else
Packet4i aux = _mm_srai_epi32(a,31);
return _mm_sub_epi32(_mm_xor_si128(a,aux),aux);
#endif
}
EIGEN_STRONG_INLINE void punpackp(Packet4f* vecs)
{
vecs[1] = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(vecs[0]), 0x55));
vecs[2] = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(vecs[0]), 0xAA));
vecs[3] = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(vecs[0]), 0xFF));
vecs[0] = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(vecs[0]), 0x00));
}
#ifdef EIGEN_VECTORIZE_SSE3
// TODO implement SSE2 versions as well as integer versions
template<> EIGEN_STRONG_INLINE Packet4f preduxp<Packet4f>(const Packet4f* vecs)
{
return _mm_hadd_ps(_mm_hadd_ps(vecs[0], vecs[1]),_mm_hadd_ps(vecs[2], vecs[3]));
}
template<> EIGEN_STRONG_INLINE Packet2d preduxp<Packet2d>(const Packet2d* vecs)
{
return _mm_hadd_pd(vecs[0], vecs[1]);
}
// SSSE3 version:
// EIGEN_STRONG_INLINE Packet4i preduxp(const Packet4i* vecs)
// {
// return _mm_hadd_epi32(_mm_hadd_epi32(vecs[0], vecs[1]),_mm_hadd_epi32(vecs[2], vecs[3]));
// }
template<> EIGEN_STRONG_INLINE float predux<Packet4f>(const Packet4f& a)
{
Packet4f tmp0 = _mm_hadd_ps(a,a);
return pfirst(_mm_hadd_ps(tmp0, tmp0));
}
template<> EIGEN_STRONG_INLINE double predux<Packet2d>(const Packet2d& a) { return pfirst(_mm_hadd_pd(a, a)); }
// SSSE3 version:
// EIGEN_STRONG_INLINE float predux(const Packet4i& a)
// {
// Packet4i tmp0 = _mm_hadd_epi32(a,a);
// return pfirst(_mm_hadd_epi32(tmp0, tmp0));
// }
#else
// SSE2 versions
template<> EIGEN_STRONG_INLINE float predux<Packet4f>(const Packet4f& a)
{
Packet4f tmp = _mm_add_ps(a, _mm_movehl_ps(a,a));
return pfirst(_mm_add_ss(tmp, _mm_shuffle_ps(tmp,tmp, 1)));
}
template<> EIGEN_STRONG_INLINE double predux<Packet2d>(const Packet2d& a)
{
return pfirst(_mm_add_sd(a, _mm_unpackhi_pd(a,a)));
}
template<> EIGEN_STRONG_INLINE Packet4f preduxp<Packet4f>(const Packet4f* vecs)
{
Packet4f tmp0, tmp1, tmp2;
tmp0 = _mm_unpacklo_ps(vecs[0], vecs[1]);
tmp1 = _mm_unpackhi_ps(vecs[0], vecs[1]);
tmp2 = _mm_unpackhi_ps(vecs[2], vecs[3]);
tmp0 = _mm_add_ps(tmp0, tmp1);
tmp1 = _mm_unpacklo_ps(vecs[2], vecs[3]);
tmp1 = _mm_add_ps(tmp1, tmp2);
tmp2 = _mm_movehl_ps(tmp1, tmp0);
tmp0 = _mm_movelh_ps(tmp0, tmp1);
return _mm_add_ps(tmp0, tmp2);
}
template<> EIGEN_STRONG_INLINE Packet2d preduxp<Packet2d>(const Packet2d* vecs)
{
return _mm_add_pd(_mm_unpacklo_pd(vecs[0], vecs[1]), _mm_unpackhi_pd(vecs[0], vecs[1]));
}
#endif // SSE3
template<> EIGEN_STRONG_INLINE int predux<Packet4i>(const Packet4i& a)
{
Packet4i tmp = _mm_add_epi32(a, _mm_unpackhi_epi64(a,a));
return pfirst(tmp) + pfirst(_mm_shuffle_epi32(tmp, 1));
}
template<> EIGEN_STRONG_INLINE Packet4i preduxp<Packet4i>(const Packet4i* vecs)
{
Packet4i tmp0, tmp1, tmp2;
tmp0 = _mm_unpacklo_epi32(vecs[0], vecs[1]);
tmp1 = _mm_unpackhi_epi32(vecs[0], vecs[1]);
tmp2 = _mm_unpackhi_epi32(vecs[2], vecs[3]);
tmp0 = _mm_add_epi32(tmp0, tmp1);
tmp1 = _mm_unpacklo_epi32(vecs[2], vecs[3]);
tmp1 = _mm_add_epi32(tmp1, tmp2);
tmp2 = _mm_unpacklo_epi64(tmp0, tmp1);
tmp0 = _mm_unpackhi_epi64(tmp0, tmp1);
return _mm_add_epi32(tmp0, tmp2);
}
// Other reduction functions:
// mul
template<> EIGEN_STRONG_INLINE float predux_mul<Packet4f>(const Packet4f& a)
{
Packet4f tmp = _mm_mul_ps(a, _mm_movehl_ps(a,a));
return pfirst(_mm_mul_ss(tmp, _mm_shuffle_ps(tmp,tmp, 1)));
}
template<> EIGEN_STRONG_INLINE double predux_mul<Packet2d>(const Packet2d& a)
{
return pfirst(_mm_mul_sd(a, _mm_unpackhi_pd(a,a)));
}
template<> EIGEN_STRONG_INLINE int predux_mul<Packet4i>(const Packet4i& a)
{
// after some experiments, it is seems this is the fastest way to implement it
// for GCC (eg., reusing pmul is very slow !)
// TODO try to call _mm_mul_epu32 directly
EIGEN_ALIGN16 int aux[4];
pstore(aux, a);
return (aux[0] * aux[1]) * (aux[2] * aux[3]);;
}
// min
template<> EIGEN_STRONG_INLINE float predux_min<Packet4f>(const Packet4f& a)
{
Packet4f tmp = _mm_min_ps(a, _mm_movehl_ps(a,a));
return pfirst(_mm_min_ss(tmp, _mm_shuffle_ps(tmp,tmp, 1)));
}
template<> EIGEN_STRONG_INLINE double predux_min<Packet2d>(const Packet2d& a)
{
return pfirst(_mm_min_sd(a, _mm_unpackhi_pd(a,a)));
}
template<> EIGEN_STRONG_INLINE int predux_min<Packet4i>(const Packet4i& a)
{
// after some experiments, it is seems this is the fastest way to implement it
// for GCC (eg., it does not like using std::min after the pstore !!)
EIGEN_ALIGN16 int aux[4];
pstore(aux, a);
int aux0 = aux[0]<aux[1] ? aux[0] : aux[1];
int aux2 = aux[2]<aux[3] ? aux[2] : aux[3];
return aux0<aux2 ? aux0 : aux2;
}
// max
template<> EIGEN_STRONG_INLINE float predux_max<Packet4f>(const Packet4f& a)
{
Packet4f tmp = _mm_max_ps(a, _mm_movehl_ps(a,a));
return pfirst(_mm_max_ss(tmp, _mm_shuffle_ps(tmp,tmp, 1)));
}
template<> EIGEN_STRONG_INLINE double predux_max<Packet2d>(const Packet2d& a)
{
return pfirst(_mm_max_sd(a, _mm_unpackhi_pd(a,a)));
}
template<> EIGEN_STRONG_INLINE int predux_max<Packet4i>(const Packet4i& a)
{
// after some experiments, it is seems this is the fastest way to implement it
// for GCC (eg., it does not like using std::min after the pstore !!)
EIGEN_ALIGN16 int aux[4];
pstore(aux, a);
int aux0 = aux[0]>aux[1] ? aux[0] : aux[1];
int aux2 = aux[2]>aux[3] ? aux[2] : aux[3];
return aux0>aux2 ? aux0 : aux2;
}
#if (defined __GNUC__)
// template <> EIGEN_STRONG_INLINE Packet4f pmadd(const Packet4f& a, const Packet4f& b, const Packet4f& c)
// {
// Packet4f res = b;
// asm("mulps %[a], %[b] \n\taddps %[c], %[b]" : [b] "+x" (res) : [a] "x" (a), [c] "x" (c));
// return res;
// }
// EIGEN_STRONG_INLINE Packet4i _mm_alignr_epi8(const Packet4i& a, const Packet4i& b, const int i)
// {
// Packet4i res = a;
// asm("palignr %[i], %[a], %[b] " : [b] "+x" (res) : [a] "x" (a), [i] "i" (i));
// return res;
// }
#endif
#ifdef EIGEN_VECTORIZE_SSSE3
// SSSE3 versions
template<int Offset>
struct palign_impl<Offset,Packet4f>
{
static EIGEN_STRONG_INLINE void run(Packet4f& first, const Packet4f& second)
{
if (Offset!=0)
first = _mm_castsi128_ps(_mm_alignr_epi8(_mm_castps_si128(second), _mm_castps_si128(first), Offset*4));
}
};
template<int Offset>
struct palign_impl<Offset,Packet4i>
{
static EIGEN_STRONG_INLINE void run(Packet4i& first, const Packet4i& second)
{
if (Offset!=0)
first = _mm_alignr_epi8(second,first, Offset*4);
}
};
template<int Offset>
struct palign_impl<Offset,Packet2d>
{
static EIGEN_STRONG_INLINE void run(Packet2d& first, const Packet2d& second)
{
if (Offset==1)
first = _mm_castsi128_pd(_mm_alignr_epi8(_mm_castpd_si128(second), _mm_castpd_si128(first), 8));
}
};
#else
// SSE2 versions
template<int Offset>
struct palign_impl<Offset,Packet4f>
{
static EIGEN_STRONG_INLINE void run(Packet4f& first, const Packet4f& second)
{
if (Offset==1)
{
first = _mm_move_ss(first,second);
first = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(first),0x39));
}
else if (Offset==2)
{
first = _mm_movehl_ps(first,first);
first = _mm_movelh_ps(first,second);
}
else if (Offset==3)
{
first = _mm_move_ss(first,second);
first = _mm_shuffle_ps(first,second,0x93);
}
}
};
template<int Offset>
struct palign_impl<Offset,Packet4i>
{
static EIGEN_STRONG_INLINE void run(Packet4i& first, const Packet4i& second)
{
if (Offset==1)
{
first = _mm_castps_si128(_mm_move_ss(_mm_castsi128_ps(first),_mm_castsi128_ps(second)));
first = _mm_shuffle_epi32(first,0x39);
}
else if (Offset==2)
{
first = _mm_castps_si128(_mm_movehl_ps(_mm_castsi128_ps(first),_mm_castsi128_ps(first)));
first = _mm_castps_si128(_mm_movelh_ps(_mm_castsi128_ps(first),_mm_castsi128_ps(second)));
}
else if (Offset==3)
{
first = _mm_castps_si128(_mm_move_ss(_mm_castsi128_ps(first),_mm_castsi128_ps(second)));
first = _mm_castps_si128(_mm_shuffle_ps(_mm_castsi128_ps(first),_mm_castsi128_ps(second),0x93));
}
}
};
template<int Offset>
struct palign_impl<Offset,Packet2d>
{
static EIGEN_STRONG_INLINE void run(Packet2d& first, const Packet2d& second)
{
if (Offset==1)
{
first = _mm_castps_pd(_mm_movehl_ps(_mm_castpd_ps(first),_mm_castpd_ps(first)));
first = _mm_castps_pd(_mm_movelh_ps(_mm_castpd_ps(first),_mm_castpd_ps(second)));
}
}
};
#endif
} // end namespace internal
} // end namespace Eigen
#endif // EIGEN_PACKET_MATH_SSE_H

View File

@ -0,0 +1,289 @@
// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2008-2009 Gael Guennebaud <gael.guennebaud@inria.fr>
//
// Eigen is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 3 of the License, or (at your option) any later version.
//
// Alternatively, you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
// published by the Free Software Foundation; either version 2 of
// the License, or (at your option) any later version.
//
// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY
// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License and a copy of the GNU General Public License along with
// Eigen. If not, see <http://www.gnu.org/licenses/>.
#ifndef EIGEN_SELFADJOINT_MATRIX_VECTOR_H
#define EIGEN_SELFADJOINT_MATRIX_VECTOR_H
namespace Eigen {
namespace internal {
/* Optimized selfadjoint matrix * vector product:
* This algorithm processes 2 columns at onces that allows to both reduce
* the number of load/stores of the result by a factor 2 and to reduce
* the instruction dependency.
*/
template<typename Scalar, typename Index, int StorageOrder, int UpLo, bool ConjugateLhs, bool ConjugateRhs, int Version=Specialized>
struct selfadjoint_matrix_vector_product;
template<typename Scalar, typename Index, int StorageOrder, int UpLo, bool ConjugateLhs, bool ConjugateRhs, int Version>
struct selfadjoint_matrix_vector_product
{
static EIGEN_DONT_INLINE void run(
Index size,
const Scalar* lhs, Index lhsStride,
const Scalar* _rhs, Index rhsIncr,
Scalar* res,
Scalar alpha)
{
typedef typename packet_traits<Scalar>::type Packet;
typedef typename NumTraits<Scalar>::Real RealScalar;
const Index PacketSize = sizeof(Packet)/sizeof(Scalar);
enum {
IsRowMajor = StorageOrder==RowMajor ? 1 : 0,
IsLower = UpLo == Lower ? 1 : 0,
FirstTriangular = IsRowMajor == IsLower
};
conj_helper<Scalar,Scalar,NumTraits<Scalar>::IsComplex && EIGEN_LOGICAL_XOR(ConjugateLhs, IsRowMajor), ConjugateRhs> cj0;
conj_helper<Scalar,Scalar,NumTraits<Scalar>::IsComplex && EIGEN_LOGICAL_XOR(ConjugateLhs, !IsRowMajor), ConjugateRhs> cj1;
conj_helper<Scalar,Scalar,NumTraits<Scalar>::IsComplex, ConjugateRhs> cjd;
conj_helper<Packet,Packet,NumTraits<Scalar>::IsComplex && EIGEN_LOGICAL_XOR(ConjugateLhs, IsRowMajor), ConjugateRhs> pcj0;
conj_helper<Packet,Packet,NumTraits<Scalar>::IsComplex && EIGEN_LOGICAL_XOR(ConjugateLhs, !IsRowMajor), ConjugateRhs> pcj1;
Scalar cjAlpha = ConjugateRhs ? conj(alpha) : alpha;
// FIXME this copy is now handled outside product_selfadjoint_vector, so it could probably be removed.
// if the rhs is not sequentially stored in memory we copy it to a temporary buffer,
// this is because we need to extract packets
ei_declare_aligned_stack_constructed_variable(Scalar,rhs,size,rhsIncr==1 ? const_cast<Scalar*>(_rhs) : 0);
if (rhsIncr!=1)
{
const Scalar* it = _rhs;
for (Index i=0; i<size; ++i, it+=rhsIncr)
rhs[i] = *it;
}
Index bound = (std::max)(Index(0),size-8) & 0xfffffffe;
if (FirstTriangular)
bound = size - bound;
for (Index j=FirstTriangular ? bound : 0;
j<(FirstTriangular ? size : bound);j+=2)
{
const Scalar* EIGEN_RESTRICT A0 = lhs + j*lhsStride;
const Scalar* EIGEN_RESTRICT A1 = lhs + (j+1)*lhsStride;
Scalar t0 = cjAlpha * rhs[j];
Packet ptmp0 = pset1<Packet>(t0);
Scalar t1 = cjAlpha * rhs[j+1];
Packet ptmp1 = pset1<Packet>(t1);
Scalar t2(0);
Packet ptmp2 = pset1<Packet>(t2);
Scalar t3(0);
Packet ptmp3 = pset1<Packet>(t3);
size_t starti = FirstTriangular ? 0 : j+2;
size_t endi = FirstTriangular ? j : size;
size_t alignedStart = (starti) + internal::first_aligned(&res[starti], endi-starti);
size_t alignedEnd = alignedStart + ((endi-alignedStart)/(PacketSize))*(PacketSize);
// TODO make sure this product is a real * complex and that the rhs is properly conjugated if needed
res[j] += cjd.pmul(internal::real(A0[j]), t0);
res[j+1] += cjd.pmul(internal::real(A1[j+1]), t1);
if(FirstTriangular)
{
res[j] += cj0.pmul(A1[j], t1);
t3 += cj1.pmul(A1[j], rhs[j]);
}
else
{
res[j+1] += cj0.pmul(A0[j+1],t0);
t2 += cj1.pmul(A0[j+1], rhs[j+1]);
}
for (size_t i=starti; i<alignedStart; ++i)
{
res[i] += t0 * A0[i] + t1 * A1[i];
t2 += conj(A0[i]) * rhs[i];
t3 += conj(A1[i]) * rhs[i];
}
// Yes this an optimization for gcc 4.3 and 4.4 (=> huge speed up)
// gcc 4.2 does this optimization automatically.
const Scalar* EIGEN_RESTRICT a0It = A0 + alignedStart;
const Scalar* EIGEN_RESTRICT a1It = A1 + alignedStart;
const Scalar* EIGEN_RESTRICT rhsIt = rhs + alignedStart;
Scalar* EIGEN_RESTRICT resIt = res + alignedStart;
for (size_t i=alignedStart; i<alignedEnd; i+=PacketSize)
{
Packet A0i = ploadu<Packet>(a0It); a0It += PacketSize;
Packet A1i = ploadu<Packet>(a1It); a1It += PacketSize;
Packet Bi = ploadu<Packet>(rhsIt); rhsIt += PacketSize; // FIXME should be aligned in most cases
Packet Xi = pload <Packet>(resIt);
Xi = pcj0.pmadd(A0i,ptmp0, pcj0.pmadd(A1i,ptmp1,Xi));
ptmp2 = pcj1.pmadd(A0i, Bi, ptmp2);
ptmp3 = pcj1.pmadd(A1i, Bi, ptmp3);
pstore(resIt,Xi); resIt += PacketSize;
}
for (size_t i=alignedEnd; i<endi; i++)
{
res[i] += cj0.pmul(A0[i], t0) + cj0.pmul(A1[i],t1);
t2 += cj1.pmul(A0[i], rhs[i]);
t3 += cj1.pmul(A1[i], rhs[i]);
}
res[j] += alpha * (t2 + predux(ptmp2));
res[j+1] += alpha * (t3 + predux(ptmp3));
}
for (Index j=FirstTriangular ? 0 : bound;j<(FirstTriangular ? bound : size);j++)
{
const Scalar* EIGEN_RESTRICT A0 = lhs + j*lhsStride;
Scalar t1 = cjAlpha * rhs[j];
Scalar t2(0);
// TODO make sure this product is a real * complex and that the rhs is properly conjugated if needed
res[j] += cjd.pmul(internal::real(A0[j]), t1);
for (Index i=FirstTriangular ? 0 : j+1; i<(FirstTriangular ? j : size); i++)
{
res[i] += cj0.pmul(A0[i], t1);
t2 += cj1.pmul(A0[i], rhs[i]);
}
res[j] += alpha * t2;
}
}
};
} // end namespace internal
/***************************************************************************
* Wrapper to product_selfadjoint_vector
***************************************************************************/
namespace internal {
template<typename Lhs, int LhsMode, typename Rhs>
struct traits<SelfadjointProductMatrix<Lhs,LhsMode,false,Rhs,0,true> >
: traits<ProductBase<SelfadjointProductMatrix<Lhs,LhsMode,false,Rhs,0,true>, Lhs, Rhs> >
{};
}
template<typename Lhs, int LhsMode, typename Rhs>
struct SelfadjointProductMatrix<Lhs,LhsMode,false,Rhs,0,true>
: public ProductBase<SelfadjointProductMatrix<Lhs,LhsMode,false,Rhs,0,true>, Lhs, Rhs >
{
EIGEN_PRODUCT_PUBLIC_INTERFACE(SelfadjointProductMatrix)
enum {
LhsUpLo = LhsMode&(Upper|Lower)
};
SelfadjointProductMatrix(const Lhs& lhs, const Rhs& rhs) : Base(lhs,rhs) {}
template<typename Dest> void scaleAndAddTo(Dest& dest, Scalar alpha) const
{
typedef typename Dest::Scalar ResScalar;
typedef typename Base::RhsScalar RhsScalar;
typedef Map<Matrix<ResScalar,Dynamic,1>, Aligned> MappedDest;
eigen_assert(dest.rows()==m_lhs.rows() && dest.cols()==m_rhs.cols());
typename internal::add_const_on_value_type<ActualLhsType>::type lhs = LhsBlasTraits::extract(m_lhs);
typename internal::add_const_on_value_type<ActualRhsType>::type rhs = RhsBlasTraits::extract(m_rhs);
Scalar actualAlpha = alpha * LhsBlasTraits::extractScalarFactor(m_lhs)
* RhsBlasTraits::extractScalarFactor(m_rhs);
enum {
EvalToDest = (Dest::InnerStrideAtCompileTime==1),
UseRhs = (_ActualRhsType::InnerStrideAtCompileTime==1)
};
internal::gemv_static_vector_if<ResScalar,Dest::SizeAtCompileTime,Dest::MaxSizeAtCompileTime,!EvalToDest> static_dest;
internal::gemv_static_vector_if<RhsScalar,_ActualRhsType::SizeAtCompileTime,_ActualRhsType::MaxSizeAtCompileTime,!UseRhs> static_rhs;
ei_declare_aligned_stack_constructed_variable(ResScalar,actualDestPtr,dest.size(),
EvalToDest ? dest.data() : static_dest.data());
ei_declare_aligned_stack_constructed_variable(RhsScalar,actualRhsPtr,rhs.size(),
UseRhs ? const_cast<RhsScalar*>(rhs.data()) : static_rhs.data());
if(!EvalToDest)
{
#ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN
int size = dest.size();
EIGEN_DENSE_STORAGE_CTOR_PLUGIN
#endif
MappedDest(actualDestPtr, dest.size()) = dest;
}
if(!UseRhs)
{
#ifdef EIGEN_DENSE_STORAGE_CTOR_PLUGIN
int size = rhs.size();
EIGEN_DENSE_STORAGE_CTOR_PLUGIN
#endif
Map<typename _ActualRhsType::PlainObject>(actualRhsPtr, rhs.size()) = rhs;
}
internal::selfadjoint_matrix_vector_product<Scalar, Index, (internal::traits<_ActualLhsType>::Flags&RowMajorBit) ? RowMajor : ColMajor, int(LhsUpLo), bool(LhsBlasTraits::NeedToConjugate), bool(RhsBlasTraits::NeedToConjugate)>::run
(
lhs.rows(), // size
&lhs.coeffRef(0,0), lhs.outerStride(), // lhs info
actualRhsPtr, 1, // rhs info
actualDestPtr, // result info
actualAlpha // scale factor
);
if(!EvalToDest)
dest = MappedDest(actualDestPtr, dest.size());
}
};
namespace internal {
template<typename Lhs, typename Rhs, int RhsMode>
struct traits<SelfadjointProductMatrix<Lhs,0,true,Rhs,RhsMode,false> >
: traits<ProductBase<SelfadjointProductMatrix<Lhs,0,true,Rhs,RhsMode,false>, Lhs, Rhs> >
{};
}
template<typename Lhs, typename Rhs, int RhsMode>
struct SelfadjointProductMatrix<Lhs,0,true,Rhs,RhsMode,false>
: public ProductBase<SelfadjointProductMatrix<Lhs,0,true,Rhs,RhsMode,false>, Lhs, Rhs >
{
EIGEN_PRODUCT_PUBLIC_INTERFACE(SelfadjointProductMatrix)
enum {
RhsUpLo = RhsMode&(Upper|Lower)
};
SelfadjointProductMatrix(const Lhs& lhs, const Rhs& rhs) : Base(lhs,rhs) {}
template<typename Dest> void scaleAndAddTo(Dest& dest, Scalar alpha) const
{
// let's simply transpose the product
Transpose<Dest> destT(dest);
SelfadjointProductMatrix<Transpose<const Rhs>, int(RhsUpLo)==Upper ? Lower : Upper, false,
Transpose<const Lhs>, 0, true>(m_rhs.transpose(), m_lhs.transpose()).scaleAndAddTo(destT, alpha);
}
};
} // end namespace Eigen
#endif // EIGEN_SELFADJOINT_MATRIX_VECTOR_H