使用catkin创建新的package
Catkin是ROS的一个官方的编译构建系统,使用catkin可以创建和编译ros包。
一个catkin package必须包含以下几个内容:
Package.xml 提供包的属性信息;
CmakeLists.txt 包含相关性样板文件;
拥有自己独立的文件夹(工作空间)。
创建一个文件夹作为工作空间: mkdir ~/catkin_ws
在工作空间中创建一个文件夹存放源文件: mkdir src
当工作空间中包含多个包的时候,形成的文件结构如下:
workspace_folder/ -- WORKSPACE
src/ -- SOURCE SPACE
CMakeLists.txt -- 'Toplevel' CMake file, provided by catkin
package_1/
CMakeLists.txt -- CMakeLists.txt file for package_1
package.xml -- Package manifest for package_1
...
package_n/
CMakeLists.txt -- CMakeLists.txt file for package_n
package.xml -- Package manifest for package_n
创建一个catkin package语法格式:
catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
例如:catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
在工作空间中编译catkin package
$ cd ~/catkin_ws
#有时候单独执行这个无效
$ catkin_make
#或者单独只编译一个包
catkin_make -DCATKIN_WHITELIST_PACKAGES="pack_name"
#这时需要编译全部功能包,
catkin_make -DCATKIN_WHITELIST_PACKAGES=""
#或者在双引号内加入你需要编译的包
catkin_make -DCATKIN_WHITELIST_PACKAGES="package_name1;package_name2"
将工作空间添加至ROS环境
source devel/setup.bash
避免每次打开terminal都要重新source,可以修改~/.bashrc文件,将上述语句添加至最后一行即可。
查看包的直接依赖关系
rospack depends1 package 将得到再创建时添加的直接依赖关系。
查看包的所有依赖关系(包括直接以来和间接依赖)
rospack depends package
详解package.xml 文件
<?xml version="1.0"?>
<package>
<name>beginner_tutorials</name>
<version>0.1.0</version>
<description>The beginner_tutorials package</description>
<maintainer email="you@yourdomain.tld">Your Name</maintainer>
<license>BSD</license>
<url type="website">http://wiki.ros.org/beginner_tutorials</url>
<author email="you@yourdomain.tld">Jane Doe</author>
<buildtool_depend>catkin</buildtool_depend> <build_depend>roscpp</build_depend> <build_depend>rospy</build_depend> <build_depend>std_msgs</build_depend> <run_depend>roscpp</run_depend>
<run_depend>rospy</run_depend> <run_depend>std_msgs</run_depend>
</package>
详解CMakeLists.txt文件(除去注释后的内容)
cmake_minimum_required(VERSION 2.8.3)
project(beginner_tutorials)
## Find catkin and any catkin packages
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs genmsg)
## Declare ROS messages and services
add_message_files(DIRECTORY msg FILES Num.msg)
add_service_files(DIRECTORY srv FILES AddTwoInts.srv)
## Generate added messages and services
generate_messages(DEPENDENCIES std_msgs)
## Declare a catkin package
catkin_package()
这里的catkin_package() 一定要注意
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES ros_bridge
# CATKIN_DEPENDS roscpp rospy std_msgs
# DEPENDS system_lib
)
看起来像是没什么用,里面都被注释掉了,但是如果没有这个,包将不会被添加到catkin环境中去
在包中添加添加新的节点
在catkin_ws/src中新建节点文件夹test_node,并在test_node下新建src文件夹存放源码文件test_node.cpp,内容暂且不管。
修改CMakeList.txt文件,末尾添加
include_directories(include ${catkin_INCLUDE_DIRS})
add_executable(test_node src/test_node.cpp)
target_link_libraries(test_node ${catkin_LIBRARIES})
一般来说find_package,include_directories,target_link_libraries是一起出现的。例如catkin。
同理,我们在添加其他包的时候,也要注意是否需要三个一起添加。
find
调用该节点
rosrun 【packname】 【nodename】
rosrun beginner_tutorials test_node
安装ROS依赖项
rosdep install --from-paths src --ignore-src --rosdistro=${ROS_DISTRO} -y
它的作用是安装ROS依赖项。具体来说,它会从src文件夹中安装所有依赖项,忽略src文件夹中已经存在的依赖项,并且使用kinetic版本的ROS。最后的-y选项表示自动确认安装。
在执行这句话的时候会报一些错误,表示依赖有问题,需要手动执行安装。
有以下几种解决办法:
1. 下载源码到src文件夹,并重新执行
编译出现的错误:
Could not find a package configuration file provided by "×××" with any of the following names
这个也是缺少依赖导致的,下载源码到src文件夹,并重新执行
或者
使用sudo apt-get install ros-noetic-×××(noetic根据具体的ros版本而定)