How to fix ROS2 Package '...' not found: package '...' not found, searching ...
Problem
You want to load a package from a local directory instead of a global ROS2 search directory.
Say, you want to load my_package:
$ ls
my_packageand you use
AMENT_PREFIX_PATH=$(pwd) ros2 launch my_package my.launch.pywith the prefix path set to the current directory, expecting ROS2 to find ./my_package in the current directory.
However, you see an error such as
Package 'my_package' not found: "package 'my_package' not found, searching: ['/home/user/']"Solution
When you set AMENT_PREFIX_PATH to, for example, /home/user, ROS2 will not search for ./my_package in /home/user.
Instead, it will look in /home/user/share/ament_index/resource_index/packages for a (potentially empty) file named my_package.
In other words, ROS2 expects the index to be in a specific directory structure:
/home/user/
└── share
└── ament_index
└── resource_index
└── packages
└── my_packageThe official way to use the ROS2 package
You must build my_package and use the auto-generated setup scripts to set the correct environment variables! ROS2 does not officially support hacking around with a custom AMENT_PREFIX_PATH like this.
cd my_package
colcon buildAfter that, load the package using the package name:
source install/local_setup.shThis will set
COLCON_PREFIX_PATH=/home/user/my_package/installwhich contains the correct ament index directory structure.
Workaround
In case you don’t want to build the package, you can create a symlink to the package in the expected directory:
mkdir -p share/ament_index/resource_index/packages
touch share/ament_index/resource_index/packages/my_packageThis will make ROS2 find the package. However, the correct share directory will still not be present, hence this is not recommended. In the future, I might add info on how to work around this.