[ROS开发]Ubuntu18.04下Azure Kinect DK深度相机 SDK以及ROS驱动配置
安装前准备:
–需要提前安装好ROS Melodic版本,可参考安装教程
–需要提前完成Azure Kinect SDK的安装,可参考lucky li的博客文章
–测试SDK中的k4aviewer能够正常启动并显示相机图像数据后开始以下配置工作
1.创建ROS工作空间
#建立并进入工作空间文件夹
mkdir -p catkin_ws/src
#初始化工作空间
cd catkin_ws/src
catkin_init_workspace
#编译工作空间
cd ..
catkin_make
#将ROS工作空间路径写入系统变量
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
#进入src目录下下载驱动代码
cd catkin_ws/src
git clone https://github.com/microsoft/Azure_Kinect_ROS_Driver.git
2.整理驱动下相关文件
文件下载链接:https://packages.microsoft.com/ubuntu/18.04/prod/pool/main/libk/
下载libk4a1.4/和lib4a1.4-dev/两个链接中的deb文件,然后解压
在两个解压文件中都有data.tar.gz压缩包,再将该压缩包解压后能够得到lib、share、include三个文件夹
在catkin_ws/src路径下创建文件夹ext/sdk
并创建ext/sdk/中的三个子文件夹bin、lib、include
cd catkin_ws/src
mkdir -p ext/sdk
cd ext/sdk
mkdir bin && cd ..
mkdir include && cd ..
mkdir bin && cd ..
创建好的文件如下
- bin文件夹: 把编译SDK时build文件夹里面的那个bin文件夹拷贝过来
- include文件夹:SDK源码里的include文件夹和从deb文件里提取出的include文件夹合并,拷贝过来
- lib文件夹:从deb文件里提取出的两个lib文件夹合并,拷贝过来
整理后的详细文件内容如下:
.
└── sdk
├── bin
│ ├── allocator_ut
│ ├── azure_c_shared_test
│ ├── AzureKinectFirmwareTool
│ ├── calibration_info
│ ├── calibration_ut
│ ├── capturesync_ut
│ ├── color_ft
│ ├── color_ut
│ ├── cpp_projection_ft
│ ├── custom_track_ut
│ ├── depth_ft
│ ├── depthmcu_ut
│ ├── depth_ut
│ ├── deversion
│ ├── dynlib_ut
│ ├── enumerate_devices
│ ├── executables_ft
│ ├── executables_ft_custom
│ ├── fastcapture_streaming
│ ├── fastcapture_trigger
│ ├── fastpointcloud
│ ├── functional_custom_test_list.txt
│ ├── functional_test_list.txt
│ ├── global_ft
│ ├── green_screen
│ ├── handle_ut
│ ├── imu_ft
│ ├── imu_ut
│ ├── k4a_cpp_ft
│ ├── k4a_example_test
│ ├── k4arecord_custom_track
│ ├── k4arecorder
│ ├── k4aviewer
│ ├── latency_perf
│ ├── libk4arecord.so -> libk4arecord.so.1.4
│ ├── libk4arecord.so.1.4 -> libk4arecord.so.1.4.0
│ ├── libk4arecord.so.1.4.0
│ ├── libk4a.so -> libk4a.so.1.4
│ ├── libk4a.so.1.4 -> libk4a.so.1.4.0
│ ├── libk4a.so.1.4.0
│ ├── libtest_dynlib.so -> libtest_dynlib.so.1
│ ├── libtest_dynlib.so.1 -> libtest_dynlib.so.1.0
│ ├── libtest_dynlib.so.1.0
│ ├── logging_ut
│ ├── multidevice_ft
│ ├── opencv_example
│ ├── perf_test_list.txt
│ ├── playback_external_sync
│ ├── playback_perf
│ ├── playback_ut
│ ├── queue_ut
│ ├── record_ut
│ ├── rwlock_ft
│ ├── streaming_samples
│ ├── testutil
│ ├── throughput_perf
│ ├── transformation_example
│ ├── transformation_ut
│ ├── undistort
│ ├── unit_test_list.txt
│ └── viewer_opengl
├── include
│ ├── azure_kinect_ros_driver
│ │ ├── k4a_calibration_transform_data.h
│ │ ├── k4a_ros_bridge_nodelet.h
│ │ ├── k4a_ros_device.h
│ │ ├── k4a_ros_device_params.h
│ │ └── k4a_ros_types.h
│ ├── k4a
│ │ ├── k4a_export.h
│ │ ├── k4a.h
│ │ ├── k4a.hpp
│ │ ├── k4atypes.h
│ │ └── k4aversion.h.in
│ ├── k4ainternal
│ │ ├── allocator.h
│ │ ├── calibration.h
│ │ ├── capture.h
│ │ ├── capturesync.h
│ │ ├── color.h
│ │ ├── color_mcu.h
│ │ ├── common.h
│ │ ├── deloader.h
│ │ ├── depth.h
│ │ ├── depth_mcu.h
│ │ ├── dewrapper.h
│ │ ├── dynlib.h
│ │ ├── firmware.h
│ │ ├── global.h
│ │ ├── handle.h
│ │ ├── image.h
│ │ ├── imu.h
│ │ ├── k4aplugin.h
│ │ ├── logging.h
│ │ ├── math.h
│ │ ├── matroska_common.h
│ │ ├── matroska_read.h
│ │ ├── matroska_write.h
│ │ ├── queue.h
│ │ ├── rwlock.h
│ │ ├── tewrapper.h
│ │ ├── transformation.h
│ │ └── usbcommand.h
│ └── k4arecord
│ ├── playback.h
│ ├── playback.hpp
│ ├── record.h
│ ├── record.hpp
│ └── types.h
└── lib
└── x86_64-linux-gnu
├── cmake
│ ├── k4a
│ │ ├── k4aConfig.cmake
│ │ ├── k4aConfigVersion.cmake
│ │ ├── k4aTargets.cmake
│ │ └── k4aTargets-relwithdebinfo.cmake
│ └── k4arecord
│ ├── k4arecordConfig.cmake
│ ├── k4arecordConfigVersion.cmake
│ ├── k4arecordTargets.cmake
│ └── k4arecordTargets-relwithdebinfo.cmake
├── libk4a1.4
│ └── libdepthengine.so.2.0
├── libk4arecord.so -> libk4arecord.so.1.4
├── libk4arecord.so.1.4 -> libk4arecord.so.1.4.0
├── libk4arecord.so.1.4.0
├── libk4a.so -> libk4a.so.1.4
├── libk4a.so.1.4 -> libk4a.so.1.4.0
└── libk4a.so.1.4.0
13 directories, 119 files
3.部分代码修改
需要修改的代码路径:Azure_Kinect_ROS_Driver/include/azure_kinect_ros_driver/k4a_ros_device.h
- 将std::atomic_int64_t last_capture_time_usec_; 改为:std::atomic<int64_t> last_capture_time_usec_;
- 将std::atomic_uint64_t last_imu_time_usec_;改为:std::atomic<uint64_t> last_imu_time_usec_;
- 将 std::atomic_bool imu_stream_end_of_file_;改为: std::atomic imu_stream_end_of_file_;
4.编译ROS工作空间
cd catkin_ws
catkin_make
编译成功后就会有以下提示信息
Built target azure_kinect_ros_driver_nodelet
Built target azure_kinect_ros_driver_node
5.测试ROS是否正常发送并接收Topic
roscore
roslaunch azure_kinect_ros_driver driver.launch
正常启动节点的话终端会输出相机相关信息。
订阅ros话题,查看相机进程是否已经成功发送topic
rostopic list
能够正常接受相机发送的topic,说明配置成功。
现在可以通过rviz进行话题订阅以及在rviz中显示Azure Kinect DK的图像画面。
rviz
点击Add->Image载入图像窗口
在Image下拉选项中找到Image Topic的下拉菜单,选择不同的话题(不同的图像格式)进行订阅,就可以在图像窗口中进行显示。
RGB模式:
RGB_To_Depth模式:
至此,全部配置圆满完成!
6.相关问题解决:
6.1 roslaunch出现错误
[ERROR] [1627390501.011460316]: Failed to open K4A device at index 0
[ERROR] [1627390501.011490280]: Failed to open a K4A device. Cannot continue.
解决办法:
cd ~/Azure-Kinect-Sensor-SDK
sudo cp scripts/99-k4a.rules /etc/udev/rules.d/.
按照以上命令修改SDK权限即可
6.2 catkin_make编译报错
CMakeFiles/azure_kinect_ros_driver_node.dir/src/k4a_ros_device.cpp.o:在函数‘cv::Mat::Mat(int, int, int, void*, unsigned long)’中:
k4a_ros_device.cpp:(.text._ZN2cv3MatC2EiiiPvm[_ZN2cv3MatC5EiiiPvm]+0x296):对‘cv::Mat::updateContinuityFlag()’未定义的引用
collect2: error: ld returned 1 exit status
解决办法:
在CmakeList.txt文件中添加OpenCV的依赖
路径:/catkin_ws/src/Azure_Kinect_ROS_Driver/CMakeLists.txt
在其中添加:
find_package(OpenCV REQUIRED)
target_link_libraries(${PROJECT_NAME}_node
${K4A_LIBS}
${OpenCV_LIBRARIES} # add
${catkin_LIBRARIES}
)
target_link_libraries(${PROJECT_NAME}_nodelet
${K4A_LIBS}
${OpenCV_LIBRARIES} #add
${catkin_LIBRARIES}
)
修改后的文件内容如下,可对照进行修改:
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License.
cmake_minimum_required(VERSION 3.5)
project(azure_kinect_ros_driver LANGUAGES C CXX)
list(INSERT CMAKE_MODULE_PATH 0 ${CMAKE_CURRENT_LIST_DIR}/cmake)
## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
sensor_msgs
image_transport
nodelet
tf2
tf2_ros
tf2_geometry_msgs
geometry_msgs
nodelet
cv_bridge
)
find_package(OpenCV REQUIRED)
###################################
## catkin specific configuration ##
###################################
## The catkin_package macro generates cmake config files for your package
## Declare things to be passed to dependent projects
## INCLUDE_DIRS: uncomment this if your package contains header files
## LIBRARIES: libraries you create in this project that dependent projects also need
## CATKIN_DEPENDS: catkin_packages dependent projects also need
## DEPENDS: system dependencies of this project that dependent projects also need
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES k4a_ros_bridge
# CATKIN_DEPENDS roscpp std_msgs
# DEPENDS system_lib
)
###########
## Build ##
###########
## Declare a C++ executable
## With catkin_make all packages are built within a single CMake context
## The recommended prefix ensures that target names across packages don't collide
add_executable(${PROJECT_NAME}_node
src/k4a_ros_bridge_node.cpp
src/k4a_ros_device.cpp
src/k4a_ros_device_params.cpp
src/k4a_calibration_transform_data.cpp
)
target_compile_features(${PROJECT_NAME}_node PUBLIC cxx_std_11)
add_library(${PROJECT_NAME}_nodelet
src/k4a_ros_bridge_nodelet.cpp
src/k4a_ros_device.cpp
src/k4a_ros_device_params.cpp
src/k4a_calibration_transform_data.cpp
)
target_compile_features(${PROJECT_NAME}_nodelet PUBLIC cxx_std_11)
## Rename C++ executable without prefix
## The above recommended prefix causes long target names, the following renames the
## target back to the shorter version for ease of user use
## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node"
set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "")
############################
#### AZURE KINECT SDK ######
############################
message("Finding K4A SDK binaries")
# Disable cached locations for K4A SDK binaries.
# Do this to force the search logic to happen correctly.
# If we don't disable these cached directories, we
# won't be able to tell the difference between the ext/sdk location
# and the system installed version on linux. Since we have to treat these
# differently (one needs install, one doesn't) we must disable the cache
# so that find_package(k4a) will fail in all cases if not installed via the .deb.
unset(k4a_DIR CACHE)
# Force running the Findk4a.cmake module
find_package(k4a 1.3.0 QUIET MODULE REQUIRED)
set(K4A_LIBS k4a::k4a;k4a::k4arecord)
# Try to find and enable the body tracking SDK
find_package(k4abt 1.0.0 QUIET MODULE)
if (k4abt_FOUND)
list(APPEND K4A_LIBS k4abt::k4abt)
message(STATUS "Body Tracking SDK found: compiling support for Body Tracking")
target_compile_definitions(${PROJECT_NAME}_node PUBLIC K4A_BODY_TRACKING)
target_compile_definitions(${PROJECT_NAME}_nodelet PUBLIC K4A_BODY_TRACKING)
else()
message("!!! Body Tracking SDK not found: body tracking features will not be available !!!")
endif()
# This reads the K4A_LIBS and K4A_INSTALL_REQUIRED variables and decides how to install
# the various shared objects / DLLs
include(Installk4a)
##################################
###### END AZURE KINECT SDK ######
##################################
include_directories(
${catkin_INCLUDE_DIRS}
"include"
)
target_link_libraries(${PROJECT_NAME}_node
${K4A_LIBS}
${OpenCV_LIBRARIES} # add
${catkin_LIBRARIES}
)
target_link_libraries(${PROJECT_NAME}_nodelet
${K4A_LIBS}
${OpenCV_LIBRARIES} #add
${catkin_LIBRARIES}
)
#############
## Install ##
#############
# all install targets should use catkin DESTINATION variables
# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html
## Mark executables and/or libraries for installation
install(TARGETS ${PROJECT_NAME}_node
ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
install(TARGETS ${PROJECT_NAME}_nodelet
ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION}
)
## Mark other files for installation (e.g. launch and bag files, etc.)
install(
DIRECTORY
launch
urdf
DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
)
install(FILES
nodelet_plugins.xml
DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
)