0
$\begingroup$

does anyone know why i cant initialize an instance of tf2_ros::buffer in ROS2 Foxy?

test_file.cpp :

#include "rclcpp/rclcpp.hpp"
#include "tf2_ros/buffer.h"
#include "tf2/convert.h"
#include "tf2_geometry_msgs/tf2_geometry_msgs.h"

int main(int argc, char **argv)
{
    rclcpp::init(argc, argv);
    tf2_ros::Buffer buffer;

}

CMakeLists.txt:

cmake_minimum_required(VERSION 3.5)
project(test_package)

# 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(tf2_ros REQUIRED)
find_package(tf2 REQUIRED)
find_package(geometry_msgs REQUIRED)
# uncomment the following section in order to fill in
# further dependencies manually.
# find_package(<dependency> REQUIRED)
add_executable(test_package src/test_file.cpp)

include_directories(include)
include_directories(
  ${tf2_ros_INCLUDE_DIRS}
)

ament_target_dependencies(test_package
tf2_ros
tf2
geometry_msgs
)

if(BUILD_TESTING)
  find_package(ament_lint_auto REQUIRED)
  # the following line skips the linter which checks for copyrights
  # uncomment the line when a copyright and license is 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()

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>test_package</name>
  <version>0.0.0</version>
  <description>TODO: Package description</description>
  <maintainer email="[email protected]">bryan</maintainer>
  <license>TODO: License declaration</license>

  <buildtool_depend>ament_cmake</buildtool_depend>
  
  <depend>tf2</depend>
  <depend>tf2_ros</depend>
  <depend>rclcpp</depend>
  <depend>geometry_msgs</depend>


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

  <export>
    <build_type>ament_cmake</build_type>
  </export>
</package>

I'm getting the following error:

error: no matching function for call to ‘tf2_ros::Buffer::Buffer()’
    9 |     tf2_ros::Buffer buffer;

Thank you very much !

$\endgroup$

1 Answer 1

0
$\begingroup$

The error you get is that there are no constructor of tf2_ros::Buffer without argument (e.g. tf2_ros::Buffer::Buffer()).

This constructor needs a clock, hence an underlying Node:

auto node{std::make_shared<rclcpp::Node>("node_name")};
tf2_ros::Buffer buffer(node->get_clock());
$\endgroup$
1
  • $\begingroup$ Thank you @oKermorgant that solved it! $\endgroup$
    – Bryan
    Commented May 27 at 11:17

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.