第 1 章 ROS概述与环境搭建


讲解文档
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)。

WorkSpacepackageNode
工作空间功能包.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 实现

    1. 选定功能包右击 —> 添加 launch 文件夹
    1. 选定 launch 文件夹右击 —> 添加 launch 文件
    1. 编辑 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-> 设置日志的输出目标

    1. 运行 launch 文件:roslaunch 包名 launch文件名,不需要进行r启动oscore
  • ctrl+~:打开运行窗口
 source ./devel/setup.bash
 roslaunch hello_vscode start_turtle.launch 
    1. 运行结果: 一次性启动了多个节点
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2021 Nqq

你的鼓励是我学习的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值