gaidel / img-spectru

Tool to build a prepared Raspbian images
MIT License
0 stars 0 forks source link

Установка ROS #2

Open copterspace opened 3 years ago

copterspace commented 3 years ago

Сегодня руками на собранном образе RPI собрал ROS noetic, из исходников. Ниже код sh скрипта, чтоб не забыть. Пока ещё в процессе тестирования mavros. rospy работает на 3-м Питоне.

Просьба посоветовать простой способ собрать deb пакет, чтобы:

  1. не собирать это богатство из исходников каждый раз при пересборке образа
  2. Не захламлять исходными кодами лишними место на диске.
# скрипт сборки ROS для гиперспектрометра
# по следум ручной сборки, под пользователем pi
# по статье https://varhowto.com/install-ros-noetic-raspberry-pi-4/
# установка пакетов ROS Noetic на RPI4: ros_comm + mavros + mavros_extras
# ??? а может ставить только mavros+mavros_extras? пусть зависимости сам тянет?...
#
# а вот тут описано как поставить DEB пакетом - но на arm64:
# https://zen.yandex.ru/media/id/5defebe43d008800b109142c/podgotovka-raspberry-pi-3-k-rabote-s-ros-noetic-5f9ab5604f93a25b1464438f

# Без этой хрени - не соберётся mavlink:
sudo apt install python-future

# засос и сборка из исходников:
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu buster main" > /etc/apt/sources.list.d/ros-noetic.list'
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
sudo apt update
sudo apt-get install -y python-rosdep python-rosinstall-generator python-wstool python-rosinstall build-essential cmake
sudo rosdep init
rosdep update
mkdir ~/ros_catkin_ws
cd ~/ros_catkin_ws
rosinstall_generator ros_comm mavros mavros_extras --rosdistro noetic --deps --wet-only --tar > noetic-ros_comm-wet.rosinstall
wstool init src noetic-ros_comm-wet.rosinstall
rosdep install -y --from-paths src --ignore-src --rosdistro noetic -r --os=debian:buster

# здесь я пропустил увеличение swap файла. Будет ли без этого работать? Или это сделать где-то раньше?
# руками ставил 1024 Мб
# sudo dphys-swapfile swapoff
# sudoedit /etc/dphys-swapfile
# sudo dphys-swapfile setup

# компиляция исходников:
export ROS_PYTHON_VERSION=3
sudo src/catkin/bin/catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/noetic -j1 -DPYTHON_EXECUTABLE=/usr/bin/python3 -DROS_PYTHON_VERSION=3

# поставить install_geographiclib_datasets.sh - для запуска mavros требуется 
sudo ./ros_catkin_ws/src/mavros/mavros/scripts/install_geographiclib_datasets.sh

# - это добавить и в .bashrc
source /opt/ros/noetic/setup.bash 

echo "> Setup ROS environment"
cat << EOF >> /home/pi/.bashrc
LANG='C.UTF-8'
LC_ALL='C.UTF-8'
ROS_DISTRO='noetic'
export ROS_HOSTNAME=\`hostname\`.local
source /opt/ros/noetic/setup.bash
# source /home/pi/hspr_ws/devel/setup.bash # - это потом раскомментим
EOF

# ? как потом исходники и всё лишнее удалить? нужны же только исполняемые файлы ????
urpylka commented 3 years ago

Посмотрел, мне нужно время, найду скрипты скину.

Тут еще нужно разделить мне кажется установку основного пакета ROS-COMM и и остальной фигни

Тыкай палкой меня периодически

urpylka commented 3 years ago

https://gist.github.com/awesomebytes/196eab972a94dd8fcdd69adfe3bd1152

copterspace commented 3 years ago

На нужен ещё web_video_server , про который я забыл. А его нет ещё под noetic. И судя по https://github.com/RobotWebTools/web_video_server/issues/102 - не предвидится быстро. Откатываемся на ROS Melodic, как наименее трудозатратный вариант?..

urpylka commented 3 years ago

В 1000 раз легче собрать один пакет, чем менять платформу. Собирай, делай debian пакет, в чем проблема? (выше инструкция)

copterspace commented 3 years ago

Текущий прогресс:

  1. На arm64 дистрибутиве таки noetic ставится из deb пакетов:
    
    sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
    sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
    sudo apt-get update
    sudo apt install ros-noetic-ros-base ros-noetic-mavros ros-noetic-mavros-extras ros-noetic-rosbash
    echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
    source ~/.bashrc

поставить install_geographiclib_datasets.sh - для запуска mavros требуется

curl https://raw.githubusercontent.com/mavlink/mavros/master/mavros/scripts/install_geographiclib_datasets.sh > install_geographiclib_datasets.sh chmod +x install_geographiclib_datasets.sh sudo ./install_geographiclib_datasets.sh


2. Web_video_server - собирается из исходников. Чтоб собрался - ему нужен ещё async_web_server_cpp
```bash
# catkin_make виснет на rpi3 без увеличения swap файла (https://varhowto.com/install-ros-noetic-raspberry-pi-4/)
sudo apt install python-rosdep python-catkin-pkg python-rosdistro python-rospkg python-rosdep-modules python-rosinstall python-rosinstall-generator python-wstool build-essential
sudo rosdep init
rosdep update

# попытка собрать web_video_server
mkdir -p ros_catkin_ws/src
cd ros_catkin_ws/src
git clone https://github.com/RobotWebTools/web_video_server
git clone https://github.com/GT-RAIL/async_web_server_cpp
cd ..
catkin_make
# catkin_make_isolated --install -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/noetic -j1 -DPYTHON_EXECUTABLE=/usr/bin/python3 -DROS_PYTHON_VERSION=3
# - вываливался с ошибкой. 
  1. Deb пакет по инструкции для web_video_server собрать не получилось.
    Получилось только для async_web_server_cpp
    А при попытке сборки web_video_server он ругается Could not resolve rosdep key 'async_web_server_cpp'
    # пробуем делать deb пакет из работающего сбилденного web_video_server
    # по https://gist.github.com/awesomebytes/196eab972a94dd8fcdd69adfe3bd1152
    sudo pip3 install -U bloom
    # sudo apt-get install fakeroot - "fakeroot is already the newest version (1.23-1)"
    cd src/web_video_server/
    # bloom-generate rosdebian --ros-distro noetic - ругается на зависимость Could not resolve rosdep key 'async_web_server_cpp'
    # пробуем http://wiki.ros.org/rosdep
    cd ../..
    rosdep install --from-paths src --ignore-src -r -y
    # говорит: #All required rosdeps installed successfully
    # не помогло - Could not resolve rosdep key 'async_web_server_cpp'
    cd ~/ros_catkin_ws/src/async_web_server_cpp
    bloom-generate rosdebian --ros-distro noetic
    source /opt/ros/noetic/setup.bash
    sudo apt-get install dpkg-dev debhelper
    fakeroot debian/rules binary
    # получился в src ros-noetic-async-web-server-cpp_0.0.3-0buster_arm64.deb
    cd ..
    sudo dpkg -i ros-noetic-async-web-server-cpp_0.0.3-0buster_arm64.deb
    # один хрен cd src/web_video_server/
    # bloom-generate rosdebian --ros-distro noetic - ругается на зависимость Could not resolve rosdep key 'async_web_server_cpp'

Планирую закатать то, что работает теперь в сборку образа - собрать образ с ROS уже в Докере, и дальше разбираться со следующими этапами. @urpylka по поводу проблем сборки deb пакета что-то посоветуешь?

urpylka commented 3 years ago

Ну ошибка совершенно очевидная. Нужно сборщику в ros рассказать, что такое async_web_server_cpp. Для этого используются yaml файлы. Посмотри как это сделано в clever

copterspace commented 3 years ago

bloom не умеет несколько реп в один пакет закатывать, он только 1 каталог может обрабатывать (в отличие от catkin_make).
в clever так не сделано - там используются только готовые deb пакеты и билдится сам клевер (т.е. там нету ситуации что нам надо сбилдить bloom-ом А, который зависит от Б, который лежит в соседнем каталоге. У них bloom вообще не используется в репе).
Но ответ на мой вопрос типа есть вот тут: https://answers.ros.org/question/280213/generate-deb-from-dependent-res-package-locally/#280235
Жаль, что нагуглился далеко не сразу...
Сделал по этой инструкции я файл rosdep.yaml

async_web_server_cpp:
  ubuntu: [ros-noetic-async_web_server_cpp]
  debian: [ros-noetic-async_web_server_cpp]


и добавил на него ссылку в /etc/ros/rosdep/sources.list.d/50-my.list :

yaml file:///home/pi/rosdep.yaml


bloom-generate rosdebian --ros-distro noetic - у меня теперь сработал Ok
а вот fakeroot debian/rules binary - свалился с ошибкой:

make[1]: Entering directory '/home/pi/ros_catkin_ws/src/web_video_server'
# In case we're installing to a non-standard location, look for a setup.sh
# in the install tree that was dropped by catkin, and source it.  It will
# set things like CMAKE_PREFIX_PATH, PKG_CONFIG_PATH, and PYTHONPATH.
if [ -f "/opt/ros/noetic/setup.sh" ]; then . "/opt/ros/noetic/setup.sh"; fi && \
dh_shlibdeps -l/home/pi/ros_catkin_ws/src/web_video_server/debian/ros-noetic-web-video-server//opt/ros/noetic/lib/
        install -d debian/ros-noetic-web-video-server/DEBIAN
        dpkg-shlibdeps -Tdebian/ros-noetic-web-video-server.substvars -l/home/pi/ros_catkin_ws/src/web_video_server/debian/ros-noetic-web-video-server//opt/ros/noetic/lib/ debian/ros-noetic-web-video-server/opt/ros/noetic/lib/web_video_server/web_video_server
dpkg-shlibdeps: warning: can't parse dependency ros-noetic-async_web_server_cpp
dpkg-shlibdeps: error: error occurred while parsing Build-Depends/Build-Depends-Arch
dh_shlibdeps: dpkg-shlibdeps -Tdebian/ros-noetic-web-video-server.substvars -l/home/pi/ros_catkin_ws/src/web_video_server/debian/ros-noetic-web-video-server//opt/ros/noetic/lib/ debian/ros-noetic-web-video-server/opt/ros/noetic/lib/web_video_server/web_video_server returned exit code 255
dh_shlibdeps: Aborting due to earlier error
make[1]: *** [debian/rules:53: override_dh_shlibdeps] Error 25
make[1]: Leaving directory '/home/pi/ros_catkin_ws/src/web_video_server'
make: *** [debian/rules:22: binary] Error 2


Теперь этот фейковый ros-noetic-async_web_server_cpp - добавлять как-то в /etc/apt/sources.list.d ?...
Или забить и билдить их оба из исходников... тоже не айс...
Clever вообще на melodic сидит до сих пор, возможно, из-за этой проблемы тоже...

copterspace commented 3 years ago

Почитал комменты к предыдущему вопросу, и вот тут https://answers.ros.org/question/288410/generate-deb-from-dependent-ros-package-locally/
Оказывается, Дебиан не поддерживает подчёркивания в именах пакетов 8-О
Заменил ros-noetic-async_web_server_cpp на ros-noetic-async-web-server-cpp в rosdep.yaml - собрался deb для web_video_server
На след.неделе протестирую его установку...

urpylka commented 3 years ago

Ну все так) В клевере используются yaml файлы вроде до сих пор. Раньше все пакеты собирались при сборке. Если покопаться в истории клевера можно найти)))

copterspace commented 3 years ago

встал ROS вроде, в билдере, без .deb файлов .
Только почему-то после выполнения добавленного скрипта install-ROS.sh он не стал выполнять make-setup.sh и ресайз - я их сделал руками на образе потом...
.deb я поставил руками уже на малину с помощью sudo apt-get install -f ./ros-noetic-web-video-server_0.2.1-0buster_arm64.deb
предварительно скопировав deb файлы в каталог distr
При этом кучу зависимостей дополнительных он высасывал из инета...
а вот чтоб в билдере это автоматом проделать - куда эти два деб-файла кошернее разместить? они весят всего 225 кб - может, прям в репозиторий их бахнуть? или так не кошерно?...

urpylka commented 3 years ago
  1. Скорее всего скрипт закончился с ошибкой, поэтому не продолжилось выполнение
  2. Все связанное со сборкой deb-пакета положи в отдельную папку (пока что, потом это нужно положить в отдельную репу), при сборке deb-пакет должен выгружаться в repo.urpylka.com. И ставится через apt install
copterspace commented 3 years ago

Со сборкой deb пакета под armhf - финал печален. async_web_server_cpp собрался и поставился ОК. А web_video_server - собрался, а при попытке установки apt-get сказал:

The following packages have unmet dependencies:
 ros-noetic-web-video-server : Depends: ros-noetic-cv-bridge but it is not installable
                               Depends: ros-noetic-image-transport but it is not installable
                               Depends: ros-noetic-roscpp but it is not installable
                               Depends: ros-noetic-roslib but it is not installable
                               Depends: ros-noetic-sensor-msgs but it is not installable
E: Unable to correct problems, you have held broken packages.

Там надо свой маленький билдфарм организовывать, чтоб билдить в deb ещё и зависимости под armhf, что в наши планы не входит. Вместо этого я после rosdep install в скрипт добавил git clone async_web_server_cpp и web_video_server в тот же воркспейс - после этого весь ROS Noetic сбилдился и работает как мне надо, под armhf, на 3 питоне.

Занимает правда 5 гигов теперь образ, но мусор я потом почищу. Буду переходить к сборке остального софта для гипера, ROS пока считаем, что заработал.

Ниже скрипт сборки deb пакетов, я его вручную по строчке исполнял, кой-чё комментировал по ходу:

## ROS Noetic build web_video_server
#sudo apt-get install -y python-rosinstall python-rosinstall-generator python-wstool #python-rosdep
#sudo rosdep init
#rosdep update

mkdir -p /home/pi/vws_ws/src
cd /home/pi/vws_ws/src

# так - плохо, т.к. в rosinstall пишет старые зависимости от melodic
#rosinstall_generator web_video_server --rosdistro melodic --deps --wet-only --tar > noetic-web_video_server.rosinstall

# создаёт пустой каталог src. можно не мудрствуя создать с mkdir?
#wstool init src
#cd src
git clone https://github.com/GT-RAIL/async_web_server_cpp
git clone https://github.com/RobotWebTools/web_video_server
cd ..

# билд из исходников
# скорее он не нужен - в процессе создания deb всё сбилдится по новой один фиг
# catkin_make_isolated -DCMAKE_BUILD_TYPE=Release --install-space /opt/ros/noetic -j1 -DPYTHON_EXECUTABLE=/usr/bin/python3 -DROS_PYTHON_VERSION=3

sudo pip3 install -U bloom
sudo apt-get install -y dpkg-dev debhelper
cd src/async_web_server_cpp/
bloom-generate rosdebian --ros-distro noetic
fakeroot debian/rules binary
cd ..
sudo apt-get install -f ./ros-noetic-async-web-server-cpp_0.0.3-0buster_armhf.deb
cd web_video_server

cat << EOF > /home/pi/rosdep.yaml
async_web_server_cpp:
  ubuntu: [ros-noetic-async-web-server-cpp]
  debian: [ros-noetic-async-web-server-cpp]
web_video_server:
  ubuntu: [ros-noetic-web-video-server]
  debian: [ros-noetic-web-video-server]
EOF

sudo cat << EOF > /etc/ros/rosdep/sources.list.d/50-my.list
yaml file:///home/pi/rosdep.yaml
EOF

rosdep update

bloom-generate rosdebian --ros-distro noetic
fakeroot debian/rules binary
cd ..
sudo apt-get install -f ./ros-noetic-web-video-server_0.2.1-0buster_armhf.deb

####### выдаёт ошибку:
The following packages have unmet dependencies:
 ros-noetic-web-video-server : Depends: ros-noetic-cv-bridge but it is not installable
                               Depends: ros-noetic-image-transport but it is not installable
                               Depends: ros-noetic-roscpp but it is not installable
                               Depends: ros-noetic-roslib but it is not installable
                               Depends: ros-noetic-sensor-msgs but it is not installable
E: Unable to correct problems, you have held broken packages.
copterspace commented 3 years ago

ломался билд РОС в img-tool . Причина - в cmake: https://gitlab.kitware.com/cmake/cmake/-/issues/20568 вылечить удалось только сносом существующего cmake 3.16.3 и установкой из https://cmake.org/install/ оригинального cmake 3.21.1. На образе cmake билдился 3.5 часа :( Пожалуй, вместо билда лучше распаковывать tar архив в /opt/ros/noetic , да и всё ....

urpylka commented 3 years ago

@copterspace так ты закрепил версию новую?