最近学习ROS,顺手翻译一下官网的Tutorials. 水平有限,错误之处欢迎交流。
安装完Ubuntu16.04还有ROS之后,这里注意Ubuntu必须更新到最新版本才能正常安装,在这吃了血亏了。弄好之后初始化还有配置下环境就可以开始使用了。
第一件事就是用catkin(不用管这个是啥之后就知道了,其实就是一个ROS原生Build System)创建一个ROS_WorkSpace:
$ mkdir -p ~/catkin_ws/src $ cd ~/catkin_ws/src $ catkin_init_workspace刚创建好得WorkSpace虽然是空的(src文件夹里只有CMakeLists.txt),但是一样能够build:
$ cd ~/catkin_ws/ $ catkin_make现在看devel文件夹,里面有一些setup.*sh文件,为了能够从配置环境获取任意可以加载到WorkSpace的文件,要获取新的Setup.*sh文件:
$ source devel/setup.bash为了确保setup脚本文件能够加载进WorkSpace,必须让环境变量ROS_PACKAGE_PATH包含你的工作路径:
$ echo $ROS_PACKAGE_PATH /home/youruser/catkin_ws/src:/opt/ros/kinetic/share在创建之前,我们必须要知道一个工具包里面必须包含什么: 1. 必须包含一个pacakage.xml文件,这个文件提供了工具包的元信息 2. 必须包含一个 CMakeLists.txt文件 3. 还有一条值得注意的原则:每个文件夹至多只有一个package
package.xml其实就是package manifest(工具包清单),是一个XML文件,其中必定包含catkin能够调用得所有工具包的路径,还包括了工具包的各种属性(例如名字,版本号,作者,维护者,依赖项)也是过去rosbuild的遗物。
CMakeLists.txt作为一个CMake Build System的输入,而这个CMake Build System则是用来编译工具包的。这个文件描述了怎样编译和编译之后装在哪。
那么根据上面三条原则工具包在工作空间的存在形式应该就是如下形式:
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那么接下来我们就可以创建一个package了:
$ cd ~/catkin_ws/src $ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp这里catkin_create_pkg命令的用法如下:
$ catkin_create_pkg <package_name> [depend1] [depend2] [depend3]package_name就是工具包名,[depend1…n]就是依赖项。 现在我们就可以编译这个package了:
$ cd ~/catkin_ws $ catkin_make为了将WorkSpace加入到ROS环境中去,我们需要获取生成的安装文件:
$ . ~/catkin_ws/devel/setup.bash如果不想每次都输入获取命令,我们可以将绝对路径写入.bashrc文件,这样就不用每次手动获取:
sudo echo source /home/youruser/catkin_ws/devel/setup.bash >> .bashrc我们把依赖分为两类:第一依赖(直接依赖)和间接依赖。学习前期我们见到得依赖项比较少,第一依赖项可以通过命令来查看:
$ rospack depends1 <package_name> 返回如下: std_msgs rospy roscpp我们说过package.xml里面有package的各种属性,那么我们就可以通过以下命令来查看:
$ roscd beginner_tutorials $ cat package.xml 返回如下: <package> ... <buildtool_depend>catkin</buildtool_depend> <build_depend>roscpp</build_depend> <build_depend>rospy</build_depend> <build_depend>std_msgs</build_depend> ... </package>许多第一依赖项他还有自己的依赖项,这种依赖项与我们的package的关系就是间接依赖间接依赖,间接依赖项仍然可以通过这条命令来查看:
$ rospack depends1 rospy 返回如下: genpy rosgraph rosgraph_msgs roslib std_msgs 特别的我们有一条命令可以查看所有嵌套的依赖项,不论是直接或者间接: $ rospack depends <package_name> 返回如下: cpp_common rostime roscpp_traits roscpp_serialization genmsg genpy message_runtime rosconsole std_msgs rosgraph_msgs xmlrpcpp roscpp rosgraph catkin rospack roslib rospy这部分我们要仔细查看每一个catkin_create_pkg生成的文件和描述型文件,我们一行一行的学习并且来自定义我们自己的package. 首先我们来看package.xml,我们说过这个文件每次生成都在package中:
更新描述标签(code前面是package.xml的行号) 5 <description>The beginner_tutorials package</description>这部分可以随意改成自己想要的,一般默认是用一个单句描述整个package.
维护者标签 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 --> 15 <license>TODO</license> 依赖项标签 这里对几类依赖项解释一下: buildtool_depend是指工具包的编译系统,一般就指定是catkin; build_depend是指编译的时候需要的其他工具包; run_depend是指跑代码的工具包; test_depend是指测试时候需要的工具包,绝不能和上面三项重复。 27 <!-- The *_depend tags are used to specify dependencies --> 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 run_depend for packages you need at runtime: --> 35 <!-- <run_depend>python-yaml</run_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> 42 <run_depend>roscpp</run_depend> 43 <run_depend>rospy</run_depend> 44 <run_depend>std_msgs</run_depend> 最终的package.xml文件应该是如下这般,没有注释非常简洁 1 <?xml version="1.0"?> 2 <package> 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 <run_depend>roscpp</run_depend> 19 <run_depend>rospy</run_depend> 20 <run_depend>std_msgs</run_depend> 21 22 </package>到此我们已经有了工作空间和自己的工具包,接下来我们就去工作空间看看
$ cd ~/catkin_ws/src $ ls 返回如下: package_name CMakeLists.txt我们可以看到自己的package已经在WorkSpace下了,那么我们直接在WorkSpace里编译吧,这里值得注意的是catkin_make命令必须在工作空间的根目录里执行:
$ cd .. $ catkin_make 返回与下面类似: Base path: /home/user/catkin_ws Source space: /home/user/catkin_ws/src Build space: /home/user/catkin_ws/build Devel space: /home/user/catkin_ws/devel Install space: /home/user/catkin_ws/install #### #### Running command: "cmake /home/user/catkin_ws/src -DCATKIN_DEVEL_PREFIX=/home/user/catkin_ws/devel -DCMAKE_INSTALL_PREFIX=/home/user/catkin_ws/install" in "/home/user/catkin_ws/build" #### -- The C compiler identification is GNU 4.2.1 -- The CXX compiler identification is Clang 4.0.0 -- Checking whether C compiler has -isysroot -- Checking whether C compiler has -isysroot - yes -- Checking whether C compiler supports OSX deployment target flag -- Checking whether C compiler supports OSX deployment target flag - yes -- Check for working C compiler: /usr/bin/gcc -- Check for working C compiler: /usr/bin/gcc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - 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 -- Using CATKIN_DEVEL_PREFIX: /tmp/catkin_ws/devel -- Using CMAKE_PREFIX_PATH: /opt/ros/kinetic -- This workspace overlays: /opt/ros/kinetic -- Found PythonInterp: /usr/bin/python (found version "2.7.1") -- Found PY_em: /usr/lib/python2.7/dist-packages/em.pyc -- Found gtest: gtests will be built -- catkin 0.5.51 -- BUILD_SHARED_LIBS is on -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- ~~ traversing packages in topological order: -- ~~ - beginner_tutorials -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -- +++ add_subdirectory(beginner_tutorials) -- Configuring done -- Generating done -- Build files have been written to: /home/user/catkin_ws/build #### #### Running command: "make -j4" in "/home/user/catkin_ws/build" ####这个时候我们再查看工作空间,就会发现多了devel和build文件夹:
$ ls 返回如下: build devel src这里的build文件夹就是Build Space,Cmake编译package的地方,里面包含了一些缓存信息和中间文件;而devel文件夹就是Development Space,Cmake编译所需的文件预装在这。