ROS学习1:ROS概述与环境搭建

【Autolabor初级教程】ROS机器人入门

1. ROS 简介

  • 为了更高效地进行机器人的研究和开发,选择一个通用的开发框架非常必要,ROS(Robot Operating System,机器人操作系统) 就是流行的框架之一
  • ROS 就是一个分布式的通信框架,帮助程序进程之间更方便地通信
    • 一个机器人通常包含多个部件,每个部件都有配套的控制程序,以实现机器人的运动与视听功能等。那么要协调一个机器人中的这些部件,或者协调由多个机器人组成的机器人集群,怎么办呢?这时就需要让分散的部件能够互相通信,在多机器人集群中,这些分散的部件还分散在不同的机器人上。解决这种分布式通信问题正是 ROS 的设计初衷
    • ROS 设计者将 ROS 表述为 “ROS = Plumbing + Tools + Capabilities + Ecosystem”,即 ROS 是通讯机制、工具软件包、机器人高层技能以及机器人生态系统的集合体

2. ROS 特点

  • (1) 机器人开源元操作系统
    • ROS 并不是真正意义上的操作系统,其底层的任务调度、编译、设备驱动等还是由它的原生操作系统 Ubuntu Linux 完成。ROS 实际上是运行在 Ubuntu Linux 上的亚操作系统或者说软件框架,但提供硬件抽象、函数调用、进程管理这些类似操作系统的功能,也提供用于获取、编译、跨平台的函数和工具
  • (2) 分布式通信机制
    • ROS 是进程(也称为Nodes)的分布式框架,ROS 中的进程可分布于不同主机,不同主机协同工作从而分散计算压力
    • ROS 的核心思想就是将机器人的软件功能做成一个个节点 (Nodes),节点之间通过互相发送消息进行沟通。这些节点可以部署在同一台主机上,也可以部署在不同主机上,甚至还可以部署在互联网上。ROS 网络通信机制中的主节点 (master) 负责对网络中各个节点之间的通信过程进行管理调度,同时提供一个用于配置网络中全局参数的服务
  • (3) 松耦合软件框架
    • 利用分布式通信机制实现节点间的进程通信,ROS 的软件代码以松耦合方式组织,开发过程灵活,管理维护方便
    • ROS 中功能模块封装于独立的功能包或元功能包,便于分享,功能包内的模块以节点为单位运行,以 ROS 标准的 IO 作为接口,开发者不需要关注模块内部实现,只要了解接口规则就能实现复用,实现了模块间点对点的松耦合连接
  • (4) 丰富的开源功能库
    • ROS 是基于 BSD(Berkeley Software Distribution,伯克利软件发行) 协议的开源软件,允许任何人修改、重用、重发布以及在商业和闭源产品中使用,使用 ROS 能够快捷地搭建自己的机器人原型
    • ROS 集成了大量的工具、库和协议,提供类似 OS 所提供的功能,简化对机器人的控制
  • (5) 语言独立性
    • 包括 Java,C++,Python 等。为了支持更多应用开发和移植,ROS 设计为一种语言弱相关的框架结构,使用简洁,中立的定义语言描述模块间的消息接口,在编译中再产生所使用语言的目标文件,为消息交互提供支持,同时允许消息接口的嵌套使用
  • (6) 代码复用且易于测试
    • ROS 的目标不是成为具有最多功能的框架,ROS 的主要目标是支持机器人技术研发中的代码重用
    • ROS 具有称为 rostest 的内置单元/集成测试框架,可轻松安装和卸载测试工具

3. ROS 安装

  • 鱼香 ROS 一键安装
    $ wget http://fishros.com/install -O fishros && . fishros
    
  • rosdepc 安装
    $ wget http://fishros.com/install -O fishros && bash fishros
    

4. ROS 快速体验

  • 编写 ROS 程序,在控制台输出文本: Hello World。实现流程大致如下:
    1. 先创建一个工作空间
    $ mkdir -p demo01_ws/src // 创建一个工作空间及一个 src 子目录
    $ cd demo01_ws
    $ catkin_make
    
    2. 再创建一个功能包
    $ cd src
    $ catkin_create_pkg helloworld roscpp rospy std_msgs
    // helloword 为自定义 ROS 包名
    // 该功能包依赖于 roscpp、rospy 与 std_msgs 三个库
    // 其中roscpp是使用C++实现的库,而rospy则是使用python实现的库,std_msgs是标准消息库    
    
    3. 进入 ros 功能包的 src 目录编辑源文件
    $ cd helloword/src/
    $ touch helloworld_c.cpp
    $ gedit helloworld_c.cpp
    
    • helloworld_c.cpp 代码如下:
      #include "ros/ros.h"
      
      int main(int argc, char *argv[]) {
          //执行 ros 节点初始化
          ros::init(argc,argv,"hello");
          //创建 ros 节点句柄(非必须)
          ros::NodeHandle n;
          //控制台输出 hello world
          ROS_INFO("hello world!");
      
          return 0;
      }
      
    4. 编辑 ros 包下的 CMakelist.txt 配置文件
    $ cd ..
    $ gedit CMakelist.txt
    
    • 更改内容如下
      add_executable(helloworld_c src/helloworld_c.cpp)
      target_link_libraries(helloworld_c
        ${catkin_LIBRARIES}
      )
      
    5. 编译并执行
    • 进入工作空间目录并编译
      $ cd ~/demo01_ws
      $ catkin_make
      
    • 执行
      • 先启动命令行
      $ roscore
      
      • 再启动命令行2
      $ cd demo01_ws
      $ source ./devel/setup.bash
      $ rosrun helloworld C++节点
      
  • source ~/工作空间/devel/setup.bash 可以添加进 .bashrc 文件,使用更方便
    $ echo "source ~/demo01_ws/devel/setup.bash" >> ~/.bashrc
    $ source ~/.bashrc
    

5. ROS集成开发环境搭建

5.1 安装终端
  • 推荐安装 Terminator 终端
    $ sudo apt install terminator
    
5.2 安装 VScode
  • 下载
    VSCode官网下载

  • 安装

    $ sudo dpkg -i xxxx.deb
    
  • 卸载

    $ sudo dpkg --purge  code
    
  • 集成 ROS 插件

    • 安装插件:C++、Python、CMake Tools、ROS
  • 使用基本配置

    • 创建 ROS 工作空间

      $ mkdir -p demo02_ws/src
      $ cd demo02_ws
      $ catkin_make
      
    • 启动 vscode

      cd demo02_ws
      code .
      
    • vscode 中编译 ROS

      • 快捷键 ctrl + shift + B 调用编译,选择 :catkin_make:build
      • 可以点击配置设置为默认,修改 .vscode/tasks.json 文件
      {
      // 有关 tasks.json 格式的文档,请参见
          // https://go.microsoft.com/fwlink/?LinkId=733558
          "version": "2.0.0",
          "tasks": [
              {
                  "label": "catkin_make:debug", //代表提示的描述性信息
                  "type": "shell",  //可以选择shell或者process,如果是shell代码是在shell里面运行一个命令,如果是process代表作为一个进程来运行
                  "command": "catkin_make",//这个是我们需要运行的命令
                  "args": [],//如果需要在命令后面加一些后缀,可以写在这里,比如-DCATKIN_WHITELIST_PACKAGES=“pac1;pac2”
                  "group": {"kind":"build","isDefault":true},
                  "presentation": {
                      "reveal": "always"//可选always或者silence,代表是否输出信息
                  },
                  "problemMatcher": "$msCompile"
              }
          ]
      }
      
      
    • 创建 ROS 功能包

      • 选定工作空间下的 src 右击 —> create catkin package
      • 设置包名
      hello_vscode
      
      • 添加依赖
      roscpp rospy std_msgs
      
    • C++ 实现

      • 在功能包的 src 下新建 hello_vscode_c.cpp 文件
      #include "ros/ros.h"
      
      int main(int argc, char *argv[]) { // main 函数的参数不可以被 const 修饰
          setlocale(LC_ALL, ""); // 解决 ROS__INFO 终端输出有中文时出现乱码的问题
          ros::init(argc, argv, "HelloVSCode");
      
          ROS_INFO("Hello VSCode!!!");
          
          return 0;
      
      // 如果没有代码提示
      // 修改 .vscode/c_cpp_properties.json
      // 设置 "cppStandard": "c++17"
      }
      
    • 配置 CMakeLists.txt

      add_executable(hello_vscode_c src/hello_vscode_c.cpp)
      
      target_link_libraries(hello_vscode_c
          ${catkin_LIBRARIES}
      )
      
    • 编译执行

      • 编译: ctrl + shift + B
      • 执行: 和之前一致,只是可以在 VScode 中添加终端
      $ source ./devel/setup.bash
      $ rosrun hello_vscode hello_vscode_c
               //   包名        节点名
      
5.3 launch文件演示
  • 需求

    • 一个程序中可能需要启动多个节点,如果每次都调用 rosrun 逐一启动,显然效率低下,如何优化?官方给出的优化策略是使用 launch 文件,可以一次性启动多个 ROS 节点
  • 实现

    • 选定功能包右击 —> 添加 launch 文件夹
    • 选定 launch 文件夹右击 —> 添加 start_turtle.launch 文件(XML文件)
    • 编辑 launch 文件内容
      <launch>
          <node pkg = "hello_vscode" type = "hello_vscode_c" name = "hello" output = "screen" />
          <node pkg = "turtlesim" type = "turtlesim_node" name = "turtle_GUI" />
          <node pkg = "turtlesim" type = "turtle_teleop_key" name = "turtle_key" />
      </launch>
      
      • node ----> 包含的某个节点
      • pkg -----> 功能包
      • type ----> 被运行的节点文件
      • name ----> 为节点命名
      • output—> 设置日志的输出目标
    • 运行 launch 文件
      $ roslaunch hello_vscode hello_vscode_c
               //   包名        节点名
      

6. ROS架构

立足不同的角度,对 ROS 架构的描述也是不同的,一般我们可以从设计者、维护者、系统结构与自身结构4个角度来描述ROS结构

  • 设计者

    • ROS设计者将ROS表述为“ROS = Plumbing + Tools + Capabilities + Ecosystem”
      • Plumbing: 通讯机制(实现ROS不同节点之间的交互)
      • Tools :工具软件包(ROS中的开发和调试工具)
      • Capabilities :机器人高层技能(ROS中某些功能的集合,比如:导航)
      • Ecosystem:机器人生态系统(跨地域、跨软件与硬件的ROS联盟)
  • 维护者

    • 立足维护者的角度: ROS 架构可划分为两大部分
      • main:核心部分,主要由 Willow Garage 和一些开发者设计、提供以及维护。它提供了一些分布式计算的基本工具,以及整个ROS的核心部分的程序编写
      • universe:全球范围的代码,有不同国家的ROS社区组织开发和维护。一种是库的代码,如OpenCV、PCL等;库的上一层是从功能角度提供的代码,如人脸识别,他们调用下层的库;最上层的代码是应用级的代码,让机器人完成某一确定的功能
  • 系统架构

    • 立足系统架构: ROS 可以划分为三层
    • OS 层,也即经典意义的操作系统,ROS 只是元操作系统,需要依托真正意义的操作系统,目前兼容性最好的是 Linux 的 Ubuntu,Mac、Windows 也支持 ROS 的较新版本
    • 中间层,是 ROS 封装的关于机器人开发的中间件,比如:
      • 基于 TCP/UDP 继续封装的 TCPROS/UDPROS 通信系统
      • 用于进程间通信 Nodelet,为数据的实时性传输提供支持
      • 另外,还提供了大量的机器人开发实现库,如:数据类型定义、坐标变换、运动控制
    • 应用层,功能包,以及功能包内的节点,比如: master、turtlesim的控制与运动节点
  • 自身结构

    • 就 ROS 自身实现而言: 也可以划分为三层
    • 文件系统
      • ROS文件系统级指的是在硬盘上面查看的ROS源代码的组织形式
    • 计算图
      • ROS 分布式系统中不同进程需要进行数据交互,计算图可以通过点对点的网络形式表现数据交互过程,计算图中的重要概念: 节点(Node)、消息(message)、通信机制_主题(topic)、通信机制_服务(service)
    • 开源社区
      • ROS的社区级概念是 ROS 网络上进行代码发布的一种表现形式
6.1 ROS文件系统
  • ROS 文件系统级指的是在硬盘上 ROS 源代码的组织形式,其结构大致可以如下图所示
    在这里插入图片描述
WorkSpace --- 自定义的工作空间

    |--- build:编译空间,用于存放CMake和catkin的缓存信息、配置信息和其他中间文件

    |--- devel:开发空间,用于存放编译后生成的目标文件,包括头文件、动态&静态链接库、可执行文件等

    |--- src:源码

        |-- package:功能包(ROS基本单元)包含多个节点、库与配置文件,包名所有字母小写,只能由字母、数字与下划线组成

            |-- CMakeLists.txt:配置编译规则,比如源文件、依赖项、目标文件

            |-- package.xml:包信息,比如:包名、版本、作者、依赖项...(以前版本是 manifest.xml)

            |-- scripts:存储python文件

            |-- src:存储C++源文件

            |-- include:头文件

            |-- msg:消息通信格式文件

            |-- srv:服务通信格式文件

            |-- action:动作格式文件

            |-- launch:可一次性运行多个节点 

            |-- config:配置信息

        |-- CMakeLists.txt:编译的基本配置
  • package.xml 文件解析
    该文件定义有关软件包的属性,例如软件包名称,版本号,作者,维护者以及对其他catkin软件包的依赖性
<?xml version="1.0"?>
<!-- 格式: 以前是 1,推荐使用格式 2 -->
<package format="2">
  <!-- 包名 -->
  <name>hello_vscode</name>
  <!-- 版本 -->
  <version>0.0.0</version>
  <!-- 描述信息 -->
  <description>The hello_vscode package</description>

  <!-- One maintainer tag required, multiple allowed, one person per tag -->
  <!-- Example:  -->
  <!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> -->
  <!-- 维护人员 -->
  <maintainer email="yue@todo.todo">yue</maintainer>


  <!-- One license tag required, multiple allowed, one license per tag -->
  <!-- Commonly used license strings: -->
  <!--   BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 -->
  <!-- 许可证信息,ROS核心组件默认 BSD -->
  <license>TODO</license>


  <!-- Url tags are optional, but multiple are allowed, one per tag -->
  <!-- Optional attribute type can be: website, bugtracker, or repository -->
  <!-- Example: -->
  <!-- <url type="website">http://wiki.ros.org/hello_vscode</url> -->


  <!-- Author tags are optional, multiple are allowed, one per tag -->
  <!-- Authors do not have to be maintainers, but could be -->
  <!-- Example: -->
  <!-- <author email="jane.doe@example.com">Jane Doe</author> -->


  <!-- The *depend tags are used to specify dependencies -->
  <!-- Dependencies can be catkin packages or system dependencies -->
  <!-- Examples: -->
  <!-- Use depend as a shortcut for packages that are both build and exec dependencies -->
  <!--   <depend>roscpp</depend> -->
  <!--   Note that this is equivalent to the following: -->
  <!--   <build_depend>roscpp</build_depend> -->
  <!--   <exec_depend>roscpp</exec_depend> -->
  <!-- Use build_depend for packages you need at compile time: -->
  <!--   <build_depend>message_generation</build_depend> -->
  <!-- Use build_export_depend for packages you need in order to build against this package: -->
  <!--   <build_export_depend>message_generation</build_export_depend> -->
  <!-- Use buildtool_depend for build tool packages: -->
  <!--   <buildtool_depend>catkin</buildtool_depend> -->
  <!-- Use exec_depend for packages you need at runtime: -->
  <!--   <exec_depend>message_runtime</exec_depend> -->
  <!-- Use test_depend for packages you need only for testing: -->
  <!--   <test_depend>gtest</test_depend> -->
  <!-- Use doc_depend for packages you need only for building documentation: -->
  <!--   <doc_depend>doxygen</doc_depend> -->
  <!-- 依赖的构建工具,这是必须的 -->
  <buildtool_depend>catkin</buildtool_depend>

  <!-- 指定构建此软件包所需的软件包 -->
  <build_depend>roscpp</build_depend>
  <build_depend>rospy</build_depend>
  <build_depend>std_msgs</build_depend>

  <!-- 指定根据这个包构建库所需要的包 -->
  <build_export_depend>roscpp</build_export_depend>
  <build_export_depend>rospy</build_export_depend>
  <build_export_depend>std_msgs</build_export_depend>

  <!-- 运行该程序包中的代码所需的程序包 -->
  <exec_depend>roscpp</exec_depend>
  <exec_depend>rospy</exec_depend>
  <exec_depend>std_msgs</exec_depend>


  <!-- The export tag contains other, unspecified, tags -->
  <export>
    <!-- Other tools can request additional information be placed here -->

  </export>
</package>
  • CMakelists.txt 文件解析
  • 是 CMake 构建系统的输入,用于构建软件包。任何兼容 CMake 的软件包都包含一个或多个CMakeLists.txt文件,这些文件描述了如何构建代码以及将代码安装到何处
cmake_minimum_required(VERSION 3.0.2) # 所需 cmake 版本
project(hello_vscode) # 包名称,会被 ${PROJECT_NAME} 的方式调用

## Compile as C++11, supported in ROS Kinetic and newer
# add_compile_options(-std=c++11)

## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
# 设置构建所需要的软件包
find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
)

## System dependencies are found with CMake's conventions
# 默认添加系统依赖
# find_package(Boost REQUIRED COMPONENTS system)


## Uncomment this if the package has a setup.py. This macro ensures
## modules and global scripts declared therein get installed
## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html
# 启动 python 模块支持
# catkin_python_setup()

################################################
## Declare ROS messages, services and actions ##
## 声明 ROS 消息、服务、动作 ##
################################################

## To declare and build messages, services or actions from within this
## package, follow these steps:
## * Let MSG_DEP_SET be the set of packages whose message types you use in
##   your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...).
## * In the file package.xml:
##   * add a build_depend tag for "message_generation"
##   * add a build_depend and a exec_depend tag for each package in MSG_DEP_SET
##   * If MSG_DEP_SET isn't empty the following dependency has been pulled in
##     but can be declared for certainty nonetheless:
##     * add a exec_depend tag for "message_runtime"
## * In this file (CMakeLists.txt):
##   * add "message_generation" and every package in MSG_DEP_SET to
##     find_package(catkin REQUIRED COMPONENTS ...)
##   * add "message_runtime" and every package in MSG_DEP_SET to
##     catkin_package(CATKIN_DEPENDS ...)
##   * uncomment the add_*_files sections below as needed
##     and list every .msg/.srv/.action file to be processed
##   * uncomment the generate_messages entry below
##   * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...)

## Generate messages in the 'msg' folder
# add_message_files(
#   FILES
#   Message1.msg
#   Message2.msg
# )

## Generate services in the 'srv' folder
# add_service_files(
#   FILES
#   Service1.srv
#   Service2.srv
# )

## Generate actions in the 'action' folder
# add_action_files(
#   FILES
#   Action1.action
#   Action2.action
# )

## Generate added messages and services with any dependencies listed here
# 生成消息、服务时的依赖包
# generate_messages(
#   DEPENDENCIES
#   std_msgs
# )

################################################
## Declare ROS dynamic reconfigure parameters ##
## 声明 ROS 动态参数配置 ##
################################################

## To declare and build dynamic reconfigure parameters within this
## package, follow these steps:
## * In the file package.xml:
##   * add a build_depend and a exec_depend tag for "dynamic_reconfigure"
## * In this file (CMakeLists.txt):
##   * add "dynamic_reconfigure" to
##     find_package(catkin REQUIRED COMPONENTS ...)
##   * uncomment the "generate_dynamic_reconfigure_options" section below
##     and list every .cfg file to be processed

## Generate dynamic reconfigure parameters in the 'cfg' folder
# generate_dynamic_reconfigure_options(
#   cfg/DynReconf1.cfg
#   cfg/DynReconf2.cfg
# )

###################################
## catkin specific configuration ##
## catkin 特定配置##
###################################
## The catkin_package macro generates cmake config files for your package
## Declare things to be passed to dependent projects
## INCLUDE_DIRS: uncomment this if your package contains header files
## LIBRARIES: libraries you create in this project that dependent projects also need
## CATKIN_DEPENDS: catkin_packages dependent projects also need
## DEPENDS: system dependencies of this project that dependent projects also need
# 运行时依赖
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES hello_vscode
#  CATKIN_DEPENDS roscpp rospy std_msgs
#  DEPENDS system_lib
)

###########
## Build ##
###########

## Specify additional locations of header files
## Your package locations should be listed before other locations
# 添加头文件路径,当前程序包的头文件路径位于其他文件路径之前
include_directories(
# include
  ${catkin_INCLUDE_DIRS}
)

## Declare a C++ library
# 声明 C++# add_library(${PROJECT_NAME}
#   src/${PROJECT_NAME}/hello_vscode.cpp
# )

## Add cmake target dependencies of the library
## as an example, code may need to be generated before libraries
## either from message generation or dynamic reconfigure
# 添加库的 cmake 目标依赖
# add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

## Declare a C++ executable
## With catkin_make all packages are built within a single CMake context
## The recommended prefix ensures that target names across packages don't collide
# 声明 C++ 可执行文件
add_executable(hello_vscode_c src/hello_vscode_c.cpp)

## Rename C++ executable without prefix
## The above recommended prefix causes long target names, the following renames the
## target back to the shorter version for ease of user use
## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node"
# 重命名c++可执行文件
# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "")

## Add cmake target dependencies of the executable
## same as for the library above
# 添加可执行文件的 cmake 目标依赖
# add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

## Specify libraries to link a library or executable target against
# 指定库、可执行文件的链接库
target_link_libraries(hello_vscode_c
  ${catkin_LIBRARIES}
)

#############
## Install ##
#############

# all install targets should use catkin DESTINATION variables
# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html

## Mark executable scripts (Python etc.) for installation
## in contrast to setup.py, you can choose the destination
# 设置用于安装的可执行脚本
# catkin_install_python(PROGRAMS
#   scripts/my_python_script
#   DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
# )

## Mark executables for installation
## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_executables.html
# install(TARGETS ${PROJECT_NAME}_node
#   RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
# )

## Mark libraries for installation
## See http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html
# install(TARGETS ${PROJECT_NAME}
#   ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
#   LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
#   RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION}
# )

## Mark cpp header files for installation
# install(DIRECTORY include/${PROJECT_NAME}/
#   DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
#   FILES_MATCHING PATTERN "*.h"
#   PATTERN ".svn" EXCLUDE
# )

## Mark other files for installation (e.g. launch and bag files, etc.)
# install(FILES
#   # myfile1
#   # myfile2
#   DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
# )

#############
## Testing ##
#############

## Add gtest based cpp test target and link libraries
# catkin_add_gtest(${PROJECT_NAME}-test test/test_hello_vscode.cpp)
# if(TARGET ${PROJECT_NAME}-test)
#   target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME})
# endif()

## Add folders to be run by python nosetests
# catkin_add_nosetests(test)

6.2 ROS文件系统相关命令
  • ROS 的文件系统本质上都还是操作系统文件,我们可以使用 Linux 命令来操作这些文件,不过,在 ROS 中为了更好的用户体验,ROS 专门提供了一些类似于 Linux 的命令,这些命令较之于 Linux 原生命令,更为简洁高效

文件操作,无外乎就是增、删、改、查与执行等操作

  • $ catkin_create_pkg 自定义包名 依赖包 === 创建新的ROS功能包
    $ sudo apt install xxx === 安装 ROS功能包
    
  • $ sudo apt purge xxx ==== 删除某个功能包
    
  • $ rospack list === 列出所有功能包
    $ rospack find 包名 === 查找某个功能包是否存在,如果存在返回安装路径
    $ roscd 包名 === 进入某个功能包
    $ rosls 包名 === 列出某个包下的文件
    $ apt search xxx === 搜索某个功能包
    
  • $ rosed 包名 文件名 === 修改功能包文件
    $ rosed turtlesim Color.msg
    // 需要安装 vim
    
  • 执行
  1. roscore
  • roscore 是 ROS 的系统先决条件节点和程序的集合,必须运行 roscore 才能使 ROS 节点进行通信
  • roscore 将启动
    • ros master
    • ros 参数服务器
    • rosout 日志节点
  1. rosrun
    $ rosrun 包名 可执行文件名 === 运行指定的ROS节点
    $ rosrun turtlesim turtlesim_node
    
  2. roslaunch
    $ roslaunch 包名 launch文件名 === 执行某个包下的 launch 文件
    
6.3 ROS计算图
  • 简介
    • 前面介绍的是 ROS 文件结构,是磁盘上 ROS 程序的存储结构,是静态的,而 ros 程序运行之后,不同的节点之间是错综复杂的,ROS 中提供了一个实用的工具 rqt_graph
    • rqt_graph 能够创建一个显示当前系统运行情况的动态图形。ROS 分布式系统中不同进程需要进行数据交互,计算图可以通过点对点的网络形式表现数据交互过程。rqt_graph 是 rqt 程序包中的一部分
  • 安装
    $ sudo apt install ros-melodic-rqt
    $ sudo apt install ros-melodic-rqt-common-plugins
    
  • 演示
    • 首先,按照前面所示,运行案例
    • 然后,启动新终端
      $ rosrun rqt_graph rqt_graph
      
    • 可以看到类似下图的网络拓扑图,该图可以显示不同节点之间的关系
      在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值