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. 先创建一个工作空间
2. 再创建一个功能包$ mkdir -p demo01_ws/src // 创建一个工作空间及一个 src 子目录 $ cd demo01_ws $ catkin_make
3. 进入 ros 功能包的 src 目录编辑源文件$ cd src $ catkin_create_pkg helloworld roscpp rospy std_msgs // helloword 为自定义 ROS 包名 // 该功能包依赖于 roscpp、rospy 与 std_msgs 三个库 // 其中roscpp是使用C++实现的库,而rospy则是使用python实现的库,std_msgs是标准消息库
$ 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; }
$ cd .. $ gedit CMakelist.txt
- 更改内容如下
add_executable(helloworld_c src/helloworld_c.cpp) target_link_libraries(helloworld_c ${catkin_LIBRARIES} )
- 进入工作空间目录并编译
$ cd ~/demo01_ws $ catkin_make
- 执行
- 先启动命令行
$ roscore
- 再启动命令行2
$ cd demo01_ws $ source ./devel/setup.bash $ rosrun helloworld C++节点
- helloworld_c.cpp 代码如下:
- 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设计者将ROS表述为“ROS = Plumbing + Tools + Capabilities + Ecosystem”
-
维护者
- 立足维护者的角度: ROS 架构可划分为两大部分
- main:核心部分,主要由 Willow Garage 和一些开发者设计、提供以及维护。它提供了一些分布式计算的基本工具,以及整个ROS的核心部分的程序编写
- universe:全球范围的代码,有不同国家的ROS社区组织开发和维护。一种是库的代码,如OpenCV、PCL等;库的上一层是从功能角度提供的代码,如人脸识别,他们调用下层的库;最上层的代码是应用级的代码,让机器人完成某一确定的功能
- 立足维护者的角度: ROS 架构可划分为两大部分
-
系统架构
- 立足系统架构: 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
- 执行
- roscore
- roscore 是 ROS 的系统先决条件节点和程序的集合,必须运行 roscore 才能使 ROS 节点进行通信
- roscore 将启动
- ros master
- ros 参数服务器
- rosout 日志节点
- rosrun
$ rosrun 包名 可执行文件名 === 运行指定的ROS节点 $ rosrun turtlesim turtlesim_node
- 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
- 可以看到类似下图的网络拓扑图,该图可以显示不同节点之间的关系