ROS系统

@[T

详解ROS文件系统

    <div id="blogColumnPayAdvert">
        <div class="column-group">
            <div class="column-group-item column-group0 column-group-item-one">
                <div class="item-l">
                    <a class="item-target" href="https://blog.csdn.net/koupoo/category_1248699.html" target="_blank" title="ROS" data-report-click="{&quot;spm&quot;:&quot;1001.2101.3001.6332&quot;}">
                        <img class="item-target" src="https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64" alt="">
                        <span class="title item-target">
                            <span>
                            <span class="tit">ROS</span>
                                <span class="dec">专栏收录该内容</span>
                            </span>
                        </span>
                    </a>
                </div>
                <div class="item-m">
                    <span>12 篇文章</span>
                    <span>0 订阅</span>
                </div>
                <div class="item-r">
                        <a class="item-target article-column-bt articleColumnFreeBt" data-id="1248699">订阅专栏</a>
                </div>
            </div>
        </div>
    </div>
<article class="baidu_pl">
    <div id="article_content" class="article_content clearfix">
    <link rel="stylesheet" href="https://csdnimg.cn/release/blogv2/dist/mdeditor/css/editerView/ck_htmledit_views-6e43165c0a.css">
            <div id="content_views" class="htmledit_views">
                <h1><a name="t0"></a>&nbsp;</h1> 

本章主要介绍了ROS的工程结构,也就是ROS的文件系统结构。要学会建立一个ROS工程,首先要认识一个ROS工程,了解它们的组织架构,从根本上熟悉ROS项目的组织形式,了解各个文件的功能和作用,才能正确的进行开发和编程。

本章的主要内容有,介绍catkin的编译系统,catkin工作空间的创建和结构,package软件包的创建和结构,介绍CMakeLists.txt文件,package.xml以及其他常见文件。从而系统的梳理了ROS文件空间的结构,对于我们ROS学习和开发有着重要的作用。

01 Catkin编译系统

对于源代码包,我们只有编译才能在系统上运行。而Linux下的编译器有gcc、g++,随着源文件的增加,直接用gcc/g++命令的方式显得效率低下,人们开始用Makefile来进行编译。然而随着工程体量的增大,Makefile也不能满足需求,于是便出现了Cmake工具。CMake是对make工具的生成器,是更高层的工具,它简化了编译构建过程,能够管理大型项目,具有良好的扩展性。对于ROS这样大体量的平台来说,就采用的是CMake,并且ROS对CMake进行了扩展,于是便有了Catkin编译系统。

早期的ROS编译系统是rosbuild,但随着ROS的不断发展,rosbuild逐渐暴露出许多缺点,不能很好满足系统需要。在Groovy版本面世后,Catkin作为rosbuild的替代品被正式投入使用。Catkin操作更加简化且工作效率更高,可移植性更好,而且支持交叉编译和更加合理的功能包分配。目前的ROS同时支持着rosbuild和Catkin两种编译系统,但ROS的核心软件包也已经全部转换为Catkin。rosbuild已经被逐步淘汰,所以建议初学者直接上手Catkin。

本节我们主要来介绍catkin的编译系统。

1.1 Catkin特点

Catkin是基于CMake的编译构建系统,具有以下特点:

  • Catkin沿用了包管理的传统像 find_package()基础结构,pkg-config
  • 扩展了CMake,例如
    • 软件包编译后无需安装就可使用
    • 自动生成find_package()代码,pkg-config文件
    • 解决了多个软件包构建顺序问题

一个Catkin的软件包(package)必须要包括两个文件:

  • package.xml: 包括了package的描述信息
    • name, description, version, maintainer(s), license
    • opt. authors, url's, dependencies, plugins, etc...
  • CMakeLists.txt: 构建package所需的CMake文件
    • 调用Catkin的函数/宏
    • 解析package.xml
    • 找到其他依赖的catkin软件包
    • 将本软件包添加到环境变量

1.2 Catkin工作原理

catkin编译的工作流程如下:

  1. 首先在工作空间catkin_ws/src/下递归的查找其中每一个ROS的package。
  2. package中会有package.xmlCMakeLists.txt文件,Catkin(CMake)编译系统依据CMakeLists.txt文件,从而生成makefiles(放在catkin_ws/build/)。
  3. 然后make刚刚生成的makefiles等文件,编译链接生成可执行文件(放在catkin_ws/devel)。

也就是说,Catkin就是将cmakemake指令做了一个封装从而完成整个编译过程的工具。catkin有比较突出的优点,主要是:

  • 操作更加简单
  • 一次配置,多次使用
  • 跨依赖项目编译

1.3 使用catkin_make进行编译

要用catkin编译一个工程或软件包,只需要用catkin_make指令。一般当我们写完代码,执行一次catkin_make进行编译,调用系统自动完成编译和链接过程,构建生成目标文件。编译的一般性流程如下:


 
 
  1. $ cd ~/catkin_ws #回到工作空间,catkin_make必须在工作空间下执行
  2. $ catkin_make #开始编译
  3. $ source ~/catkin_ws/devel/setup.bash #刷新坏境

注意: catkin编译之前需要回到工作空间目录,catkin_make在其他路径下编译不会成功。编译完成后,如果有新的目标文件产生(原来没有),那么一般紧跟着要source刷新环境,使得系统能够找到刚才编译生成的ROS可执行文件。这个细节比较容易遗漏,致使后面出现可执行文件无法打开等错误。

catkin_make命令也有一些可选参数,例如:


 
 
  1. catkin_make [args]
  2. -h, --help 帮助信息
  3. -C DIRECTORY, --directory DIRECTORY
  4. 工作空间的路径 (默认为 '.')
  5. --source SOURCE src的路径 (默认为'workspace_base/src')
  6. --build BUILD build的路径 (默认为'workspace_base/build')
  7. --use-ninja 用ninja取代make
  8. --use-nmake 用nmake取'make
  9. --force-cmake 强制cmake,即使已经cmake过
  10. --no-color 禁止彩色输出(只对catkin_make和CMake生效)
  11. --pkg PKG [PKG ...] 只对某个PKG进行make
  12. --only-pkg-with-deps ONLY_PKG_WITH_DEPS [ONLY_PKG_WITH_DEPS ...]
  13. 将指定的 package列入白名单CATKIN_WHITELIST_PACKAGES,
  14. 之编译白名单里的 package。该环境变量存在于CMakeCache.txt。
  15. --cmake-args [CMAKE_ARGS [CMAKE_ARGS ...]]
  16. 传给CMake的参数
  17. --make-args [MAKE_ARGS [MAKE_ARGS ...]]
  18. 传给Make的参数
  19. --override-build-tool-check
  20. 用来覆盖由于不同编译工具产生的错误

02 Catkin工作空间

Catkin工作空间是创建、修改、编译catkin软件包的目录。catkin的工作空间,直观的形容就是一个仓库,里面装载着ROS的各种项目工程,便于系统组织管理调用。在可视化图形界面里是一个文件夹。我们自己写的ROS代码通常就放在工作空间中,本节就来介绍catkin工作空间的结构。

2.1 创建catkin工作空间

创建一个 catkin 工作空间:


 
 
  1. $ mkdir -p ~ /catkin_ws/src # 创建了第二层级的文件夹src,这是放ROS软件包的地方
  2. $ cd ~ /catkin_ws/src # 进入工作空间,catkin_make必须在工作空间这个路径上执行
  3. $ catkin_init_workspace # 初始化src目录,生成的CMakeLists.txt为功能包编译配置

2.2 编译工作空间


 
 
  1. $ cd ~/catkin_ws # 回到工作空间,catkin_make必须在工作空间下执行;
  2. $ catkin_make # 开始编译,调用系统自动完成编译和链接过程,构建生成目标文件

注意: catkin编译之前需要回到工作空间目录,catkin_make在其他路径下编译不会成功。

编译完成后,如果有新的目标文件产生(原来没有),那么一般紧跟着要source刷新环境,使得系统能够找到刚才编译生成的ROS可执行文件。这个细节比较容易遗漏,致使后面出现可执行文件无法打开等错误。

catkin_make命令也有一些可选参数,例如:


 
 
  1. catkin_make [args]
  2. -h, --help 帮助信息
  3. -C DIRECTORY, --directory DIRECTORY
  4. 工作空间的路径 (默认为 '.')
  5. --source SOURCE src的路径 (默认为'workspace_base/src')
  6. --build BUILD build的路径 (默认为'workspace_base/build')
  7. --use-ninja 用ninja取代make
  8. --use-nmake 用nmake取'make
  9. --force-cmake 强制cmake,即使已经cmake过
  10. --no-color 禁止彩色输出(只对catkin_make和CMake生效)
  11. --pkg PKG [PKG ...] 只对某个PKG进行make
  12. --only-pkg-with-deps ONLY_PKG_WITH_DEPS [ONLY_PKG_WITH_DEPS ...]
  13. 将指定的 package列入白名单CATKIN_WHITELIST_PACKAGES,
  14. 之编译白名单里的 package。该环境变量存在于CMakeCache.txt。
  15. --cmake-args [CMAKE_ARGS [CMAKE_ARGS ...]]
  16. 传给CMake的参数
  17. --make-args [MAKE_ARGS [MAKE_ARGS ...]]
  18. 传给Make的参数
  19. --override-build-tool-check
  20. 用来覆盖由于不同编译工具产生的错误

注意, 对于 Python 3 用户,在一个空的 catkin 工作空间中第一次运行 catkin_make的命令应为:

 $ catkin_make -DPYTHON_EXECUTABLE=/usr/bin/python3
 
 

这将会配置 catkin_make 使用 Python 3.你可以在随后的构建中只使用 catkin_make

2.3 设置环境变量

另外,如果你查看一下当前目录应该能看到 'build' 和 'devel' 这两个文件夹。在 'devel' 文件夹里面你可以看到几个 setup.*sh 文件。source 这些文件中的任何一个都可以将当前工作空间设置在ROS工作环境的最顶层。接下来首先 source 一下新生成的 setup.*sh 文件:

 $ source devel/setup.bash   # 刷新坏境
 
 

2.4 检查环境变量

要想保证工作空间已配置正确,需确保ROS_PACKAGE_PATH环境变量包含你的工作空间目录,采用以下命令查看:


 
 
  1. $ echo $ROS_PACKAGE_PATH
  2. # 出现 /home/<youruser>/catkin_ws/src:/opt/ros/kinetic/share

到此你的工作环境已经搭建完成。

03 catkin结构介绍

catkin的结构十分清晰,具体的catkin工作空间结构图如下。初看起来catkin工作空间看起来极其复杂,其实不然,catkin工作空间的结构其实非常清晰。

在工作空间下用tree命令,显示文件结构。


 
 
  1. $ cd ~/catkin_ws
  2. $ sudo apt install tree
  3. $ tree

结果为:


 
 
  1. ─ build
  2. │ ├── catkin
  3. │ │ └── catkin_generated
  4. │ │ └── version
  5. │ │ └── package.cmake
  6. │ ├──
  7. ......
  8. │ ├── catkin_make.cache
  9. │ ├── CMakeCache.txt
  10. │ ├── CMakeFiles
  11. │ │ ├──
  12. ......
  13. ├── devel
  14. │ ├── env.sh
  15. │ ├── lib
  16. │ ├── setup.bash
  17. │ ├── setup.sh
  18. │ ├── _setup_util.py
  19. │ └── setup.zsh
  20. └── src
  21. └── CMakeLists.txt -> /opt/ros /kinetic/share /catkin/cmake /toplevel.cmake

通过tree命令可以看到catkin工作空间的结构,它包括了srcbuilddevel三个路径,在有些编译选项下也可能包括其他。但这三个文件夹是catkin编译系统默认的。它们的具体作用如下:

  • src/: ROS的catkin软件包(源代码包)
  • build/: catkin(CMake)的缓存信息和中间文件
  • devel/: 生成的目标文件(包括头文件,动态链接库,静态链接库,可执行文件等)、环境变量

在编译过程中,它们的工作流程如图:

后两个路径由catkin系统自动生成、管理,我们日常的开发一般不会去涉及,而主要用到的是src文件夹,我们写的ROS程序、网上下载的ROS源代码包都存放在这里。

在编译时,catkin编译系统会递归的查找和编译src/下的每一个源代码包。因此你也可以把几个源代码包放到同一个文件夹下,如下图所示:

小结

catkin工作空间基本就是以上的结构,package是catkin工作空间的基本单元,我们在ROS开发时,写好代码,然后catkin_make,系统就会完成所有编译构建的工作。至于更详细的package内容,我们将在下节继续介绍。

04 Package软件包

  • ROS程序只有组成package才能编译;
  • package是ROS源代码存放的地方;
  • ROS的代码无论是C++还是Python都要放到package中,这样才能正常的编译和运行;
  • 一个package可以编译出来多个目标文件(ROS可执行程序、动态静态库、头文件等等)。

4.1 package结构

一个package下常见的文件、路径有:


 
 
  1. ├── CMakeLists.txt #package的编译规则(必须);定义package的包名、依赖、源文件等
  2. ├── package.xml #package的描述信息(必须);描述package的包名、版本号、作者、依赖等
  3. ├── src/ #存放ROS源代码文件;包括C++的源码和(.cpp)以及Python的module(.py)
  4. ├── include/ #存放C++源码对应头文件
  5. ├── scripts/ #可执行脚本;例如shell脚本(.sh)、Python脚本(.py)
  6. ├── msg/ #自定义消息;存放自定义格式的消息(.msg)
  7. ├── srv/ #自定义服务;存放自定义格式的服务(.srv)
  8. ├── models/ #3D模型文件;存放机器人或仿真场景的3D模型(.sda, .stl, .dae等)
  9. ├── urdf/ #urdf文件;存放机器人的模型描述(.urdf或.xacro)
  10. ├── launch/ #launch文件;存放launch文件(.launch或.xml)
  • 其中定义package的是CMakeLists.txtpackage.xml,这两个文件是package中必不可少的。catkin编译系统在编译前,首先就要解析这两个文件。这两个文件就定义了一个package。
  • 通常ROS文件组织都是按照以上的形式,这是约定俗成的命名习惯,建议遵守。以上路径中,只有CMakeLists.txtpackage.xml是必须的,其余路径根据软件包是否需要来决定。

4.2 package的创建

创建一个package需要在catkin_ws/src下,用到catkin_create_pkg命令,用法是:

 catkin_create_pkg package depends
 
 

其中package是包名,depends是依赖的包名,可以依赖多个软件包。

例如,新建一个package叫做test_pkg,依赖roscpp、rospy、std_msgs(常用依赖)。

 $ catkin_create_pkg test_pkg roscpp rospy std_msgs
 
 

这样就会在当前路径下新建test_pkg软件包,包括:


 
 
  1. ├── CMakeLists.txt
  2. ├── include
  3. │ └── test_pkg
  4. ├── package.xml
  5. └── src

catkin_create_pkg帮你完成了软件包的初始化,填充好了CMakeLists.txtpackage.xml,并且将依赖项填进了这两个文件中。

4.3 package相关命令

4.3.1 rospack

rospack是对package管理的工具,命令的用法如下:

以上命令如果package缺省,则默认为当前目录(如果当前目录包含package.xml)

4.3.2 roscd

roscd命令类似与Linux系统的cd,改进之处在于roscd可以直接cd到ROS的软件包。

4.3.3 rosls

rosls也可以视为Linux指令ls的改进版,可以直接lsROS软件包的内容。

4.3.4 rosdep

rosdep是用于管理ROS package依赖项的命令行工具,用法如下:

一个较常使用的命令是:


 
 
  1. rosdep install --from-paths src --ignore-src --rosdistro=kinetic -y
  2. #用于安装工作空间中`src`路径下所有 package的依赖项(由pacakge.xml文件指定)

05 CMakeLists.txt

5.1 CMakeLists.txt作用

CMakeLists.txt原本是Cmake编译系统的规则文件,而Catkin编译系统基本沿用了CMake的编译风格,只是针对ROS工程添加了一些宏定义。所以在写法上,catkin的CMakeLists.txt与CMake的基本一致。

这个文件直接规定了这个package要依赖哪些package,要编译生成哪些目标,如何编译等等流程。所以CMakeLists.txt非常重要,它指定了由源码到目标文件的规则,catkin编译系统在工作时首先会找到每个package下的CMakeLists.txt,然后按照规则来编译构建。

5.2 CMakeLists.txt写法

CMakeLists.txt的基本语法都还是按照CMake,而Catkin在其中加入了少量的宏,总体的结构如下:


 
 
  1. cmake_minimum_required() #CMake的版本号
  2. project() #项目名称
  3. find_package() #找到编译需要的其他CMake/Catkin package
  4. catkin_python_setup() #catkin新加宏,打开catkin的Python Module的支持
  5. add_message_files() #catkin新加宏,添加自定义Message/Service/Action文件
  6. add_service_files()
  7. add_action_files()
  8. generate_message() #catkin新加宏,生成不同语言版本的msg/srv/action接口
  9. catkin_package() #catkin新加宏,生成当前package的cmake配置,供依赖本包的其他软件包调用
  10. add_library() #生成库
  11. add_executable() #生成可执行二进制文件
  12. add_dependencies() #定义目标文件依赖于其他目标文件,确保其他目标已被构建
  13. target_link_libraries() #链接
  14. catkin_add_gtest() #catkin新加宏,生成测试
  15. install() #安装至本机

如果你从未接触过CMake的语法,请阅读《CMake实践》:https://github.com/Akagi201/learning-cmake/blob/master/docs/cmake-practice.pdf 。掌握CMake语法对于理解ROS工程很有帮助。

5.3 CMakeLists例子

为了详细的解释CMakeLists.txt的写法,我们以turtlesim小海龟这个pacakge为例,读者可roscdtuetlesim包下查看,在turtlesim/CMakeLists.txt的写法如下,:


 
 
  1. cmake_minimum_required(VERSION 2.8.3)
  2. #CMake至少为2.8.3版
  3. project(turtlesim)
  4. #项目(package)名称为turtlesim,在后续文件中可使用变量${PROJECT_NAME}来引用项目名称turltesim
  5. find_package(catkin REQUIRED COMPONENTS geometry_msgs message_generation rosconsole roscpp roscpp_serialization roslib rostime std_msgs std_srvs)
  6. #cmake宏,指定依赖的其他pacakge,实际是生成了一些环境变量,如<NAME>_FOUND, <NAME>_INCLUDE_DIRS, <NAME>_LIBRARYIS
  7. #此处catkin是必备依赖 其余的geometry_msgs...为组件
  8. find_package(Qt5Widgets REQUIRED)
  9. find_package(Boost REQUIRED COMPONENTS thread)
  10. include_directories(include ${catkin_INCLUDE_DIRS} ${Boost_INCLUDE_DIRS})
  11. #指定C++的头文件路径
  12. link_directories( ${catkin_LIBRARY_DIRS})
  13. #指定链接库的路径
  14. add_message_files(DIRECTORY msg FILES
  15. Color.msg Pose.msg)
  16. #自定义msg文件
  17. add_service_files(DIRECTORY srv FILES
  18. Kill.srv
  19. SetPen.srv
  20. Spawn.srv
  21. TeleportAbsolute.srv
  22. TeleportRelative.srv)
  23. #自定义srv文件
  24. generate_messages(DEPENDENCIES geometry_msgs std_msgs std_srvs)
  25. #在add_message_files、add_service_files宏之后必须加上这句话,用于生成srv msg头文件/module,生成的文件位于devel/include中
  26. catkin_package(CATKIN_DEPENDS geometry_msgs message_runtime std_msgs std_srvs)
  27. # catkin宏命令,用于配置ROS的package配置文件和CMake文件
  28. # 这个命令必须在add_library()或者add_executable()之前调用,该函数有5个可选参数:
  29. # (1) INCLUDE_DIRS - 导出包的include路径
  30. # (2) LIBRARIES - 导出项目中的库
  31. # (3) CATKIN_DEPENDS - 该项目依赖的其他catkin项目
  32. # (4) DEPENDS - 该项目所依赖的非catkin CMake项目。
  33. # (5) CFG_EXTRAS - 其他配置选项
  34. set(turtlesim_node_SRCS
  35. src/turtlesim.cpp
  36. src/turtle.cpp
  37. src/turtle_frame.cpp
  38. )
  39. set(turtlesim_node_HDRS
  40. include/turtlesim/turtle_frame.h
  41. )
  42. #指定turtlesim_node_SRCS、turtlesim_node_HDRS变量
  43. qt5_wrap_cpp(turtlesim_node_MOCS ${turtlesim_node_HDRS})
  44. add_executable(turtlesim_node ${turtlesim_node_SRCS} ${turtlesim_node_MOCS})
  45. # 指定可执行文件目标turtlesim_node
  46. target_link_libraries(turtlesim_node Qt5::Widgets ${catkin_LIBRARIES} ${Boost_LIBRARIES})
  47. # 指定链接可执行文件
  48. add_dependencies(turtlesim_node turtlesim_gencpp)
  49. add_executable(turtle_teleop_key tutorials/teleop_turtle_key.cpp)
  50. target_link_libraries(turtle_teleop_key ${catkin_LIBRARIES})
  51. add_dependencies(turtle_teleop_key turtlesim_gencpp)
  52. add_executable(draw_square tutorials/draw_square.cpp)
  53. target_link_libraries(draw_square ${catkin_LIBRARIES} ${Boost_LIBRARIES})
  54. add_dependencies(draw_square turtlesim_gencpp)
  55. add_executable(mimic tutorials/mimic.cpp)
  56. target_link_libraries(mimic ${catkin_LIBRARIES})
  57. add_dependencies(mimic turtlesim_gencpp)
  58. # 同样指定可执行目标、链接、依赖
  59. install(TARGETS turtlesim_node turtle_teleop_key draw_square mimic
  60. RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION})
  61. # 安装目标文件到本地系统
  62. install(DIRECTORY images
  63. DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
  64. FILES_MATCHING PATTERN "*.png" PATTERN "*.svg")

06 package.xml

package.xml也是一个catkin的package必备文件,它是这个软件包的描述文件,在较早的ROS版本(rosbuild编译系统)中,这个文件叫做manifest.xml,用于描述pacakge的基本信息。如果你在网上看到一些ROS项目里包含着manifest.xml,那么它多半是hydro版本之前的项目了。

6.1 package.xml作用

pacakge.xml包含了package的名称、版本号、内容描述、维护人员、软件许可、编译构建工具、编译依赖、运行依赖等信息。 实际上rospack findrosdep等命令之所以能快速定位和分析出package的依赖项信息,就是直接读取了每一个pacakge中的package.xml文件。它为用户提供了快速了解一个pacakge的渠道。

6.2 package.xml写法

pacakge.xml遵循xml标签文本的写法,由于版本更迭原因,现在有两种格式并存(format1与format2),不过区别不大。老版本(format1)的pacakge.xml通常包含以下标签:


 
 
  1. <pacakge> 根标记文件
  2. <name> 包名
  3. <version> 版本号
  4. <description> 内容描述
  5. <maintainer> 维护者
  6. <license> 软件许可证
  7. <buildtool_depend> 编译构建工具,通常为catkin
  8. <build_depend> 编译依赖项,与Catkin中的
  9. <run_depend> 运行依赖项

说明:其中1-6为必备标签,1是根标签,嵌套了其余的所有标签,2-6为包的各种属性,7-9为编译相关信息。

在新版本(format2)中,包含的标签为:


 
 
  1. <pacakge> 根标记文件
  2. <name> 包名
  3. <version> 版本号
  4. <description> 内容描述
  5. <maintainer> 维护者
  6. <license> 软件许可证
  7. <buildtool_depend> 编译构建工具,通常为catkin
  8. <depend> 指定依赖项为编译、导出、运行需要的依赖,最常用
  9. <build_depend> 编译依赖项
  10. <build_export_depend> 导出依赖项
  11. <exec_depend> 运行依赖项
  12. <test_depend> 测试用例依赖项
  13. <doc_depend> 文档依赖项

由此看见新版本的pacakge.xml格式上增加了 、、、 ,相当于将之前的build和run依赖项描述进行了细分。

目前Indigo、Kinetic、Lunar等版本的ROS都同时支持两种版本的package.xml,所以无论选哪种格式都可以。

6.3 pacakge.xml例子

为了说明pacakge.xml写法,还是以turtlesim软件包为例,其pacakge.xml文件内容如下,我们添加了相关的注释:


 
 
  1. <?xml version="1.0"?> <!--本示例为老版本的pacakge.xml-->
  2. <package> <!--pacakge为根标签,写在最外面-->
  3. <name>turtlesim </name>
  4. <version>0.8.1 </version>
  5. <description>
  6. turtlesim is a tool made for teaching ROS and ROS packages.
  7. </description>
  8. <maintainer email="dthomas@osrfoundation.org">Dirk Thomas </maintainer>
  9. <license>BSD </license>
  10. <url type="website">http://www.ros.org/wiki/turtlesim </url>
  11. <url type="bugtracker">https://github.com/ros/ros_tutorials/issues </url>
  12. <url type="repository">https://github.com/ros/ros_tutorials </url>
  13. <author>Josh Faust </author>
  14. <!--编译工具为catkin-->
  15. <buildtool_depend>catkin </buildtool_depend>
  16. <!--编译时需要依赖以下包-->
  17. <build_depend>geometry_msgs </build_depend>
  18. <build_depend>qtbase5-dev </build_depend>
  19. <build_depend>message_generation </build_depend>
  20. <build_depend>qt5-qmake </build_depend>
  21. <build_depend>rosconsole </build_depend>
  22. <build_depend>roscpp </build_depend>
  23. <build_depend>roscpp_serialization </build_depend>
  24. <build_depend>roslib </build_depend>
  25. <build_depend>rostime </build_depend>
  26. <build_depend>std_msgs </build_depend>
  27. <build_depend>std_srvs </build_depend>
  28. <!--运行时需要依赖以下包-->
  29. <run_depend>geometry_msgs </run_depend>
  30. <run_depend>libqt5-core </run_depend>
  31. <run_depend>libqt5-gui </run_depend>
  32. <run_depend>message_runtime </run_depend>
  33. <run_depend>rosconsole </run_depend>
  34. <run_depend>roscpp </run_depend>
  35. <run_depend>roscpp_serialization </run_depend>
  36. <run_depend>roslib </run_depend>
  37. <run_depend>rostime </run_depend>
  38. <run_depend>std_msgs </run_depend>
  39. <run_depend>std_srvs </run_depend>
  40. </package>

以上内容是老版本(format1)的写法,如果要写成新版本(format2)则可以改为:


 
 
  1. <?xml version="1.0"?>
  2. <package format="2"> <!--在声明pacakge时指定format2,为新版格式-->
  3. <name>turtlesim </name>
  4. <version>0.8.1 </version>
  5. <description>
  6. turtlesim is a tool made for teaching ROS and ROS packages.
  7. </description>
  8. <maintainer email="dthomas@osrfoundation.org">Dirk Thomas </maintainer>
  9. <license>BSD </license>
  10. <url type="website">http://www.ros.org/wiki/turtlesim </url>
  11. <url type="bugtracker">https://github.com/ros/ros_tutorials/issues </url>
  12. <url type="repository">https://github.com/ros/ros_tutorials </url>
  13. <author>Josh Faust </author>
  14. <!--编译工具为catkin-->
  15. <buildtool_depend>catkin </buildtool_depend>
  16. <!--用depend来整合build_depend和run_depend-->
  17. <depend>geometry_msgs </depend>
  18. <depend>rosconsole </depend>
  19. <depend>roscpp </depend>
  20. <depend>roscpp_serialization </depend>
  21. <depend>roslib </depend>
  22. <depend>rostime </depend>
  23. <depend>std_msgs </depend>
  24. <depend>std_srvs </depend>
  25. <!--build_depend标签未变-->
  26. <build_depend>qtbase5-dev </build_depend>
  27. <build_depend>message_generation </build_depend>
  28. <build_depend>qt5-qmake </build_depend>
  29. <!--run_depend要改为exec_depend-->
  30. <exec_depend>libqt5-core </exec_depend>
  31. <exec_depend>libqt5-gui </exec_depend>
  32. <exec_depend>message_runtime </exec_depend>
  33. </package>

07 Metapackage

7.1 Metapackage介绍

在一些ROS的教学资料和博客里,你可能还会看到一个Stack(功能包集)的概念,它指的是将多个功能接近、甚至相互依赖的软件包的放到一个集合中去。但Stack这个概念在Hydro之后就取消了,取而代之的就是Metapackage。尽管换了个马甲,但它的作用没变,都是把一些相近的功能模块、软件包放到一起。

ROS里常见的Metapacakge有:

以上列举了一些常见的功能包集,例如navigation、turtlebot,他们都是用于某一方面的功能,以navigation metapackage(官方介绍里仍然沿用stack的叫法)为例,它包括了以下软件包:

这里只看一个软件包navigation。这个navigation就是一个简单的pacakge,里面只有几个文件,但由于它依赖了其他所有的软件包。Catkin编译系统会明白,这些软件包都属于navigation metapacakge。

这个道理并不难理解,比如我们在安装ROS时,用到了命令,由于它依赖了ROS所有的核心组件,我们在安装时也就能够安装整个ROS。

 sudo apt-get install ros-kinetic-desktop-full
 
 

7.2 Metapackage写法

我们以ROS-Academy-for-beginners为例介绍meteapckage的写法,在教学包内,有一个ros-academy-for-beginners软件包,该包即为一个metapacakge,其中有且仅有两个文件:CMakeLists.txtpacakge.xml

CMakeLists.txt写法如下:


 
 
  1. cmake_minimum_required(VERSION 2.8. 3)
  2. project(ros_academy_for_beginners)
  3. find_package(catkin REQUIRED)
  4. catkin_metapackage() #声明本软件包是一个metapacakge

pacakge.xml写法如下:


 
 
  1. <package>
  2. <name>ros_academy_for_beginners </name>
  3. <version>17.12.4 </version>
  4. <description>
  5. --------------------------------------------------------------------------
  6. A ROS tutorial for beginner level learners. This metapacakge includes some
  7. demos of topic, service, parameter server, tf, urdf, navigation, SLAM...
  8. It tries to explain the basic concepts and usages of ROS.
  9. --------------------------------------------------------------------------
  10. </description>
  11. <maintainer email="chaichangkun@163.com">Chai Changkun </maintainer>
  12. <author>Chai Changkun </author>
  13. <license>BSD </license>
  14. <url>http://http://www.droid.ac.cn </url>
  15. <buildtool_depend>catkin </buildtool_depend>
  16. <run_depend>navigation_sim_demo </run_depend> <!--注意这里的run_depend标签,将其他软件包都设为依赖项-->
  17. <run_depend>param_demo </run_depend>
  18. <run_depend>robot_sim_demo </run_depend>
  19. <run_depend>service_demo </run_depend>
  20. <run_depend>slam_sim_demo </run_depend>
  21. <run_depend>tf_demo </run_depend>
  22. <run_depend>topic_demo </run_depend>
  23. <export> <!--这里需要有export和metapacakge标签,注意这种固定写法-->
  24. <metapackage/>
  25. </export>
  26. </package>

metapacakge中的以上两个文件和普通pacakge不同点是:

  • CMakeLists.txt:加入了catkin_metapackage()宏,指定本软件包为一个metapacakge。
  • package.xml:标签将所有软件包列为依赖项,标签中添加标签声明。

metapacakge在我们实际开发一个大工程时可能有用。

08 其他常见文件类型

在ROS的pacakge中,还有其他许多常见的文件类型,这里做个总结。

8.1 launch文件

launch文件一般以.launch.xml结尾,它对ROS需要运行程序进行了打包,通过一句命令来启动。一般launch文件中会指定要启动哪些package下的哪些可执行程序,指定以什么参数启动,以及一些管理控制的命令。 launch文件通常放在软件包的launch/路径中。

8.2 msg/srv/action文件

ROS程序中有可能有一些自定义的消息/服务/动作文件,为程序的开发者所设计的数据结构,这类的文件以.msg,.srv,.action结尾,通常放在package的msg/,srv/,action/路径下。

8.3 urdf/xacro文件

urdf/xacro文件是机器人模型的描述文件,以.urdf或.xacro结尾。它定义了机器人的连杆和关节的信息,以及它们之间的位置、角度等信息,通过urdf文件可以将机器人的物理连接信息表示出来。并在可视化调试和仿真中显示。

8.4 yaml文件

yaml文件一般存储了ROS需要加载的参数信息,一些属性的配置。通常在launch文件或程序中读取.yaml文件,把参数加载到参数服务器上。通常我们会把yaml文件存放在param/路径下

8.5 dae/stl文件

dae或stl文件是3D模型文件,机器人的urdf或仿真环境通常会引用这类文件,它们描述了机器人的三维模型。相比urdf文件简单定义的性状,dae/stl文件可以定义复杂的模型,可以直接从solidworks或其他建模软件导出机器人装配模型,从而显示出更加精确的外形。

8.6 rviz文件

rviz文件本质上是固定格式的文本文件,其中存储了RViz窗口的配置(显示哪些控件、视角、参数)。通常rviz文件不需要我们去手动修改,而是直接在RViz工具里保存,下次运行时直接读取。

09 参考资料

https://zhuanlan.zhihu.com/p/144600321

作者:快乐出发0220 ;Android群:151319601 ; Linux群:96394158 ;转载请注明出处 http://klcf0220.cnblogs.com/ !!!

</article>
pdf_watermark
  • 1
    点赞
  • 7
    收藏
  • 0
    评论
博客
Rosdep的安装与使用
08-15 1万+
Rosdep的安装与使用 Rosdep的安装 Rosdep可以使用apt或pip进行安装 对于不同版本的 ros,使用apt安装方法如下: # ROS Noetic sudo apt-get install python3- rosdep # ROS Melodic and earlier sudo apt-get install python- rosdep

建议使用apt进行安装,使用apt安装后rosdep可以自动地更新
使用pip安装
sudo pip install -U rosdep

也可以使用源


博客
ROS配置的导出/导入、系统的备份/恢复
一. 使用export命令导出,使用import命令导入。1.export导出命令 导出全部配置命令: export file=xxx 或 /export file=xxx 或简写 ex fi=xxx 导出防火墙命令: ip firewall export file=fw 或简写 ip fi ex fi=fw ***注意问题:1)导出文...
博客
ROS 学习笔记 (二)—— ros 文件系统:Catkin & 工作空间 & ROS功能包
09-22 2352
Creating a ROS Package Building a ROS Package
博客
ROS 文件系统_loongembedded的博客_ ros 文件系统
9-18
(1) 机器人操作系统入门(二) ROS 文件系统:添加链接描述 (2) 详解 ROS 文件系统:添加链接描述 1. 文件系统结构 ROS 文件系统指的是 ROS源代码的组织形式,其结构大致如下图: 默认包含三个文件夹: src/: ROS的catkin软件包(C++源代码包) b...
博客
2- ROS 文件系统简单介绍_Gaoy9303的博客
8-31
可以清楚发现 roscd roscpp所切换到的目录与 rospack roscpp所输出的目录一致。 注意: roscd与其他 ROS工具一样,只会找到 ROS_PACKAGE_PATH中列出的 ROS包。 您的 ROS_PACKAGE_PATH应该至少包含一个目录列表, ROS_PACKAGE_PATH中不同的路径使用:...

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
OC](这里写自定义目录标题)

欢迎使用Markdown编辑器

你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

新的改变

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计 ,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
  3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法1 功能;
  6. 增加了 多屏幕编辑 Markdown文章功能;
  7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  8. 增加了 检查列表 功能。

功能快捷键

撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G
查找:Ctrl/Command + F
替换:Ctrl/Command + G

合理的创建标题,有助于目录的生成

直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

插入链接与图片

链接: link.

图片: Alt

带尺寸的图片: Alt

居中的图片: Alt

居中并且带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
var foo = 'bar';

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目Value
电脑$1600
手机$12
导管$1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列第二列第三列
第一列文本居中第二列文本居右第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPEASCIIHTML
Single backticks'Isn't this fun?'‘Isn’t this fun?’
Quotes"Isn't this fun?"“Isn’t this fun?”
Dashes-- is en-dash, --- is em-dash– is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。2

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n1)!nN 是通过欧拉积分

Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=0tz1etdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

Mon 06 Mon 13 Mon 20 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

Created with Raphaël 2.3.0 开始 我的操作 确认? 结束 yes no
  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. mermaid语法说明 ↩︎

  2. 注脚的解释 ↩︎

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值