一、ROS导航
1.rospack = ros + pack(age),通过cpp文件找功能包。
例子:
$ rospack find roscpp
/opt/ros/kinetic/share/roscpp
2.roscd = ros + cd,通过节点或包名,可以直接进入到所在的功能包目录
$ roscd roscpp/cmake
$ pwd
YOUR_INSTALL_PATH/share/roscpp/cmake
3.roscd log
运行日志,没有运行过,返回文件不存在
4.rosls = ros + ls,查看功能包文件。
显示learning_communication功能包下的文件
$ rosls learning_communication
action CMakeLists.txt include msg package.xml src srv
###二、创建工作空间和ROS包
1.工作空间结构
workspace_folder/
bulid/
devel/
src/
CMakeLists.txt
package_1/
CMakeLists.txt
package.xml
…
package_n/
CMakeLists.txt
package.xml
ROS包简单结构
my_package/
CMakeLists.txt
package.xml
2.创建工作环境(创建名为catkin_ws的工作空间)
mkdir -p ~/catkin_ws/src
cd catkin_ws/src
catkin_init_workspace
cd ..
catkin_make
编译结束后会出现两个文件夹,build文件夹是构建空间的默认位置,并且调用cmake和make来配置和构建软件包。devel文件夹是devel空间的默认位置,这是可执行文件和库在安装软件包之前的位置。
$ ls
build
devel
src
3.创建功能包(依赖std_msgs rospy roscpp,创建好后文件里有package.xml和CMakeLists.txt)
//创建文件夹
$ mkdir ~/catkin_ws/src
//创建beginner_tutorials功能包,
$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
4.创建工作空间和安装文件
添加自己创建的bash文件 source ~/catkin_ws/devel/setup.bash,其他终端也可以用自己新创建的工作空间
vi ~/.bashrc
source ~/catkin_ws/devel/setup.bash
//添加到最后一行
查看自己的工作空间是否添加到ROS功能包路径里
echo $ROS_PACKAGE_PATH
4.查看依赖(选看)
显示功能包依赖,运行前保证已经添加到ROS功能包路径
$ rospack depends1 beginner_tutorials
roscpp
rospy
std_msgs
依赖信息储存在package.xml中
$ roscd beginner_tutorials
$ cat package.xml
<package format="2">
...
<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_depend>rospy</build_depend>
<build_depend>std_msgs</build_depend>
...
</package>
查看rospy的依赖(间接依赖)
$ rospack depends1 rospy
genpy
roscpp
rosgraph
rosgraph_msgs
roslib
std_msgs
显示所有的间接依赖
$ rospack depends beginner_tutorials
cpp_common
rostime
roscpp_traits
roscpp_serialization
catkin
genmsg
genpy
message_runtime
gencpp
geneus
gennodejs
genlisp
message_generation
rosbuild
rosconsole
std_msgs
rosgraph_msgs
xmlrpcpp
roscpp
rosgraph
ros_environment
rospack
roslib
rospy
6.自定义包(一行一行解释package.xml文件)
第一个数字是行号
5 <description>The beginner_tutorials package</description>
//描述标签,说明功能包的名字版本
7 <!-- One maintainer tag required, multiple allowed, one person per tag --> //维护者标签,至少要有一个维护着的联系方式要有
8 <!-- Example: -->
9 <!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> -->
10 <maintainer email="user@todo.todo">user</maintainer>
12 <!-- One license tag required, multiple allowed, one license per tag --> //许可证标签,您应该选择许可证并在此处填写。
13 <!-- Commonly used license strings: -->
14 <!-- BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 -->一些常见的开源许可证是BSD,MIT,Boost软件许可证,GPLv2,GPLv3,LGPLv2.1和LGPLv3。您可以在开源倡议中了解其中的几个。对于本教程,我们将使用BSD许可证,因为其余的核心ROS组件已经使用它:
15 <license>TODO</license>
// 对于本教程,我们将使用BSD许可证,因为其余的核心ROS组件已经使用它
27 <!-- The *_depend tags are used to specify dependencies -->
// 依赖标签,下一组标记描述了包的依赖关系。
依赖项分为
build_depend,buildtool_depend,exec_depend,test_depend。
有关这些标记的更详细说明,请参阅有关Catkin依赖关系的文档。
由于我们将std_msgs,roscpp和rospy作为catkin_create_pkg的参数传递,因此依赖关系将如下所示:
28 <!-- Dependencies can be catkin packages or system dependencies -->
29 <!-- Examples: -->
30 <!-- Use build_depend for packages you need at compile time: -->
31 <!-- <build_depend>genmsg</build_depend> -->
32 <!-- Use buildtool_depend for build tool packages: -->
33 <!-- <buildtool_depend>catkin</buildtool_depend> -->
34 <!-- Use exec_depend for packages you need at runtime: -->
35 <!-- <exec_depend>python-yaml</exec_depend> -->
36 <!-- Use test_depend for packages you need only for testing: -->
37 <!-- <test_depend>gtest</test_depend> -->
38 <buildtool_depend>catkin</buildtool_depend>
39 <build_depend>roscpp</build_depend>
40 <build_depend>rospy</build_depend>
41 <build_depend>std_msgs</build_depend>
最终的packageXML文件
1 <?xml version="1.0"?>
2 <package format="2">
3 <name>beginner_tutorials</name>
4 <version>0.1.0</version>
5 <description>The beginner_tutorials package</description>
6
7 <maintainer email="you@yourdomain.tld">Your Name</maintainer>
8 <license>BSD</license>
9 <url type="website">http://wiki.ros.org/beginner_tutorials</url>
10 <author email="you@yourdomain.tld">Jane Doe</author>
11
12 <buildtool_depend>catkin</buildtool_depend>
13
14 <build_depend>roscpp</build_depend>
15 <build_depend>rospy</build_depend>
16 <build_depend>std_msgs</build_depend>
17
18 <exec_depend>roscpp</exec_depend>
19 <exec_depend>rospy</exec_depend>
20 <exec_depend>std_msgs</exec_depend>
21
22 </package>
四.catkin_make解读
CmakeLists.txt,大家应该比较熟悉了,就是我们借助Cmake自动帮我们按照规则生成的makefile文件,来完成工程的编译、链接工作。
catkin_make是将cmake与make的编译方式做了一个封装的指令工具, 规范了工作路径与生成文件路径,而且在新建个工作空间时就帮我们创建了一个顶层的CMakeLists.txt文件,它会递归的寻找到当前工作空间下的所有软件包内的CMakeLists.txt依次来编译每一个软件包。(src的每个包里都有CmakeLists.txt的)
1.cmake介绍
CMake通常如何工作的例子,每个CMake项目运行此过程。
# In a CMake project
$ mkdir build
$ cd build
$ cmake ..
$ make
$ make install # (optionally)
2.catkin_make
下面的命令将构建在src文件夹中找到的任何catkin项目。
# In a catkin workspace
$ catkin_make
$ catkin_make install # (optionally)
如果源代码位于不同的位置,比如my_src,那么可以像这样调用catkin_make:
# In a catkin workspace
$ catkin_make --source my_src
$ catkin_make install --source my_src # (optionally)
catkin_make的实际工作过程:
$ cd ~/catkin_ws
$ catkin_make
以下是catkin_make具体的工作
$ cd ~/catkin_ws
$ cd src
$ catkin_init_workspace
$ cd ..
$ mkdir build
$ cd build
$ cmake ../src
$ make
catkin_make编译特定的包
$ catkin_make -DCATKIN_WHITELIST_PACKAGES="package1;package2" //编译特定的包
$ catkin_make -DCATKIN_WHITELIST_PACKAGES="" //编译所有的包