入门脉络主要由几个部分组成,包括:ros简介、ros文件系统、ros通信架构、常用工具、roscpp和rospy。
ROS简介
机器人操作系统(Robot operating system ,ROS)是一个应用于机器人上的基础框架,它把原本松散的零部件耦合在一起,提供通信的架构,近似上ROS是一个中间件。
ros上手简单适合研究,但是商用缺点明显。主要是实时通信性能有限,系统稳定差。
ROS误解
ROS不是一门编程语言,主要代码由C++编写,客户端可以使用python\java等多种语言编写
ROS不仅仅是一个函数库,除了客户端库,还包含中心服务器.
ROS文件系统
认识ROS首先要知道ROS工程的组织架构,了解各个文件的功能和作用,才能高效的开发和编程。
这里面包含catkin编译系统,catkin工作空间结构,package软件包结构,重要的cmakelists.txt、package.xml文件内容。

catkin工作原理:
当在工作空间(必须切换到workspace_base否则编译不会成功)敲下catkin_make指令后,编译器首先在当前工作空间./src下递归查找每一个ROS package.
package 中会有package.xml和CMakeList.txt文件,catkin编译系统依据CMakeList.txt文件,从而生成makefiles(放在./build/).
然后make build目录的makefiles文件,编译链接生成可执行文件放在./devel.
所以说catkin就是将cmake和make指令做了一个封装,从而完成整个编译过程的工具。
catkin工作空间
catkin的工作空间结构,它包含了src、build、devel 三个文件夹主要作用如下:
src/: ROS的catkin软件包(源代码包)
build/: catkin(CMake)的缓存信息和中间文件
devel/: 生成的目标文件(包括头文件,动态链接库,静态链接库,可执行文件等)、环境变量

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232
| gaocancan@ubuntu:~$ mkdir -p catkin_test/src gaocancan@ubuntu:~$ cd catkin_test gaocancan@ubuntu:~/catkin_test$ catkin_make Base path: /home/gaocancan/catkin_test Source space: /home/gaocancan/catkin_test/src Build space: /home/gaocancan/catkin_test/build Devel space: /home/gaocancan/catkin_test/devel Install space: /home/gaocancan/catkin_test/install Creating symlink "/home/gaocancan/catkin_test/src/CMakeLists.txt" pointing to "/opt/ros/kinetic/share/catkin/cmake/toplevel.cmake" #### #### Running command: "cmake /home/gaocancan/catkin_test/src -DCATKIN_DEVEL_PREFIX=/home/gaocancan/catkin_test/devel -DCMAKE_INSTALL_PREFIX=/home/gaocancan/catkin_test/install -G Unix Makefiles" in "/home/gaocancan/catkin_test/build" #### -- The C compiler identification is GNU 5.4.0 -- The CXX compiler identification is GNU 5.4.0 -- Check for working C compiler: /usr/bin/cc -- Check for working C compiler: /usr/bin/cc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Detecting C compile features -- Detecting C compile features - done -- Check for working CXX compiler: /usr/bin/c++ -- Check for working CXX compiler: /usr/bin/c++ -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Detecting CXX compile features -- Detecting CXX compile features - done -- Using CATKIN_DEVEL_PREFIX: /home/gaocancan/catkin_test/devel -- Using CMAKE_PREFIX_PATH: /opt/ros/kinetic -- This workspace overlays: /opt/ros/kinetic -- Found PythonInterp: /usr/bin/python2 (found suitable version "2.7.12", minimum required is "2") -- Using PYTHON_EXECUTABLE: /usr/bin/python2 -- Using Debian Python package layout -- Using empy: /usr/bin/empy -- Using CATKIN_ENABLE_TESTING: ON -- Call enable_testing() -- Using CATKIN_TEST_RESULTS_DIR: /home/gaocancan/catkin_test/build/test_results -- Found gtest sources under '/usr/src/gmock': gtests will be built -- Found gmock sources under '/usr/src/gmock': gmock will be built -- Found PythonInterp: /usr/bin/python2 (found version "2.7.12") -- Looking for pthread.h -- Looking for pthread.h - found -- Looking for pthread_create -- Looking for pthread_create - not found -- Looking for pthread_create in pthreads -- Looking for pthread_create in pthreads - not found -- Looking for pthread_create in pthread -- Looking for pthread_create in pthread - found -- Found Threads: TRUE -- Using Python nosetests: /usr/bin/nosetests-2.7 -- catkin 0.7.29 -- BUILD_SHARED_LIBS is on -- BUILD_SHARED_LIBS is on -- Configuring done -- Generating done -- Build files have been written to: /home/gaocancan/catkin_test/build #### #### Running command: "make -j4 -l4" in "/home/gaocancan/catkin_test/build" #### gaocancan@ubuntu:~/catkin_test$ tree . ├── build │ ├── atomic_configure │ │ ├── env.sh │ │ ├── local_setup.bash │ │ ├── local_setup.sh │ │ ├── local_setup.zsh │ │ ├── setup.bash │ │ ├── setup.sh │ │ ├── _setup_util.py │ │ └── setup.zsh │ ├── catkin │ │ └── catkin_generated │ │ └── version │ │ └── package.cmake │ ├── catkin_generated │ │ ├── env_cached.sh │ │ ├── generate_cached_setup.py │ │ ├── installspace │ │ │ ├── env.sh │ │ │ ├── local_setup.bash │ │ │ ├── local_setup.sh │ │ │ ├── local_setup.zsh │ │ │ ├── setup.bash │ │ │ ├── setup.sh │ │ │ ├── _setup_util.py │ │ │ └── setup.zsh │ │ ├── order_packages.cmake │ │ ├── order_packages.py │ │ ├── setup_cached.sh │ │ └── stamps │ │ └── Project │ │ ├── interrogate_setup_dot_py.py.stamp │ │ ├── order_packages.cmake.em.stamp │ │ ├── package.xml.stamp │ │ └── _setup_util.py.stamp │ ├── CATKIN_IGNORE │ ├── catkin_make.cache │ ├── CMakeCache.txt │ ├── CMakeFiles │ │ ├── 3.5.1 │ │ │ ├── CMakeCCompiler.cmake │ │ │ ├── CMakeCXXCompiler.cmake │ │ │ ├── CMakeDetermineCompilerABI_C.bin │ │ │ ├── CMakeDetermineCompilerABI_CXX.bin │ │ │ ├── CMakeSystem.cmake │ │ │ ├── CompilerIdC │ │ │ │ ├── a.out │ │ │ │ └── CMakeCCompilerId.c │ │ │ └── CompilerIdCXX │ │ │ ├── a.out │ │ │ └── CMakeCXXCompilerId.cpp │ │ ├── clean_test_results.dir │ │ │ ├── build.make │ │ │ ├── cmake_clean.cmake │ │ │ ├── DependInfo.cmake │ │ │ └── progress.make │ │ ├── cmake.check_cache │ │ ├── CMakeDirectoryInformation.cmake │ │ ├── CMakeError.log │ │ ├── CMakeOutput.log │ │ ├── CMakeRuleHashes.txt │ │ ├── CMakeTmp │ │ ├── download_extra_data.dir │ │ │ ├── build.make │ │ │ ├── cmake_clean.cmake │ │ │ ├── DependInfo.cmake │ │ │ └── progress.make │ │ ├── doxygen.dir │ │ │ ├── build.make │ │ │ ├── cmake_clean.cmake │ │ │ ├── DependInfo.cmake │ │ │ └── progress.make │ │ ├── feature_tests.bin │ │ ├── feature_tests.c │ │ ├── feature_tests.cxx │ │ ├── Makefile2 │ │ ├── Makefile.cmake │ │ ├── progress.marks │ │ ├── run_tests.dir │ │ │ ├── build.make │ │ │ ├── cmake_clean.cmake │ │ │ ├── DependInfo.cmake │ │ │ └── progress.make │ │ ├── TargetDirectories.txt │ │ └── tests.dir │ │ ├── build.make │ │ ├── cmake_clean.cmake │ │ ├── DependInfo.cmake │ │ └── progress.make │ ├── cmake_install.cmake │ ├── CTestConfiguration.ini │ ├── CTestCustom.cmake │ ├── CTestTestfile.cmake │ ├── gtest │ │ ├── CMakeFiles │ │ │ ├── CMakeDirectoryInformation.cmake │ │ │ ├── gmock.dir │ │ │ │ ├── build.make │ │ │ │ ├── cmake_clean.cmake │ │ │ │ ├── DependInfo.cmake │ │ │ │ ├── depend.make │ │ │ │ ├── flags.make │ │ │ │ ├── link.txt │ │ │ │ ├── progress.make │ │ │ │ ├── src │ │ │ │ └── usr │ │ │ │ └── src │ │ │ │ └── gtest │ │ │ │ └── src │ │ │ ├── gmock_main.dir │ │ │ │ ├── build.make │ │ │ │ ├── cmake_clean.cmake │ │ │ │ ├── DependInfo.cmake │ │ │ │ ├── depend.make │ │ │ │ ├── flags.make │ │ │ │ ├── link.txt │ │ │ │ ├── progress.make │ │ │ │ ├── src │ │ │ │ └── usr │ │ │ │ └── src │ │ │ │ └── gtest │ │ │ │ └── src │ │ │ └── progress.marks │ │ ├── cmake_install.cmake │ │ ├── CTestTestfile.cmake │ │ ├── gtest │ │ │ ├── CMakeFiles │ │ │ │ ├── CMakeDirectoryInformation.cmake │ │ │ │ ├── gtest.dir │ │ │ │ │ ├── build.make │ │ │ │ │ ├── cmake_clean.cmake │ │ │ │ │ ├── DependInfo.cmake │ │ │ │ │ ├── depend.make │ │ │ │ │ ├── flags.make │ │ │ │ │ ├── link.txt │ │ │ │ │ ├── progress.make │ │ │ │ │ └── src │ │ │ │ ├── gtest_main.dir │ │ │ │ │ ├── build.make │ │ │ │ │ ├── cmake_clean.cmake │ │ │ │ │ ├── DependInfo.cmake │ │ │ │ │ ├── depend.make │ │ │ │ │ ├── flags.make │ │ │ │ │ ├── link.txt │ │ │ │ │ ├── progress.make │ │ │ │ │ └── src │ │ │ │ └── progress.marks │ │ │ ├── cmake_install.cmake │ │ │ ├── CTestTestfile.cmake │ │ │ └── Makefile │ │ └── Makefile │ ├── Makefile │ └── test_results ├── devel │ ├── cmake.lock │ ├── env.sh │ ├── lib │ ├── local_setup.bash │ ├── local_setup.sh │ ├── local_setup.zsh │ ├── setup.bash │ ├── setup.sh │ ├── _setup_util.py │ └── setup.zsh └── src └── CMakeLists.txt -> /opt/ros/kinetic/share/catkin/cmake/toplevel.cmake
43 directories, 123 files
|
package 软件包
package是catkin编译的最小单元,我们调用catkin_make编译的对象就是一个个package,所以package也是ROS源码存放的地方。
一个package常见的结构有:
1 2 3 4 5 6 7 8 9 10
| ├── CMakeLists.txt #package的编译规则(必须) ├── package.xml #package的描述信息(必须) ├── src/ #源代码文件 ├── include/ #C++头文件 ├── scripts/ #可执行脚本 ├── msg/ #自定义消息 ├── srv/ #自定义服务 ├── models/ #3D模型文件 ├── urdf/ #urdf文件 ├── launch/ #launch文件
|
通常ROS文件组织都是按照以上的形式,这是约定俗成的命名习惯,建议遵守。以上路径只有 CMakeLists.txt 和 package.xml 是必须的,其余路径根据软件包是否需要来决定。
package创建
创建package需要工作空间的src目录下,使用catkin_create_pkg package depends
其中package 是包名,depends是依赖的包名(如roscpp、rospy、std_msgs)执行命令后会自动完成软件包的初始化,并将依赖包按格式写入CMakeList.txt、package.xml.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| gaocancan@ubuntu:~/catkin_test/src$ catkin_create_pkg catkin_test_pkg roscpp rospy std_msg Created file catkin_test_pkg/CMakeLists.txt Created file catkin_test_pkg/package.xml Created folder catkin_test_pkg/include/catkin_test_pkg Created folder catkin_test_pkg/src Successfully created files in /home/gaocancan/catkin_test/src/catkin_test_pkg. Please adjust the values in package.xml. gaocancan@ubuntu:~/catkin_test/src$ tree . ├── catkin_test_pkg │ ├── CMakeLists.txt │ ├── include │ │ └── catkin_test_pkg │ ├── package.xml │ └── src └── CMakeLists.txt -> /opt/ros/kinetic/share/catkin/cmake/toplevel.cmake
4 directories, 3 files gaocancan@ubuntu:~/catkin_test/src$
|
常用ros 命令:
如果不指定 [package]默认为当前目录
rospack list #列出本机所有package
rospack find [package] #定位某个package
rospack profile [package] #刷新所有package位置记录
rospack depends [package] #显示package依赖包
roscd [package] #打开package
rosls [package] #相当于ls
rosdep check [package] #检查package依赖是否满足
rosdep install [package] #安装package的依赖
rosdep db #生成和显示依赖数据库
rosdep init #初始化/etc/ros/rosdep中的源
rosdep keys 检查package的依赖是否满足
rosdep update 更新本地的rosdep数据库
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| cmake_minimum_required() #CMake的版本号 project() #项目名称 find_package() #找到编译需要的其他CMake/Catkin package catkin_python_setup() #catkin新加宏,打开catkin的Python Module的支持 add_message_files() #catkin新加宏,添加自定义Message/Service/Action文件 add_service_files() add_action_files() generate_message() #catkin新加宏,生成不同语言版本的msg/srv/action接口 --重要 catkin_package() #catkin新加宏,生成当前package的cmake配置,供依赖本包的其他软件包调用 --重要 add_library() #生成库 add_executable() #生成可执行二进制文件 add_dependencies() #定义目标文件依赖于其他目标文件,确保其他目标已被构建 target_link_libraries() #链接 catkin_add_gtest() #catkin新加宏,生成测试 install() #安装至本机
|
语法推荐:https://github.com/Akagi201/learning-cmake/blob/master/docs/cmake-practice.pdf 。作者写的很直白,掌握CMake语法可以加深理解ROS工程
package.xml 包含了package 的名称、版本号、内容、编译依赖、运行依赖等信息,实际上rospack find 、rosdep命令也是读取该文件。
package.xml写法:
package.xml有两个版本,目前主流版本都支持。
版本一:
1 2 3 4 5 6 7 8 9
| <pacakge> 根标记文件 <name> 包名 <version> 版本号 <description> 内容描述 <maintainer> 维护者 <license> 软件许可证 <buildtool_depend> 编译构建工具,通常为catkin --重要 <build_depend> 编译依赖项,与Catkin中的 --总要 <run_depend> 运行依赖项 --重要
|
版本二:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <pacakge> 根标记文件 <name> 包名 <version> 版本号 <description> 内容描述 <maintainer> 维护者 <license> 软件许可证 <buildtool_depend> 编译构建工具,通常为catkin #用depend来整合build_depend和run_depend <depend> 指定依赖项为编译、导出、运行需要的依赖,最常用 --重要 <build_depend> 编译依赖项 --重要 <build_export_depend> 导出依赖项 --重要 #用depend来整合build_depend和run_depend <exec_depend> 运行依赖项 --重要 <test_depend> 测试用例依赖项 <doc_depend> 文档依赖项
|
入门脉络主要由几个部分组成,包括:ros简介、ros文件系统、ros通信架构、常用工具、roscpp和rospy。