讲解文档
B站视频1
B站视频2
1 ROS架构
1.1 ROS 文件系统
ROS文件系统级指的是在硬盘上ROS源代码的组织形式,其结构大致可以如下图所示
<WorkSpace> 自定义的工作空间
<build> 编译空间,用于存放CMake和catkin的缓存信息、配置信息和其他中间文件。
<devel> 开发空间,用于存放编译后生成的目标文件,包括头文件、动态&静态链接库、可执行文件等。
<src> 源码
<CMakeLists.txt> 编译的基本配置
<package> 功能包(ROS基本单元)包含多个节点、库与配置文件,包名所有字母小写,只能由字母、数字与下划线组成
<CMakeLists.txt> 配置编译规则,比如源文件、依赖项、目标文件
<package.xml> 包信息,比如:包名、版本、作者、依赖项...(以前版本是 manifest.xml)
<scripts> 存储python文件
<src> 存储C++源文件
<include> 头文件
<msg> 消息通信格式文件
<srv> 服务通信格式文件
<action> 动作格式文件
<launch> 可一次性运行多个节点
<config> 配置信息
通俗的来讲,这个框架可以类比成一个现实中的例子。想象一个大厨房,这个厨房就是一WorkSpace,一道菜就是一个package,每道菜都有不同的厨师共同去完成,比如西红柿炒鸡蛋,有打鸡蛋的师傅,还有洗西红柿的师傅,还有专门负责炒菜的师傅,这些师傅就是一个一个的节点(Node)。
WorkSpace | package | Node |
---|---|---|
工作空间 | 功能包 | .py .cpp |
厨房 | 西红柿炒鸡蛋 | 厨师 |
ROS 文件系统中部分目录和文件前面编程中已经有所涉及,比如功能包的创建、src目录下cpp文件的编写、scripts目录下python文件的编写、launch目录下launch文件的编写,并且也配置了 package.xml 与 CMakeLists.txt 文件。当前我们主要介绍: package.xml 与 CMakeLists.txt 这两个配置文件。
-
package.xml
该文件定义有关软件包的属性,例如软件包名称,版本号,作者,维护者以及对其他catkin软件包的依赖性。请注意,该概念类似于旧版 rosbuild 构建系统中使用的manifest.xml文件。 -
CMakelists.txt
文件CMakeLists.txt是CMake构建系统的输入,用于构建软件包。任何兼容CMake的软件包都包含一个或多个CMakeLists.txt文件,这些文件描述了如何构建代码以及将代码安装到何处。
1.2 ROS 文件系统相关命令
1.2.1 增
- catkin_create_pkg 自定义包名 依赖包 —— 创建新的ROS功能包
- sudo apt install xxx —— 安装 ROS功能包
1.2.2 删
- sudo apt purge xxx —— 删除某个功能包
1.2.3 改
- rosed 包名 文件名 —— 修改功能包文件
- 需要安装 vim 比如:rosed turtlesim Color.msg
1.2.4 查
- rospack list —— 列出所有功能包
- rospack find 包名 —— 查找某个功能包是否存在,如果存在返回安装路径
- roscd 包名 —— 进入某个功能包
- rosls 包名 —— 列出某个包下的文件
- apt search xxx —— 搜索某个功能包
1.2.5 执行
5.1 roscore
- roscore —— 是 ROS 的系统先决条件节点和程序的集合, 必须运行 roscore 才能使 ROS 节点进行通信,roscore 将启动。
ros master
ros 参数服务器
rosout 日志节点
- 用法:终端直接 roscore
5.2 rosrun
- rosrun 包名 可执行文件名 —— 运行指定的ROS节点。比如:rosrun turtlesim turtlesim_node
5.3 roslaunch
- roslaunch 包名 launch文件名 —— 执行某个包下的 launch 文件
1.3 ROS计算图
1.3.1 计算图简介
- 前面介绍的是ROS文件结构,是磁盘上 ROS 程序的存储结构,是静态的,而 ros 程序运行之后,不同的节点之间是错综复杂的,ROS中提供了一个实用的工具:rqt_graph
- rqt_graph能够创建一个显示当前系统运行情况的动态图形。ROS分布式系统中不同进程需要进行数据交互,计算图可以以点对点的网络形式表现数据交互过程。rqt_graph是rqt程序包中的一部分
1.3.2 计算图安装
- 如果前期把所有的功能包(package)都已经安装完成,则直接在终端窗口中输入
rosrun rqt_graph rqt_graph
- 如果未安装则在终端(terminal)中输入
$ sudo apt install ros-<distro>-rqt
$ sudo apt install ros-<distro>-rqt-common-plugins
- 请使用你的ROS版本名称(比如:kinetic、melodic、Noetic等)来替换掉<distro>
- 例如当前版本是 Noetic,就在终端窗口中输入
$ sudo apt install ros-noetic-rqt
$ sudo apt install ros-noetic-rqt-common-plugins
1.3.3 计算图演示
接下来以 ROS 内置的小乌龟案例来演示计算图
- 首先,按照前面所示,运行案例
- 然后,启动新终端,键入: rqt_graph 或 rosrun rqt_graph rqt_graph,可以看到类似下图的网络拓扑图,该图可以显示不同节点之间的关系。
roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
rqt_graph
首先要清楚,turtlesim是一个功能包(package),而后面的turtlesim_node和turtle_teleop_key是节点(Node)。那么对应到类比关系中,该代码可以做如下解释:
通知(倒装句):
rosrun turtlesim turtlesim_node
去工作 西红柿炒鸡蛋 负责打鸡蛋的师傅(或者说具有打鸡蛋能力的师傅)
西红柿炒鸡蛋组的负责打鸡蛋的师傅去给我打个蛋
rosrun turtlesim turtle_teleop_key
去工作 西红柿炒鸡蛋 负责切西红柿的师傅
中间的/turtle1/cmd_vel 代表的是通讯的话题,箭头代表信息的流向
2 vscode 基本使用
2.1 ROS 插件
2.2 创建ROS工作空间
- Ctrl +Alt+T 启动终端
mkdir -p xxx_ws/src(必须得有 src)
cd xxx_ws
catkin_make
- 例如
mkdir -p demo01_ws/src(必须得有 src)
cd demo01_ws
catkin_make
2.3 启动 vscode
- 进入 xxx_ws 启动 vscode
cd xxx_ws
code .
- 例如
cd demo01_ws
code .
2.4 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"
}
]
}
2.5 创建 ROS 功能包
- 选定 src 右击 —> create catkin package
- 设置包名 添加依赖 roscpp rospy std_msgs
设置包名
- hello_vscode
添加依赖
- roscpp rospy std_msgs
2.6 修改 c_cpp_properties.json文件
- 将 gnu++14 修改成 c++17(小写)
2.7 文件配置(重点)
7.1 C++ 文件配置(配置CMakeList.txt)
/*
控制台输出 HelloVSCode !!!
*/
#include "ros/ros.h"
int main(int argc, char *argv[])
{
// 解决乱码问题
setlocale(LC_ALL,"");
// 执行节点初始化
ros::init(argc,argv,"HelloVSCode");
// 输出日志
ROS_INFO("Hello VSCode!!!");
return 0;
}
- 一共有两个部分(ctrl + \ 自动去除注释)
add_executable(hello_vscode_c src/hello_vscode_c.cpp) 第1个是文件的映射名称,第2个是源文件名
target_link_libraries(hello_vscode_c
${catkin_LIBRARIES}
)
7.2 C++ 编译执行
- 编译 ctrl + shift + b看是否报错
- 首先建立终端1启动 roscore
roscore
- 然后建立终端2
source ./devel/setup.bash
rosrun hello_vscode hello_vscode_c(可以用tab补齐)
7.3 Python 文件配置(配置CMakeList.txt)
在功能包下新建 scripts 文件夹,添加 demo01_test.py 文件。在vscode左侧scripts文件右击,点击在集成终端中打开,添加可执行权限。
chmod +x *.py
ll
找到catkin_install_python,Ctrl+/打开注释,并修改文件路径如下:
catkin_install_python(PROGRAMS
scripts/hello_vscode_p.py
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
7.4 Python 编译执行
- 编译 ctrl + shift + b看是否报错
- 首先建立终端1启动 roscore
roscore
- 然后建立终端2
source ./devel/setup.bash
rosrun hello_vscode hello_vscode_p.py (可以用tab补齐)
3 launch 文件
3.1 需求
- 一个程序中可能需要启动多个节点,比如:ROS内置的小乌龟案例,如果要控制乌龟运动,要启动多个窗口,分别启动roscore、乌龟界面节点、键盘控制节点。如果每次都调用 rosrun逐一启动,显然效率低下,如何优化?
- 官方给出的优化策略是使用 launch 文件,可以一次性启动多个 ROS 节点
3.2 实现
-
- 选定功能包右击 —> 添加 launch 文件夹
-
- 选定 launch 文件夹右击 —> 添加 launch 文件
-
- 编辑 launch 文件内容
<launch>
<!-- 添加被执行的节点 node是运动节点,key是键盘控制节点-->
<!-- 乌龟GUI-->
<!-- rosrun turtlesim(pkg) turtlrsim_node(type)-->
<node pkg = "turtlesim" type = "turtlesim_node" name = "turtle_GUI" />
<node pkg = "turtlesim" type = "turtle_teleop_key" name = "turtle_key" />
<!-- pkg——包,type——被执行的节点,name——节点取的名字,output = "screen"——日志输出到屏幕上-->
<!-- 添加hello_c文件-->
<!--node pkg = "hello_vscode" type = "hello_vscode_c" name = "hello" output = "screen"/-->
</launch>
node —> 包含的某个节点
pkg -----> 功能包
type ----> 被运行的节点文件
name --> 为节点命名
output-> 设置日志的输出目标
-
- 运行 launch 文件:roslaunch 包名 launch文件名,不需要进行r启动oscore
- ctrl+~:打开运行窗口
source ./devel/setup.bash
roslaunch hello_vscode start_turtle.launch
-
- 运行结果: 一次性启动了多个节点