在看工程代码时,顺便对package.xml和CMakeLists.txt文件代码结构进行了探索与知识巩固,下面逐一进行展示:
首先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"> <!--在声明pacakge时指定format3, 为新版格式-->
<name>ars_40X</name> <!-- 包的名称-->
<version>0.0.0</version> <!-- 包的版本号(需要3个点分隔的整数)-->
<description>The ars_40X package contains a ROS driver for the Continental radar ARS_404 / ARS_408.</description> <!--包内容的描述-->
<maintainer email="org@gmail.com">org</maintainer> <!-- 维护包的人员的名称-->
<license>TODO: License declaration</license> <!--发布代码的软件许可证(例如GPL,BSD,ASL) -->
<buildtool_depend>catkin</buildtool_depend> <!-- 指定编译此功能包的编译系统工具-->
<build_depend>message_generation</build_depend> <!-- ,编译依赖项,编译时需要依赖的其它package,适用于静态库-->
<build_export_depend>message_runtime</build_export_depend> <!-- 导出依赖项-->
<depend>costmap_converter</depend>
<depend>geometry_msgs</depend>
<depend>nav_msgs</depend>
<depend>roscpp</depend>
<depend>socket_can</depend>
<depend>std_msgs</depend>
<depend>std_srvs</depend> <!-- 指定依赖项为编译、 导出、 运行需要的依赖-->
<exec_depend>message_runtime</exec_depend> <!-- 运行依赖项-->
<export> <!-- 用于添加额外的信息-->
<build_type>catkin</build_type>
</export>
</package>
CMakeLists.txt文件 :
cmake_minimum_required(VERSION 3.5) # CMake版本
project(ars_40X) # 工程名
# 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(catkin REQUIRED
COMPONENTS
roscpp
std_msgs
geometry_msgs
message_generation # 加载catkin中的变量,同时添加roscpp、std_msgs、geometry_msgs、message_generation的依赖
)
find_package(nav_msgs REQUIRED)
find_package(socket_can REQUIRED)
find_package(std_srvs REQUIRED)
find_package(Eigen3 REQUIRED) # 加载外部变量
add_message_files(DIRECTORY msg
FILES
Cluster.msg
ClusterList.msg
Object.msg
ObjectList.msg
RadarStatus.msg #添加自定义消息文件
)
add_service_files(
FILES
MaxDistance.srv
OutputType.srv
RadarPower.srv
RCSThreshold.srv
SensorID.srv
SortIndex.srv #添加自定义服务文件
)
generate_messages(DEPENDENCIES std_msgs geometry_msgs) #添加msg文件生成源代码文件时所需的依赖项
catkin_package( #catkin_package()是catkin提供的CMake宏,用于为catkin提供构建、生成pkg-config和CMake文件所需要的信息。
INCLUDE_DIRS # 声明给其它package的include路径
include
LIBRARIES # 声明给其它package的库
${PROJECT_NAME}_can
${PROJECT_NAME}_msg
CATKIN_DEPENDS #本包依赖的catkin package
message_runtime
roscpp
socket_can
)
include_directories(${catkin_INCLUDE_DIRS})
include_directories(include)
include_directories(${socket_can_INCLUDE_DIRS}) # 添加头文件路径: ${catkin_INCLUDE_DIRS}、include、${socket_can_INCLUDE_DIRS}
add_library(ars_40X_msg
src/cluster_list.cpp
src/motion_input_signals.cpp
src/object_list.cpp
src/radar_cfg.cpp
src/radar_state.cpp
) # 生成库文件,可传入多个源文件
add_library(ars_40X_can
src/ars_40X_can.cpp
) # 生成库文件,可传入多个源文件
target_link_libraries(ars_40X_can ars_40X_msg ${socket_can_LIBRARIES}) #为可执行文件或库添加链接库
add_executable(ars_40X_ros
src/ros/ars_40X_ros.cpp
src/ros/cluster_list_ros.cpp
src/ros/motion_input_signals_ros.cpp
src/ros/object_list_ros.cpp
src/ros/radar_cfg_ros.cpp
src/ros/radar_state_ros.cpp
) #生成可执行文件,可以传入多个源文件
add_dependencies(ars_40X_ros ${catkin_EXPORTED_TARGETS} ${PROJECT_NAME}_generate_messages_cpp) #为目标文件(add_executable(), add_library()中生成的)指定依赖,前提是已经通过find_package()引入了这个package
target_link_libraries(ars_40X_ros ${catkin_LIBRARIES}) #为可执行文件或库添加链接库,${catkin_LIBRARIES} 为ROS基本库
target_link_libraries(ars_40X_ros ars_40X_can ${catkin_LIBRARIES}) #为可执行文件或库添加链接库,${catkin_LIBRARIES} 为ROS基本库
install(
TARGETS
ars_40X_can
ars_40X_msg
ars_40X_ros
ARCHIVE DESTINATION lib/${PROJECT_NAME}
LIBRARY DESTINATION lib/${PROJECT_NAME}
RUNTIME DESTINATION lib/${PROJECT_NAME}
) #默认情况catkin会为每个package在./devel中建立目录,存放目标文件
# 目标文件可以直接通过rosrun和roslaunch访问
# 如需制定其它安装位置,则需通过install()命令
后续再进行补充和完善。