解决aubo_i5+ag95抓手rviz问题

博客探讨了在机器人臂aubo上配置Octomap避障时遇到的问题。首先尝试通过添加urdf模型解决,但导致规划显示异常。随后提出替代方案,通过调整wrist3_joint的坐标,模拟抓手影响,成功使避障功能恢复正常。

由于实际场景中aubo配置了抓手,而在实现Octomap避障中没有抓手,首选方法是urdf加上ag95,然后配置各种bug,rviz能出现,moveit能规划,但Octomap没了。

替代方法:将y从-0.094加上抓手长度,改为-0.344。

WRIST3_JOINT ////////////////////////////////////-->
  <joint name="wrist3_joint" type="revolute">
    <origin xyz="0 -0.344 0" rpy="1.5708 0 1.7907E-15" />
    <parent link="wrist2_Link" />
    <child link="wrist3_Link" />
    <axis xyz="0 0 1" />
    <limit lower="-3.05" upper="3.05" effort="300" velocity="100" />
  </joint>

cmake_minimum_required(VERSION 3.4) project(ssp_gripper) set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(catkin REQUIRED COMPONENTS roscpp message_generation control_msgs actionlib sensor_msgs xmlrpcpp actionlib_msgs serial ) find_package(Franka 0.9.0 QUIET) if(NOT Franka_FOUND) find_package(Franka 0.8.0 REQUIRED) endif() # find_package(aubo_sdk REQUIRED # PATHS /home/robot-nanjing/aubo_sdk-0.26.0-rc.1-Linux_x86_64+ce93216/lib/cmake/aubo_sdk # NO_DEFAULT_PATH # ) add_action_files( DIRECTORY action FILES Grasp.action Homing.action Stop.action Move.action ) add_message_files( DIRECTORY msg FILES GraspEpsilon.msg ) generate_messages(DEPENDENCIES actionlib_msgs) catkin_package( INCLUDE_DIRS include LIBRARIES ssp_gripper CATKIN_DEPENDS roscpp message_runtime control_msgs actionlib sensor_msgs xmlrpcpp actionlib_msgs serial DEPENDS Franka ) add_library(jodellTool2 SHARED IMPORTED) set_target_properties(jodellTool2 PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/lib/libjodellTool2.so INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR}/include INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR}/include/dh ) add_library(zgGripperV6 SHARED IMPORTED) set_target_properties(zgGripperV6 PROPERTIES IMPORTED_LOCATION ${CMAKE_CURRENT_SOURCE_DIR}/lib/libzgGripperV6.so INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/include;${CMAKE_CURRENT_SOURCE_DIR}/include/zgv6" ) add_library(ssp_gripper src/ssp_gripper.cpp src/jodellgripper.cpp src/dh_device.cpp src/dh_gripper.cpp src/dh_modbus_gripper.cpp src/zg_gripper_v6.cpp src/dh_gripper_ag95.cpp src/dh_ag95/hand_controller.cpp src/dh_ag95/hand_driver.cpp src/dh_ag95/DH_datastream.cpp ) add_dependencies(ssp_gripper ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS} ${PROJECT_NAME}_generate_messages_cpp ) target_link_libraries(ssp_gripper ${Franka_LIBRARIES} ${catkin_LIBRARIES} jodellTool2 zgGripperV6 ) target_include_directories(ssp_gripper SYSTEM PUBLIC ${Franka_INCLUDE_DIRS} ${catkin_INCLUDE_DIRS} ) target_include_directories(ssp_gripper PUBLIC include ) ## XSJ set(AUBO_SDK_ROOT "/home/robot-nanjing/aubo_sdk-0.26.0-rc.1-Linux_x86_64+ce93216") include_directories( ${AUBO_SDK_ROOT}/include ) message(STATUS "=== ENTER add example_state ===") add_executable(example_state src/example_state.cpp ) message(STATUS "=== LEAVE add example_state ===") target_link_libraries(example_state ${AUBO_SDK_ROOT}/lib Threads::Threads) set_target_properties(example_state PROPERTIES BUILD_RPATH "${AUBO_SDK_ROOT}/lib" INSTALL_RPATH "${AUBO_SDK_ROOT}/lib" ) install(TARGETS example_state RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} ) ## XSJ add_executable(ssp_gripper_node src/ssp_gripper_node.cpp ) add_dependencies(ssp_gripper_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS} ssp_gripper ) target_link_libraries(ssp_gripper_node ${catkin_LIBRARIES} ssp_gripper ) target_include_directories(ssp_gripper_node SYSTEM PUBLIC ${catkin_INCLUDE_DIRS} ) ## Installation install(TARGETS ssp_gripper ssp_gripper_node ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} ) install(DIRECTORY include/${PROJECT_NAME}/ DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} ) install(DIRECTORY launch DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} ) install(DIRECTORY config DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} ) install(FILES lib/libjodellTool2.so lib/libzgGripperV6.so DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}) ## Tools include(${CMAKE_CURRENT_LIST_DIR}/../cmake/ClangTools.cmake OPTIONAL RESULT_VARIABLE CLANG_TOOLS ) if(CLANG_TOOLS) file(GLOB_RECURSE SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp) file(GLOB_RECURSE HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/include/*.h ${CMAKE_CURRENT_SOURCE_DIR}/src/*.h ) add_format_target(ssp_gripper FILES ${SOURCES} ${HEADERS}) add_tidy_target(ssp_gripper FILES ${SOURCES} DEPENDS ssp_gripper ssp_gripper_node ) endif() #set(CMAKE_INSTALL_RPATH "${CATKIN_PACKAGE_LIB_DESTINATION}") # 测试支持 if(CATKIN_ENABLE_TESTING) find_package(rostest REQUIRED) find_package(GTest REQUIRED) # 包含测试目录 add_subdirectory(ut) endif() 完整的cmakelist文件如上,请依据报错信息,优化该文件
最新发布
09-09
<think> 根据提供的CMakeLists.txt文件和之前的编译错误,问题主要出现在`example_state`目标的链接配置上。错误信息显示有大量未定义的引用,这些引用都来自`aubo_sdk`库中的函数。以下是根据错误信息对CMakeLists.txt的优化建议: ### 主要问题分析 1. **未正确链接`aubo_sdk`库**:在`target_link_libraries(example_state ...)`中,直接链接了目录而不是具体的库文件(`${AUBO_SDK_ROOT}/lib`是一个目录,应该链接具体的库文件)。 2. **未包含`aubo_sdk`的头文件**:虽然使用了`include_directories`添加了`${AUBO_SDK_ROOT}/include`,但最好为目标专门设置包含目录。 3. **未链接线程库**:错误信息中显示有`Threads::Threads`,但链接时可能存在问题。 ### 优化步骤 #### 1. 恢复`find_package(aubo_sdk)`并设置变量 取消注释`find_package(aubo_sdk ...)`,并确保找到包后设置相关变量。如果`aubo_sdk`提供了CMake配置文件,使用`find_package`是最佳方式。 ```cmake find_package(aubo_sdk REQUIRED PATHS /home/robot-nanjing/aubo_sdk-0.26.0-rc.1-Linux_x86_64+ce93216/lib/cmake/aubo_sdk NO_DEFAULT_PATH ) ``` #### 2. 添加`aubo_sdk`的头文件和库文件 使用`aubo_sdk`提供的变量(如`aubo_sdk_INCLUDE_DIRS`和`aubo_sdk_LIBRARIES`)来设置包含目录和链接库。如果`find_package`成功,这些变量应该被设置。 #### 3. 修改`example_state`的链接和包含 ```cmake add_executable(example_state src/example_state.cpp ) # 添加头文件包含 target_include_directories(example_state PUBLIC ${aubo_sdk_INCLUDE_DIRS} ) # 链接必要的库:catkin库、aubo_sdk库、线程库 target_link_libraries(example_state ${catkin_LIBRARIES} ${aubo_sdk_LIBRARIES} Threads::Threads ) # 设置RPATH(如果aubo_sdk_LIBRARY_DIRS可用,则使用它) if(aubo_sdk_LIBRARY_DIRS) set_target_properties(example_state PROPERTIES BUILD_RPATH "${aubo_sdk_LIBRARY_DIRS}" INSTALL_RPATH "${aubo_sdk_LIBRARY_DIRS}" ) else() # 否则使用之前设置的路径 set_target_properties(example_state PROPERTIES BUILD_RPATH "${AUBO_SDK_ROOT}/lib" INSTALL_RPATH "${AUBO_SDK_ROOT}/lib" ) endif() ``` #### 4. 移除全局`include_directories` 避免使用全局的`include_directories`,而是为目标单独设置包含目录(如上所示)。这样可以更精确地控制包含路径。 #### 5. 添加调试信息(可选) 在`find_package(aubo_sdk)`后添加消息,以确认找到的库和头文件路径: ```cmake message(STATUS "aubo_sdk include dirs: ${aubo_sdk_INCLUDE_DIRS}") message(STATUS "aubo_sdk libraries: ${aubo_sdk_LIBRARIES}") message(STATUS "aubo_sdk library dirs: ${aubo_sdk_LIBRARY_DIRS}") ``` ### 完整修改后的`example_state`部分 ```cmake ## 恢复find_package(aubo_sdk) find_package(aubo_sdk REQUIRED PATHS /home/robot-nanjing/aubo_sdk-0.26.0-rc.1-Linux_x86_64+ce93216/lib/cmake/aubo_sdk NO_DEFAULT_PATH ) ## 可选:打印调试信息 message(STATUS "=== aubo_sdk found ===") message(STATUS "aubo_sdk include dirs: ${aubo_sdk_INCLUDE_DIRS}") message(STATUS "aubo_sdk libraries: ${aubo_sdk_LIBRARIES}") message(STATUS "aubo_sdk library dirs: ${aubo_sdk_LIBRARY_DIRS}") ## XSJ message(STATUS "=== ENTER add example_state ===") add_executable(example_state src/example_state.cpp ) message(STATUS "=== LEAVE add example_state ===") # 添加包含目录 target_include_directories(example_state PUBLIC ${aubo_sdk_INCLUDE_DIRS} ) # 链接库 target_link_libraries(example_state ${catkin_LIBRARIES} ${aubo_sdk_LIBRARIES} # 这里链接具体的库文件 Threads::Threads ) # 设置RPATH set_target_properties(example_state PROPERTIES BUILD_RPATH "${aubo_sdk_LIBRARY_DIRS}" # 如果变量存在则使用 INSTALL_RPATH "${aubo_sdk_LIBRARY_DIRS}" ) install(TARGETS example_state RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} ) ``` ### 注意事项 1. **线程库链接**:确保`Threads::Threads`是正确导入的目标。在CMake中,通常使用`find_package(Threads REQUIRED)`并在链接时使用`Threads::Threads`。 2. **变量名称**:如果`aubo_sdk`提供的变量名不同,请根据实际情况调整(例如,可能是`AUBO_SDK_LIBRARIES`)。 3. **RPATH设置**:如果`aubo_sdk_LIBRARY_DIRS`未设置,可以回退到使用`${AUBO_SDK_ROOT}/lib`。 ### 其他优化 - 清理重复或无效的包含目录设置。 - 确保`catkin_package`中正确声明依赖(如果`aubo_sdk`需要)。 通过以上修改,应该能解决`example_state`的链接问题。如果问题仍然存在,请检查`aubo_sdk`的CMake配置文件,确认它是否正确设置了相关变量。 §§相关问题§§ 1. 当使用`find_package`查找自定义SDK时,如何确定该SDK是否提供了正确的CMake配置变量? 2. 在CMake中,`target_link_libraries`直接链接目录和链接具体的库文件有什么区别?为什么链接目录会导致错误? 3. 如何检查CMake中的`RPATH`设置是否在运行时生效? 4. 当第三方库(如aubo_sdk)依赖于线程库时,在CMake中如何确保线程库被正确链接? 5. 在大型ROS项目中,如何统一管理多个外部依赖库的查找和链接以避免冲突? </think> ### CMakeLists优化方案 根据您的编译错误和CMakeLists内容,存在以下关键问题: 1. `example_state`目标未正确链接aubo_sdk库 2. 库链接方式不正确(直接链接目录而非具体库文件) 3. 头文件包含路径未正确设置 4. 线程库依赖未显式声明 ### 优化后的CMakeLists修改点 ```cmake # 在project()后添加aubo_sdk配置 set(AUBO_SDK_ROOT "/home/robot-nanjing/aubo_sdk-0.26.0-rc.1-Linux_x86_64+ce93216") # 添加线程库查找(关键修复) find_package(Threads REQUIRED) # 添加aubo_sdk库目标 add_library(aubo_sdk SHARED IMPORTED) set_target_properties(aubo_sdk PROPERTIES IMPORTED_LOCATION "${AUBO_SDK_ROOT}/lib/libaubo_sdk.so" # 确保实际文件名匹配 INTERFACE_INCLUDE_DIRECTORIES "${AUBO_SDK_ROOT}/include" ) ## XSJ section优化 message(STATUS "=== ENTER add example_state ===") add_executable(example_state src/example_state.cpp ) # 正确添加头文件路径 target_include_directories(example_state SYSTEM PUBLIC ${AUBO_SDK_ROOT}/include ${catkin_INCLUDE_DIRS} ) # 正确链接库(使用具体库文件而非目录) target_link_libraries(example_state ${catkin_LIBRARIES} aubo_sdk # 使用前面定义的IMPORTED目标 ${CMAKE_THREAD_LIBS_INIT} # 显式链接线程库 ) set_target_properties(example_state PROPERTIES BUILD_RPATH "${AUBO_SDK_ROOT}/lib" INSTALL_RPATH "${AUBO_SDK_ROOT}/lib" ) message(STATUS "=== LEAVE add example_state ===") ``` ### 关键优化说明 1. **库链接方式修正** - 错误:`target_link_libraries(example_state ${AUBO_SDK_ROOT}/lib ...)` - 修正:创建IMPORTED目标并链接具体库文件`libaubo_sdk.so` 2. **线程库显式声明** - 添加`find_package(Threads REQUIRED)` - 链接`${CMAKE_THREAD_LIBS_INIT}`解决pthread依赖 3. **头文件包含优化** - 使用`target_include_directories`替代全局`include_directories` - 确保SYSTEM PUBLIC属性正确传递 4. **库文件存在性检查** ```cmake # 在add_library前添加检查 if(NOT EXISTS "${AUBO_SDK_ROOT}/lib/libaubo_sdk.so") message(FATAL_ERROR "aubo_sdk library not found!") endif() ``` ### 完整优化建议 ```cmake # 添加在project()声明后 # ... # 1. 验证库文件存在 if(NOT EXISTS "${AUBO_SDK_ROOT}/lib/libaubo_sdk.so") message(WARNING "aubo_sdk library not found at ${AUBO_SDK_ROOT}/lib/libaubo_sdk.so") else() message(STATUS "Found aubo_sdk: ${AUBO_SDK_ROOT}/lib/libaubo_sdk.so") endif() # 2. 添加线程支持 find_package(Threads REQUIRED) # 3. 创建aubo_sdk目标 add_library(aubo_sdk SHARED IMPORTED) set_target_properties(aubo_sdk PROPERTIES IMPORTED_LOCATION "${AUBO_SDK_ROOT}/lib/libaubo_sdk.so" INTERFACE_INCLUDE_DIRECTORIES "${AUBO_SDK_ROOT}/include" ) # ... [保留其他原有配置] ... ## XSJ section message(STATUS "=== ENTER add example_state ===") add_executable(example_state src/example_state.cpp ) # 4. 包含目录设置 target_include_directories(example_state SYSTEM PUBLIC ${AUBO_SDK_ROOT}/include ${catkin_INCLUDE_DIRS} ) # 5. 正确链接库 target_link_libraries(example_state ${catkin_LIBRARIES} aubo_sdk ${CMAKE_THREAD_LIBS_INIT} # 关键:链接pthread ) # 6. RPATH设置 set_target_properties(example_state PROPERTIES BUILD_WITH_INSTALL_RPATH TRUE BUILD_RPATH "${AUBO_SDK_ROOT}/lib" INSTALL_RPATH "${AUBO_SDK_ROOT}/lib" ) # 7. 添加调试信息 message(STATUS "example_state link libraries: $<TARGET_PROPERTY:example_state,LINK_LIBRARIES>") message(STATUS "=== LEAVE add example_state ===") ``` ### 验证步骤 1. **编译前检查**: ```bash catkin clean catkin config --cmake-args -DCMAKE_VERBOSE_MAKEFILE=ON ``` 2. **编译验证**: ```bash catkin_make --pkg ssp_gripper | grep example_state # 应看到 -laubo_sdk 和 -lpthread 链接指令 ``` 3. **运行时验证**: ```bash ldd devel/lib/ssp_gripper/example_state | grep aubo # 应显示正确的库路径 ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值