ROS selbst compilieren und installieren

Für ROS Noetic unter Debian Testing

Wie update ich mein ROS?

cd ~/ros_catkin_ws
# Source your ROS
source /opt/ros/noetic/setup.bash
# Get newest release information
rosinstall_generator RPP --rosdistro noetic --tar --deps > tmp.rosinstall
# Compare the files tmp.rosinstall and noetic-desktop-full-and-bitbots-deps.rosinstall
# I use vimdiff and use :diffput for everything I want to change
vimdiff tmp.rosinstall noetic-desktop-full-and-bitbots-deps.rosinstall
# Merge the changes in the source directory
wstool merge -t src noetic-desktop-full-and-bitbots-deps.rosinstall
# Download the newest releases
wstool update -t src --delete-changed-uris
# Build
catkin build -c

Wie richte ich mir das alles ein?

# Create working directory
mkdir -p ~/ros_catkin_ws/src && cd ~/ros_catkin_ws
# Download list of dependencies
wget http://doku.bit-bots.de/package/ros_selbst_compilieren/noetic-desktop-full-and-bitbots-deps.rosinstall
# Install required tools
sudo apt install python3-rosdep python3-rosinstall-generator python3-wstool
# Initialize workspace
wstool init src
# Merge our configuration file
wstool merge -t src noetic-desktop-full-and-bitbots-deps.rosinstall
# Download the releases
wstool update -t src
# Install dependencies with rosdep (yes, we need debian buster here!)
sudo rosdep init
rosdep update
rosdep install -iry --from-paths src --os=debian:buster
# Some packages have different names, install them manually:
sudo apt install libboost-all-dev libgazebo-dev gazebo python3-pyqt5 python3-pyqt5.qtsvg libpcl-dev libopenvdb-dev python3-pyqt5.qtwebkit python3-lxml python3-pyqt5.qtopengl
# Install catkin_tools
pip3 install git+https://github.com/catkin/catkin_tools
# Create a ROS install directory and change ownership to your user
sudo mkdir -p /opt/ros
sudo chown $UID:$GID /opt/ros
# Configure catkin
catkin config --devel-isolated --merge-install -i /opt/ros/noetic --install --cmake-args -DPYTHON_VERSION=3 -DCMAKE_BUILD_TYPE=Release
# Build
catkin build -c

Irgendwas mit PyQt5 bindings failt!

Aus irgendwelchen Gründen wird nach den Bindings in /usr/share/sip/PyQt5 und nicht in /usr/lib/python3/dist-packages/PyQt5/bindings gesucht. Ich habe schon mal versucht, das zu Debuggen, aber bisher erfolglos. Dementsprechend auch Upstream noch nicht reported, so weit ich weiß, ist aber auch schon etwas her. Manueller Fix: Wir linken das halt so, dass er den Ordner findet.

sudo mkdir -p /usr/share/sip
sudo ln -s /usr/lib/python3/dist-packages/PyQt5/bindings /usr/share/sip/PyQt5

Ich habe in rqt keine Plugins!

Ursache ist, dass die Funktion getiterator() statt der Funktion iter() genutzt wird. Wieder so eine Geschichte mit Breaking Changes in der API, diesmal der vom Python-XML-Parser. Das ist Upstream schon gefixt, aber noch nicht releast. Manuelles Ändern geht so:

cd ~/ros_catkin_ws
sed -i "s/getiterator/iter/" src/rqt/rqt_gui/src/rqt_gui/ros_plugin_provider.py
catkin build --no-deps rqt_gui

Die DSD-Gui stürzt ab, wenn ich das Body Behavior auswähle!

Das zugrundeliegende Problem ist eine Inkompatibilität zwischen PyKDL und PyQt5. Siehe auch hier. Diese ist in PyKDL Upstream gefixt, indem SIP nicht mehr verwendet wird, aber noch nicht releast. Es gibt zwei mögliche Lösungen: Entweder PyKDL wird vor PyQt5 importiert, zum Beispiel indem PyKDL ganz oben in /opt/ros/noetic/lib/python3/dist-packages/python_qt_binding/__init__.py importiert wird, oder PyKDL wird selbst kompiliert. Dazu müssen die folgenden Zeilen in der rosinstall-Datei hinzugefügt werden:

- git:
    local-name: orocos_kinematics_dynamics
    uri: https://github.com/orocos/orocos_kinematics_dynamics.git
    version: master

Danach kann ROS wie oben beschrieben aktualisiert werden.

Webots hat keine Texturen!

Die Ursache ist eine nicht mit ausgelieferte jpeg-Bibliothek. Wir holen sie uns aus dem zugehörigen Ubuntu-Paket. Issue ist theoretisch Upstream gefixt, aber irgendwie geht es noch nicht.

cd /tmp
wget http://security.ubuntu.com/ubuntu/pool/main/libj/libjpeg-turbo/libjpeg-turbo8_1.5.2-0ubuntu5.18.04.4_amd64.deb -O libjpeg.deb
ar x libjpeg.deb data.tar.xz
tar -xJf data.tar.xz --strip-components=4 ./usr/lib/x86_64-linux-gnu
sudo mv libjpeg.so.8.1.2 libjpeg.so.8 /usr/local/webots/lib/webots

tf_prefix funktioniert nicht

Ja, das haben die in Noetic entfernt und sich noch nicht auf eine Lösung geeinigt. Nervt ein bisschen. Also müssen wir Robert Haschkes Fork vom robot_state_publisher nutzen. Das heißt in der rosinstall-Datei für den robot_state_publisher folgendes eintragen:

- git:
    local-name: robot_state_publisher
    uri: https://github.com/rhaschke/robot_state_publisher.git
    version: noetic-devel

Für mein Problem gibt es hier keine Lösung!

Sag mir Bescheid, höchstwahrscheinlich hatte ich das gleiche Problem auch schon und nur vergessen, es hier aufzuschreiben.