Action custom interface throws unspecified error

Here is my CMakeLists.txt and package.xml and the error and hierarchy in folder structure:

cmake_minimum_required(VERSION 3.5)

project(odom_record)

Default to C99

if(NOT CMAKE_C_STANDARD)

set(CMAKE_C_STANDARD 99)

endif()

Default to C++14

if(NOT CMAKE_CXX_STANDARD)

set(CMAKE_CXX_STANDARD 14)

endif()

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES “Clang”)

add_compile_options(-Wall -Wextra -Wpedantic)

endif()

find dependencies

find_package(ament_cmake REQUIRED)

find_package(rclcpp REQUIRED)

find_package(std_msgs REQUIRED)

find_package(geometry_msgs REQUIRED)

find_package(action_msgs REQUIRED)

find_package(rosidl_default_generators REQUIRED)

install(

DIRECTORY launch urdf models meshes worlds action config map

DESTINATION share/${PROJECT_NAME}

)

rosidl_generate_interfaces(${PROJECT_NAME}

“action/OdomRecord.action”

)

if(BUILD_TESTING)

find_package(ament_lint_auto REQUIRED)

the following line skips the linter, which checks for copyrights

uncomment the line when copyright and license are not present in all source files

#set(ament_cmake_copyright_FOUND TRUE)

the following line skips cpplint (only works in a git repo)

uncomment the line when this package is not in a git repo

#set(ament_cmake_cpplint_FOUND TRUE)

ament_lint_auto_find_test_dependencies()

endif()

ament_package()

<?xml version="1.0"?> <?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?> odom_record 0.0.0 TODO: Package description user TODO: License declaration

<buildtool_depend>ament_cmake</buildtool_depend>

rclpy
rclpp
std_msgs
geometry_msgs
action_msgs
<build_depend>rosidl_default_generators</build_depend>

<exec_depend>rosidl_default_runtime</exec_depend>

<member_of_group>rosidl_interface_packages</member_of_group>
<test_depend>ament_lint_auto</test_depend>
<test_depend>ament_lint_common</test_depend>

ament_cmake


Others have success in this second custom interface for an action in Rosject. For some reason it doesn’t like the necessary dependency on action_msgs.

Hi @scklink ,

It seems that you are trying to create a custom interface and use it within the same ROS2 package.

To do this successfully, you need to specify proper additional instructions in your CMakeLists file.

Refer this link for proper details: ROS2 Humble: Use an interface from the same package

These are the required lines in CMakeLists:

rosidl_get_typesupport_target(cpp_typesupport_target
  ${PROJECT_NAME} rosidl_typesupport_cpp)

target_link_libraries(<cpp_executable_name> "${cpp_typesupport_target}")

You also need to include rclcpp_action (for C++) or rclpy.action (for Python) as a dependency along with the other dependencies.

That should fix your issue.

Regards,
Girish

user:~/ros2_ws$ source install/setup.bash
user:~/ros2_ws$ colcon build --packages-select odom_record
Starting >>> odom_record
— stderr: odom_record
CMake Error at CMakeLists.txt:23 (rosidl_get_typesupport_target):
Unknown CMake command “rosidl_get_typesupport_target”.


Failed <<< odom_record [7.62s, exited with code 1]

Summary: 0 packages finished [8.98s]
1 package failed: odom_record
1 package had stderr output: odom_record
user:~/ros2_ws$

Without this code, it apparently works for others. It’s a custom interface for an action as a seperate package in src. A similar process worked for a service. I tried everything to get it to just initially build.

Hi @scklink ,

You should not add the lines that I gave you “as-is” into the CMakeLists file. It will not work.
You should replace <cpp_executable_name> with the name of your C++ executable name.
Just copy-pasting what I gave you will not work.

So just remove those two lines (that I gave you) from the CMakeLists file and just compile from scratch.
Steps to compile from scratch:

cd ~/ros2_ws
rm -rf ./build ./install ./log
colcon build && source install/setup.bash

These steps should fix your issue.

I also understand that you have not learnt how to define executable names and target dependencies for a C++ executable properly in a CMakeLists file.

The odom_record part belongs to Part 3 of the Final Project for ROS2 Basics on the TurtleBot. So unless you learn how to properly create a custom interface and how to properly create CMakeLists file, the solutions that I give you will make no sense immediately to you.

Please go back into the course and understand the lines added to CMakeLists file properly.

Regards,
Girish

This topic was automatically closed 5 days after the last reply. New replies are no longer allowed.