0
$\begingroup$

Rosanswers logo

I am trying to configure a package that contains srv, msg, etc., files along with CPP. However, the compiler can not find generated files. Below is the complete error:

ravi@dell:~/ros2_ws$ colcon build --allow-overriding action_tutorials_cpp
Starting >>> action_tutorials_cpp
--- stderr: action_tutorials_cpp                             
/home/ravi/ros2_ws/src/action_tutorials_cpp/src/fibonacci_action_server.cpp:17:10: fatal error: action_tutorials_cpp/action/fibonacci.hpp: No such file or directory
   17 | #include "action_tutorials_cpp/action/fibonacci.hpp"
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.
make[2]: *** [CMakeFiles/action_tutorials.dir/build.make:63: CMakeFiles/action_tutorials.dir/src/fibonacci_action_server.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:152: CMakeFiles/action_tutorials.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
make: *** [Makefile:141: all] Error 2
---
Failed   <<< action_tutorials_cpp [0.68s, exited with code 2]

Summary: 0 packages finished [0.84s]
  1 package failed: action_tutorials_cpp
  1 package had stderr output: action_tutorials_cpp

Please note that, the colcon was able to generate header file successfully, as shown below:

ravi@dell:~/ros2_ws$ find . -name fibonacci.hpp
./build/action_tutorials_cpp/rosidl_generator_cpp/action_tutorials_cpp/action/fibonacci.hpp

Surprisingly, the local_setup.bash shows the following error:

ravi@dell:~/ros2_ws$ source install/local_setup.bash
not found: "/home/ravi/ros2_ws/install/action_tutorials_cpp/share/action_tutorials_cpp/local_setup.bash"

Please see an example below (merged from action_tutorials_interfaces and action_tutorials_cpp):

CMakeLists.txt

cmake_minimum_required(VERSION 3.5)
project(action_tutorials_cpp)

find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(rclcpp_action REQUIRED)
find_package(rclcpp_components REQUIRED)
find_package(rosidl_default_generators REQUIRED)

rosidl_generate_interfaces(${PROJECT_NAME}
  "action/Fibonacci.action")

include_directories(include)

add_library(action_tutorials SHARED
  src/fibonacci_action_server.cpp)
rclcpp_components_register_node(action_tutorials PLUGIN "action_tutorials_cpp::FibonacciActionServer" 
  EXECUTABLE fibonacci_action_server)
target_compile_definitions(action_tutorials
  PRIVATE "ACTION_TUTORIALS_CPP_BUILDING_DLL")
ament_target_dependencies(action_tutorials
  "rclcpp"
  "rclcpp_action"
  "rclcpp_components")

install(TARGETS
  action_tutorials
  ARCHIVE DESTINATION lib
  LIBRARY DESTINATION lib
  RUNTIME DESTINATION bin)

if(BUILD_TESTING)
  find_package(ament_lint_auto REQUIRED)
  ament_lint_auto_find_test_dependencies()
endif()

ament_package()

package.xml

<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
  <name>action_tutorials_cpp</name>
  <version>0.9.3</version>
  <description>C++ action tutorial cpp code</description>
  <maintainer email="[email protected]">Mabel Zhang</maintainer>
  <maintainer email="[email protected]">Michael Jeronimo</maintainer>
  <license>Apache License 2.0</license>
  <author email="[email protected]">Jacob Perron</author>

  <buildtool_depend>ament_cmake</buildtool_depend>
  <buildtool_depend>rosidl_default_generators</buildtool_depend>

  <depend>rclcpp</depend>
  <depend>rclcpp_action</depend>
  <depend>rclcpp_components</depend>

  <exec_depend>rosidl_default_runtime</exec_depend>

  <test_depend>ament_lint_auto</test_depend>
  <test_depend>ament_lint_common</test_depend>

  <member_of_group>rosidl_interface_packages</member_of_group>
  <export>
    <build_type>ament_cmake</build_type>
  </export>
</package>

CPP (head only)

#include "action_tutorials_cpp/action/fibonacci.hpp"
#include "rclcpp/rclcpp.hpp"
#include "action_tutorials_cpp/visibility_control.h"
#include "rclcpp_action/rclcpp_action.hpp"
#include "rclcpp_components/register_node_macro.hpp"

namespace action_tutorials_cpp {
class FibonacciActionServer : public rclcpp::Node {
 public:
  using Fibonacci = action_tutorials_cpp::action::Fibonacci;
  using GoalHandleFibonacci = rclcpp_action::ServerGoalHandle<Fibonacci>;

  ACTION_TUTORIALS_CPP_PUBLIC
  explicit FibonacciActionServer(
      const rclcpp::NodeOptions& options = rclcpp::NodeOptions())
      : Node("fibonacci_action_server", options) {
    using namespace std::placeholders;

    this->action_server_ = rclcpp_action::create_server<Fibonacci>(
        this->get_node_base_interface(), this->get_node_clock_interface(),
        this->get_node_logging_interface(),
        this->get_node_waitables_interface(), "fibonacci",
        std::bind(&FibonacciActionServer::handle_goal, this, _1, _2),
        std::bind(&FibonacciActionServer::handle_cancel, this, _1),
        std::bind(&FibonacciActionServer::handle_accepted, this, _1));
  }

Package Structure

└── action_tutorials_cpp
    ├── action
    │   └── Fibonacci.action
    ├── CMakeLists.txt
    ├── include
    │   └── action_tutorials_cpp
    │       └── visibility_control.h
    ├── package.xml
    └── src
        └── fibonacci_action_server.cpp

5 directories, 5 files

I want to know how to configure such a package in ROS2.


Originally posted by ravijoshi on ROS Answers with karma: 1744 on 2022-06-11

Post score: 0

$\endgroup$

1 Answer 1

0
$\begingroup$

Rosanswers logo

It is possible to have msg/action/srv files in the same package as where you are using them, but the CMakeLists.txt is slightly different to the case where they are in separate packages.

The Expanding on ROS Interfaces (Foxy) covers this exact case.

Modify your CMakeLists.txt as following:

// Your existing code
install(TARGETS
  action_tutorials
  ARCHIVE DESTINATION lib
  LIBRARY DESTINATION lib
  RUNTIME DESTINATION bin)

// ---- Insert Folowing ----

// Humble onwards
rosidl_get_typesupport_target(cpp_typesupport_target ${PROJECT_NAME} "rosidl_typesupport_cpp")
target_link_libraries(action_tutorials "${cpp_typesupport_target}")

// Foxy, Galactic
rosidl_target_interfaces(action_tutorials ${PROJECT_NAME} "rosidl_typesupport_cpp")

// ---- Up to here ----

// Your existing code
if(BUILD_TESTING)
  find_package(ament_lint_auto REQUIRED)
  ament_lint_auto_find_test_dependencies()
endif()

For more info, see this solution:

Creating a custom msg in ros2


Originally posted by ijnek with karma: 460 on 2022-06-12

This answer was ACCEPTED on the original site

Post score: 2


Original comments

Comment by ravijoshi on 2022-06-12:
Sweet and simple. The compilation error has gone! On a side note, I must say that ROS2 documentation is a bit difficult to follow. However, I hope, over time, the documentation (and API also) gets easier to find. Finger crossed.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.