Wie man ROS2 "Package '...' not found: package '...' not found, searching ..." behebt
Problem
Sie möchten ein Paket aus einem lokalen Verzeichnis statt aus einem globalen ROS2-Suchverzeichnis laden.
Sagen wir, Sie möchten my_package laden:
$ ls
my_packageund Sie verwenden
AMENT_PREFIX_PATH=$(pwd) ros2 launch my_package my.launch.pymit dem Prefix-Pfad auf das aktuelle Verzeichnis gesetzt, in der Erwartung, dass ROS2 ./my_package im aktuellen Verzeichnis findet.
Sie sehen jedoch einen Fehler wie
Package 'my_package' not found: "package 'my_package' not found, searching: ['/home/user/']"Lösung
Wenn Sie AMENT_PREFIX_PATH beispielsweise auf /home/user setzen, wird ROS2 nicht nach ./my_package in /home/user suchen.
Stattdessen wird es in /home/user/share/ament_index/resource_index/packages nach einer (potenziell leeren) Datei namens my_package suchen.
Mit anderen Worten, ROS2 erwartet, dass der Index in einer spezifischen Verzeichnisstruktur vorliegt:
/home/user/
└── share
└── ament_index
└── resource_index
└── packages
└── my_packageDer offizielle Weg, das ROS2-Paket zu verwenden
Sie müssen my_package bauen und die automatisch generierten setup-Skripte verwenden, um die korrekten Umgebungsvariablen zu setzen! ROS2 unterstützt offiziell kein Herumhacken mit einem benutzerdefinierten AMENT_PREFIX_PATH wie diesem.
cd my_package
colcon buildDanach laden Sie das Paket mit dem Paketnamen:
source install/local_setup.shDies wird setzen
COLCON_PREFIX_PATH=/home/user/my_package/installwas die korrekte ament-Index-Verzeichnisstruktur enthält.
Workaround
Falls Sie das Paket nicht bauen möchten, können Sie einen Symlink zum Paket im erwarteten Verzeichnis erstellen:
mkdir -p share/ament_index/resource_index/packages
touch share/ament_index/resource_index/packages/my_packageDies wird ROS2 dazu bringen, das Paket zu finden. Das korrekte share-Verzeichnis wird jedoch immer noch nicht vorhanden sein, daher wird dies nicht empfohlen. In Zukunft könnte ich Informationen hinzufügen, wie man dies umgehen kann.