【问题标题】:How to use Eigen3 in ROS2 Foxy?如何在 ROS2 Foxy 中使用 Eigen3?
【发布时间】:2023-01-13 19:27:50
【问题描述】:

我正在 ROS2 foxy 工作区中开发我的 C++ 程序,我想使用 Eigen3。我试着按照这些步骤https://github.com/ros2/eigen3_cmake_module 但我不知道如何在我的程序中包含 Eigen3。你可以帮帮我吗?

我已经编辑了我的 CMakeList.txt 和 package.xml,但是当我尝试使用 #include <...> 包含时,它只显示我在我的根文件夹中克隆的 Eigen3 路径。

这是我的 CMakeList.txt

cmake_minimum_required(VERSION 3.5)
project(tachimawari)

if(NOT CMAKE_C_STANDARD)
  set(CMAKE_C_STANDARD 99)
endif()

if(NOT CMAKE_CXX_STANDARD)
  set(CMAKE_CXX_STANDARD 17)
endif()

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic -fPIC)
endif()

find_package(ament_cmake REQUIRED)
find_package(dynamixel_sdk REQUIRED)
find_package(kansei_interfaces REQUIRED)
find_package(keisan REQUIRED)
find_package(rclcpp REQUIRED)
find_package(tachimawari_interfaces REQUIRED)
find_package(eigen3_cmake_module REQUIRED)
find_package(Eigen3 REQUIRED)

add_library(${PROJECT_NAME} SHARED
  "src/${PROJECT_NAME}/control/controller/module/cm740.cpp"
  "src/${PROJECT_NAME}/control/controller/packet/protocol_1/instruction/bulk_read_packet.cpp"
  "src/${PROJECT_NAME}/control/controller/packet/protocol_1/instruction/read_packet.cpp"
  "src/${PROJECT_NAME}/control/controller/packet/protocol_1/instruction/sync_write_packet.cpp"
  "src/${PROJECT_NAME}/control/controller/packet/protocol_1/instruction/write_packet.cpp"
  "src/${PROJECT_NAME}/control/controller/packet/protocol_1/model/packet.cpp"
  "src/${PROJECT_NAME}/control/controller/packet/protocol_1/status/bulk_read_data.cpp"
  "src/${PROJECT_NAME}/control/controller/packet/protocol_1/status/status_packet.cpp"
  "src/${PROJECT_NAME}/control/controller/packet/protocol_1/utils/word.cpp"
  "src/${PROJECT_NAME}/control/controller/platform/linux.cpp"
  "src/${PROJECT_NAME}/control/controller/utils/timer.cpp"
  "src/${PROJECT_NAME}/control/manager/control_manager.cpp"
  "src/${PROJECT_NAME}/control/sdk/module/dynamixel_sdk.cpp"
  "src/${PROJECT_NAME}/control/sdk/packet/model/group_bulk_read.cpp"
  "src/${PROJECT_NAME}/control/sdk/packet/protocol_1/group_bulk_read.cpp"
  "src/${PROJECT_NAME}/control/sdk/packet/protocol_1/group_sync_write.cpp"
  "src/${PROJECT_NAME}/control/sdk/packet/protocol_2/group_bulk_read.cpp"
  "src/${PROJECT_NAME}/control/sdk/packet/protocol_2/group_sync_write.cpp"
  "src/${PROJECT_NAME}/imu/node/imu_node.cpp"
  "src/${PROJECT_NAME}/imu/node/imu_provider.cpp"
  "src/${PROJECT_NAME}/joint/model/joint_id.cpp"
  "src/${PROJECT_NAME}/joint/model/joint.cpp"
  "src/${PROJECT_NAME}/joint/node/joint_manager.cpp"
  "src/${PROJECT_NAME}/joint/node/joint_node.cpp"
  "src/${PROJECT_NAME}/joint/utils/middleware.cpp"
  "src/${PROJECT_NAME}/joint/utils/node_control.cpp"
  "src/${PROJECT_NAME}/node/tachimawari_node.cpp")

target_include_directories(${PROJECT_NAME} PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
  $<INSTALL_INTERFACE:include>)

ament_target_dependencies(${PROJECT_NAME}
  dynamixel_sdk
  kansei_interfaces
  keisan
  rclcpp
  tachimawari_interfaces
  Eigen3)

install(DIRECTORY "include" DESTINATION ".")

install(TARGETS ${PROJECT_NAME}
  EXPORT export_${PROJECT_NAME}
  ARCHIVE DESTINATION "lib"
  LIBRARY DESTINATION "lib"
  RUNTIME DESTINATION "bin")

add_executable(check_joints "src/check_joints_main.cpp")
target_include_directories(check_joints PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
  $<INSTALL_INTERFACE:include>)
target_link_libraries(check_joints ${PROJECT_NAME})

add_executable(init_joints "src/init_joints_main.cpp")
target_include_directories(init_joints PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
  $<INSTALL_INTERFACE:include>)
target_link_libraries(init_joints ${PROJECT_NAME})

add_executable(main "src/tachimawari_main.cpp")
target_include_directories(main PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
  $<INSTALL_INTERFACE:include>)
target_link_libraries(main ${PROJECT_NAME})

add_executable(read_buttons "src/read_buttons_main.cpp")
target_include_directories(read_buttons PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
  $<INSTALL_INTERFACE:include>)
target_link_libraries(read_buttons ${PROJECT_NAME})

add_executable(read_joints "src/read_joints_main.cpp")
target_include_directories(read_joints PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
  $<INSTALL_INTERFACE:include>)
target_link_libraries(read_joints ${PROJECT_NAME})

add_executable(forward_kinematic "src/tachimawari/node/forward_kinematic.cpp")
target_include_directories(forward_kinematic PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
  $<INSTALL_INTERFACE:include>)
target_link_libraries(forward_kinematic ${PROJECT_NAME})

install(TARGETS
  check_joints
  init_joints
  main
  read_buttons
  read_joints
  forward_kinematic
  DESTINATION lib/${PROJECT_NAME})

if(BUILD_TESTING)
  find_package(ament_cmake_gtest REQUIRED)
  find_package(ament_lint_auto REQUIRED)

  ament_add_gtest(${PROJECT_NAME}_tests
  "test/joint/joint_test.cpp")

  target_include_directories(${PROJECT_NAME}_tests PUBLIC
  $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
  $<INSTALL_INTERFACE:include>)

  target_link_libraries(${PROJECT_NAME}_tests ${PROJECT_NAME})
  ament_lint_auto_find_test_dependencies()

endif()

ament_export_dependencies(
  dynamixel_sdk
  kansei_interfaces
  keisan
  rclcpp
  tachimawari_interfaces
  Eigen3
  eigen3_cmake_module)
ament_export_include_directories("include")
ament_export_libraries(${PROJECT_NAME})
ament_package()

这是我的程序,我想包含特征标头

#include <iostream>
#include <stdio.h>
#include <eigen3/Dense> //im confused at this
using namespace std;
using namespace Eigen;

typedef Matrix<double, 4, 4> Matrix4D;
typedef Matrix<double, 4, 1> Vector4D;
typedef Matrix<double, 3, 1> Vector3D;

【问题讨论】:

  • 请分享你CMakeLists.txt和你想要添加Eigen标题的文件
  • 你好!感谢您的回复,我提供了 CMakeLists,但我要添加 EIgen 标头的文件尚未完成。
  • 我看不到你在哪里添加 eigen3 到你的 include_directories。参考find-package-eigen3-for-cmake

标签: c++ eigen3 ros2


【解决方案1】:

您缺少添加到您的 include_directories 或通过 target_link_libraties 链接的 Eigen

所以我想要么添加

INCLUDE_DIRECTORIES ( "$ENV{EIGEN3_INCLUDE_DIR}" )

或类似的东西

find_package (Eigen3 3.3 REQUIRED)
add_executable (example example.cpp)
target_link_libraries (example Eigen3::Eigen)

会解决它。

【讨论】:

    猜你喜欢
    • 2022-08-04
    • 2021-08-22
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 2020-06-02
    • 2013-03-07
    • 2023-01-30
    相关资源
    最近更新 更多