Cross-compile custom ROS2 package for Yocto #bitbake


bojankoce
 

Dear Sirs,

I have a hard time to cross-compile and to properly include the custom ROS2 foxy package into the Yocto image. I properly added meta-ros layer and ROS2 foxy distro to our Yocto build by following instructions from here (Sanity Tests pass successfully).

I wanted to use a devtool and build a simple custom ROS2 package containing publisher and subscriber nodes. The source code of the package is on the git - link.

I used tips and tricks from here to create ROS2 recipes with the devtool. My custom bitbake recipe for the simple ROS2 package looks like this (my-first-yocto-pkg_git.bb file):

DESCRIPTION = "Example of minimal publisher/subscriber using rclcpp."
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://package.xml;beginline=8;endline=8;md5=3a75fd635766e2f76c3d90ee6495f310"

SRC_URI = "git://github.com/bojankoce/ros2pkg;protocol=https"

# Modify these as desired
PV = "0.1.0"
SRCREV = "1312445de2e6861d9561c0f89f4827b94c2ff6b1"

DEPENDS = "rclcpp std-msgs"

S = "${WORKDIR}/git"

# NOTE: unable to map the following CMake package dependencies: rclcpp ament_lint_auto std_msgs ros_ament_cmake
inherit ros_ament_cmake

However, when I tried to build the package with the devtool build my-first-yocto-pkg command, I get the following error:

CMake Error at CMakeLists.txt:19 (find_package):
  By not providing "Findament_cmake.cmake" in CMAKE_MODULE_PATH this project
  has asked CMake to find a package configuration file provided by
  "ament_cmake", but CMake did not find one.

  Could not find a package configuration file provided by "ament_cmake" with
  any of the following names:

    ament_cmakeConfig.cmake
    ament_cmake-config.cmake

  Add the installation prefix of "ament_cmake" to CMAKE_PREFIX_PATH or set
  "ament_cmake_DIR" to a directory containing one of the above files.  If
  "ament_cmake" provides a separate development package or SDK, be sure it
  has been installed.

The issue is around ament_cmake. I included the inherit ros_ament_cmake line into the recipe but this does not help. Do you have any idea about what I am missing here? Is there any better way to cross-compile and include a custom ROS2 foxy package into the Yocto image?

Thanks in advance for your time and efforts.

Cheers,
Bojan.


Matthias Schoepfer
 

Hi Bojan,

On 11/8/21 3:39 PM, bojankoce wrote:

Dear Sirs,

I guess this is not the right address. Just saying.

I have a hard time to cross-compile and to properly include the custom ROS2 foxy package into the Yocto image. I properly added meta-ros layer and ROS2 foxy distro to our Yocto build by following instructions from here (Sanity Tests pass successfully).

I wanted to use a devtool and build a simple custom ROS2 package containing publisher and subscriber nodes. The source code of the package is on the git - link.

I used tips and tricks from here to create ROS2 recipes with the devtool. My custom bitbake recipe for the simple ROS2 package looks like this (my-first-yocto-pkg_git.bb file):

DESCRIPTION = "Example of minimal publisher/subscriber using rclcpp."
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://package.xml;beginline=8;endline=8;md5=3a75fd635766e2f76c3d90ee6495f310"

SRC_URI = "git://github.com/bojankoce/ros2pkg;protocol=https"

# Modify these as desired
PV = "0.1.0"
SRCREV = "1312445de2e6861d9561c0f89f4827b94c2ff6b1"

DEPENDS = "rclcpp std-msgs"

S = "${WORKDIR}/git"

# NOTE: unable to map the following CMake package dependencies: rclcpp ament_lint_auto std_msgs ros_ament_cmake
inherit ros_ament_cmake

However, when I tried to build the package with the devtool build my-first-yocto-pkg command, I get the following error:

CMake Error at CMakeLists.txt:19 (find_package):
  By not providing "Findament_cmake.cmake" in CMAKE_MODULE_PATH this project
  has asked CMake to find a package configuration file provided by
  "ament_cmake", but CMake did not find one.

  Could not find a package configuration file provided by "ament_cmake" with
  any of the following names:

    ament_cmakeConfig.cmake
    ament_cmake-config.cmake

  Add the installation prefix of "ament_cmake" to CMAKE_PREFIX_PATH or set
  "ament_cmake_DIR" to a directory containing one of the above files.  If
  "ament_cmake" provides a separate development package or SDK, be sure it
  has been installed.

The issue is around ament_cmake. I included the inherit ros_ament_cmake line into the recipe but this does not help. Do you have any idea about what I am missing here? Is there any better way to cross-compile and include a custom ROS2 foxy package into the Yocto image?

You are missing a DEPENDS, ros_ament_cmake does not add it. Try adding ament-cmake-native to your DEPENDS and see if that works (or give you a different error message, since I guess you might be missing out more stuff).


Regards,

   Matthias


bojankoce
 

Hello, Matthias.

I added `amente-cmake-native` inti DEPENDS and, indeed, I got a different error this time:
Initialising tasks: 100% |######################################################################################################| Time: 0:00:02
Sstate summary: Wanted 0 Local 0 Network 0 Missed 0 Current 578 (0% match, 100% complete)
NOTE: Executing Tasks
NOTE: my-first-yocto-pkg: compiling from external source tree /home/bojan/var-fslc-yocto-playground/build_xwayland/workspace/sources/my-first-yocto-pkg
ERROR: my-first-yocto-pkg-0.1.0-r0 do_package: QA Issue: my-first-yocto-pkg: Files/directories were installed but not shipped in any package:
  /usr/share/my_first_yocto_pkg
  /usr/share/my_first_yocto_pkg/local_setup.zsh
  /usr/share/my_first_yocto_pkg/local_setup.bash
  /usr/share/my_first_yocto_pkg/package.xml
  /usr/share/my_first_yocto_pkg/local_setup.sh
  /usr/share/my_first_yocto_pkg/package.dsv
  /usr/share/my_first_yocto_pkg/local_setup.dsv
  /usr/share/my_first_yocto_pkg/environment
  /usr/share/my_first_yocto_pkg/cmake
  /usr/share/my_first_yocto_pkg/environment/path.sh
  /usr/share/my_first_yocto_pkg/environment/path.dsv
  /usr/share/my_first_yocto_pkg/environment/ament_prefix_path.dsv
  /usr/share/my_first_yocto_pkg/environment/ament_prefix_path.sh
  /usr/share/my_first_yocto_pkg/cmake/my_first_yocto_pkgConfig.cmake
  /usr/share/my_first_yocto_pkg/cmake/my_first_yocto_pkgConfig-version.cmake
  /usr/lib/my_first_yocto_pkg/talker
  /usr/lib/my_first_yocto_pkg/listener
Please set FILES such that these items are packaged. Alternatively if they are unneeded, avoid installing them or delete them within do_install.
my-first-yocto-pkg: 17 installed and not shipped files. [installed-vs-shipped]
ERROR: my-first-yocto-pkg-0.1.0-r0 do_package: Fatal QA errors found, failing task.
ERROR: Logfile of failure stored in: /home/bojan/var-fslc-yocto-playground/build_xwayland/tmp/work/cortexa53-crypto-fslc-linux/my-first-yocto-pkg/0.1.0-r0/temp/log.do_package.15149
ERROR: Task (/home/bojan/var-fslc-yocto-playground/build_xwayland/workspace/recipes/my-first-yocto-pkg/my-first-yocto-pkg_git.bb:do_package) failed with exit code '1'
NOTE: Tasks Summary: Attempted 2200 tasks of which 2192 didn't need to be rerun and 1 failed.
NOTE: Writing buildhistory
NOTE: Writing buildhistory took: 3 seconds

Summary: 1 task failed:
  /home/bojan/var-fslc-yocto-playground/build_xwayland/workspace/recipes/my-first-yocto-pkg/my-first-yocto-pkg_git.bb:do_package
Summary: There was 1 WARNING message shown.
Summary: There were 2 ERROR messages shown, returning a non-zero exit code.
I needed to append the following lines at the end of my-first-yocto-pkg_git.bb file in order to resolve it:
FILES_${PN} += "/usr/share/my_first_yocto_pkg/*"
FILES_${PN} += "/usr/lib/my_first_yocto_pkg/*"
FILES_${PN}-dev = "/usr/share/my_first_yocto_pkg/* /usr/lib/my_first_yocto_pkg/* ${includedir}"


bojankoce
 

In addition to the above changes, I also included instructions inside conf/local.conf file to install my first ROS2 package:
IMAGE_INSTALL_append=" ros-core my-first-yocto-pkg"

After that, I was able to bitbake the complete Yocto image, put it on the SD card, and boot the Yocto on my devkit. After sourcing ros2_setup.sh script, I entered:

ros2 pkg list
command to list all available ROS2 packages on the system.

my_first_yocto_pkg package was on the list so I was happy and excited!

I wanted to do the final touch and launch the talker node from the packet with:

ros2 run my_first_yocto_pkg talker

However, I got the info that No executable is found! What the heck!

Do you have any idea what I did wrong in the whole process?

Appreciate your efforts!

Sincerely,
Bojan.


Matthias Schoepfer
 

Hi Bojan,

you do not need the additional FILES:${PN} if your package is properly named (i.e. cmake project name same as recipe same as package). I have no clue why the executable is not found, did you source the environment before?!

Regards,

    Matthias

On 11/10/21 8:37 PM, bojankoce wrote:

In addition to the above changes, I also included instructions inside conf/local.conf file to install my first ROS2 package:
IMAGE_INSTALL_append=" ros-core my-first-yocto-pkg"

After that, I was able to bitbake the complete Yocto image, put it on the SD card, and boot the Yocto on my devkit. After sourcing ros2_setup.sh script, I entered:

ros2 pkg list
command to list all available ROS2 packages on the system.

my_first_yocto_pkg package was on the list so I was happy and excited!

I wanted to do the final touch and launch the talker node from the packet with:

ros2 run my_first_yocto_pkg talker

However, I got the info that No executable is found! What the heck!

Do you have any idea what I did wrong in the whole process?

Appreciate your efforts!

Sincerely,
Bojan.



bojankoce
 

Hello, Matthias.

It seems the issue was around naming. Now it works fine even without FILES:${PN} at the end of .bb file.
I am now good to move forward.

Thank you very much for your assistance. It is really appreciated.

Sincerely,
Bojan.