Используйте пользовательские сообщения ROS вне рабочего места catkin с CMake - PullRequest
0 голосов
/ 15 апреля 2020

Вопрос: Каков наилучший способ включения сгенерированных сообщений / служб ros в код вне рабочего места catkin, в CMakeLists.txt?

Контекст: Итак, в текущем проекте, над которым я начал работать, система сборки основана на CMake, но некоторые кодов / исполняемых файлов используют ROS. Я решил следовать той же схеме и создать большинство исполняемых файлов вне рабочего места ROS catkin. Теперь из-за некоторых новых требований мне нужно было создать свои собственные сообщения / службы ROS, и добавить их в виде пакетов на рабочем месте catkin, и сгенерировать их с помощью catkin_make. Дерево каталогов выглядит следующим образом:

root
|-CMakeLists.txt
|-src
|-|--myExecutable.cpp
|-catkin_ws
|--|--src
|--|--|--myPackage
|--|--|---|--srv
|--|--|---|--msg
|--|--|---|--package.xml
|--|--|---|--CMakeLists.txt
|-otherLibraries
|--|--CMakeLists.txt

Теперь для собственного использования я просто запускаю catkin_make один раз, чтобы сгенерировать заголовочные файлы для msg / srv и source catkin_ws/devel/setup.bash (фактически добавленные в мой ~/.bashrc). для сборки проекта, с верхним CMakeLists.txt. В верхнем CMakeLists.txt у меня есть find_package(myPackage), и это прекрасно работает для моего использования, myExecutable.cpp, который использует сообщение / службу, определенную в myPackage, и библиотеки, созданные другими в otherLibraries, компилируется и прекрасно работает.

Теперь другой участник проекта, который использует Код Visual Studio , пожаловался, что find_package(myPackage) выдает ошибку в его инструментах IDE CMake. Я знаю, что это вызвано тем, что source catkin_ws/devel/setup.bash не запускается в IDE.

Мои знания CMake - это в лучшем случае пэчворк, но я знаю, что люди в проекте предпочитают Modern CMake и Я не уверен, что лучшая практика для решения этой проблемы. (Должен ли я запускать скрипт setup.bash внутри верхнего CMakeLists.txt? Должен ли я вручную добавить местоположение сгенерированного заголовка / lib, используя set()?)

1 Ответ

0 голосов
/ 15 апреля 2020

У меня был похожий случай, когда я использовал некоторые библиотеки C ++, независимые от ROS, а затем мне потребовалось использовать ROS.

В итоге я создал пакет catkin в моем catkin_ws для моего программного обеспечения и измените CMakeLists.txt для нужд без ROS. Таким образом, я использую catkin_make для создания всего проекта, включая ROS-материалы и не-ROS. На самом деле, я имею в виду случай с открытым исходным кодом здесь , вы можете посмотреть.

Затем вы можете сообщить своей IDE, где искать, и она должна все поднять. Лично я открыл свой пакет сережек в CLion IDE, и CLion все подобрал. Я смог собрать, скомпилировать, запустить и отладить в одной и той же IDE без хлопот, это действительно отличная установка для моих нужд (соединение ROS и не-ROS кода, полнофункциональная IDE с инструментами отладки!).

Обледенение на торте состоит в том, что я сделал все вышеизложенное в контейнере Singularity. Имея все это в одном контейнере, вы можете переносить и совместно использовать . Вы берете / делитесь рецептом Singularity или даже готовым образом Singularity, любой может использовать его на своем компьютере и иметь ту же конфигурацию, что и ваш! У нас есть пример такой конфигурации Singularity на GitHub здесь для предоставления полнофункционального и автономного контроллера UR5 для OpenRAVE.

...