ROS学习笔记一_基础知识

ROS学习笔记一_基础知识
Bohao ZhaoROS 简介
ROS概念
起源:2007 年,一家名为 **柳树车库(Willow Garage)**的机器人公司发布了 ROS(机器人操作系统),ROS是一套机器人通用软件框架,可以提升功能模块的复用性,并且随着该系统的不断迭代与完善,如今 ROS 已经成为机器人领域的事实标准。
ROS全称Robot Operating System(机器人操作系统)
- ROS是适用于机器人的开源元操作系统
- ROS集成了大量的工具,库,协议,提供类似OS所提供的功能,简化对机器人的控制
- 还提供了用于在多台计算机上获取,构建,编写和运行代码的工具和库,ROS在某些方面类似于“机器人框架”
- ROS设计者将ROS表述为“ROS = Plumbing + Tools + Capabilities + Ecosystem”,即ROS是通讯机制、工具软件包、机器人高层技能以及机器人生态系统的集合体
ROS设计目标
- **代码复用:**ROS的目标不是成为具有最多功能的框架,ROS的主要目标是支持机器人技术研发中的代码重用。
- **分布式:**ROS是进程(也称为Nodes)的分布式框架,ROS中的进程可分布于不同主机,不同主机协同工作,从而分散计算压力
- **松耦合:**ROS中功能模块封装于独立的功能包或元功能包,便于分享,功能包内的模块以节点为单位运行,以ROS标准的IO作为接口,开发者不需要关注模块内部实现,只要了解接口规则就能实现复用,实现了模块间点对点的松耦合连接
- **精简:**ROS被设计为尽可能精简,以便为ROS编写的代码可以与其他机器人软件框架一起使用。ROS易于与其他机器人软件框架集成:ROS已与OpenRAVE,Orocos和Player集成。
- **语言独立性:**包括Java,C++,Python等。为了支持更多应用开发和移植,ROS设计为一种语言弱相关的框架结构,使用简洁,中立的定义语言描述模块间的消息接口,在编译中再产生所使用语言的目标文件,为消息交互提供支持,同时允许消息接口的嵌套使用
- **易于测试:**ROS具有称为rostest的内置单元/集成测试框架,可轻松安装和拆卸测试工具。
- **大型应用:**ROS适用于大型运行时系统和大型开发流程。
- **丰富的组件化工具包:**ROS可采用组件化方式集成一些工具和软件到系统中并作为一个组件直接使用,如RVIZ(3D可视化工具),开发者根据ROS定义的接口在其中显示机器人模型等,组件还包括仿真环境和消息查看工具等
- **免费且开源:**开发者众多,功能包多
版本特点: 按照英文字母顺序命名,ROS 目前已经发布了ROS1 的终极版本: noetic(2020),并建议后期过渡至 ROS2 版本。noetic 版本之前默认使用的是 Python2,noetic 支持 Python3。
欢迎来到ROS世界
ROS中的程序即便使用不同的编程语言,实现流程也大致类似,以当前HelloWorld程序为例,实现流程大致如下:
- 先创建一个工作空间;
- 再创建一个功能包;
- 编辑源文件;
- 编辑配置文件;
- 编译并执行。
创建工作空间并初始化
1 | mkdir -p ros_test/src |
上述命令,首先会创建一个工作空间以及一个 src 子目录,然后再进入工作空间调用 catkin_make命令编译。
进入 src 创建 ros 包并添加依赖
1 | cd src |
上述命令,会在工作空间下生成一个功能包test_pkg
,该功能包依赖于
roscpp
、rospy
与 std_msgs
,其中
roscpp
是使用C++实现的库,而 rospy
则是使用python实现的库,std_msgs
是标准消息库,创建ROS功能包时,一般都会依赖这三个库实现。
HelloWorld
- 进入自定义的功能包的
1 | cd test_pkg/src/ |
- 建立一个自定义
helloworld.cpp
文件
1 |
|
- 编辑 ros 包下的 Cmakelist.txt文件
1 | add_executable(helloworld |
- 进入工作空间目录并编译
1 | cd ros_test1 |
生成 build devel ….
- 执行
先启动命令行1:
1 | roscore |
再启动命令行2:
1 | cd ros_test1 |
运行结果:
launch节点
使用 launch
文件,可以一次性启动多个 ROS
节点。
实现
选定功能包右击 —> 添加 launch 文件夹
选定 launch 文件夹右击 —> 添加 launch 文件
编辑 launch 文件内容
1
2
3
4
5<launch>
<node pkg="helloworld" type="demo_hello" name="hello" output="screen" />
<node pkg="turtlesim" type="turtlesim_node" name="t1"/>
<node pkg="turtlesim" type="turtle_teleop_key" name="key1" />
</launch>
node
—> 包含的某个节点pkg
—–> 功能包type
––> 被运行的节点文件name
–> 为节点命名output
-> 设置日志的输出目标
运行 launch 文件
1 | roslaunch 包名 launch文件名 |
运行结果: 一次性启动了多个节点
ROS文件系统
ROS文件系统级指的是在硬盘上ROS源代码的组织形式,其结构大致可以如下图所示:
WorkSpace — 自定义的工作空间
1 | |--- build:编译空间,用于存放CMake和catkin的缓存信息、配置信息和其他中间文件。 |
package.xml
该文件定义有关软件包的属性,例如软件包名称,版本号,作者,维护者以及对其他catkin软件包的依赖性。请注意,该概念类似于旧版 rosbuild 构建系统中使用的manifest.xml文件。
1 |
|
CMakelists.txt
文件CMakeLists.txt是CMake构建系统的输入,用于构建软件包。任何兼容CMake的软件包都包含一个或多个CMakeLists.txt文件,这些文件描述了如何构建代码以及将代码安装到何处。
1 | cmake_minimum_required(VERSION 3.0.2) #所需 cmake 版本 |
ROS文件系统相关命令
ROS文件系统相关命令
ROS 的文件系统本质上都还是操作系统文件,我们可以使用Linux命令来操作这些文件,不过,在ROS中为了更好的用户体验,ROS专门提供了一些类似于Linux的命令,这些命令较之于Linux原生命令,更为简介、高效。文件操作,无外乎就是增删改查与执行等操作,接下来,我们就从这五个维度,来介绍ROS文件系统的一些常用命令。
增
1 | catkin_create_pkg 自定义包名 依赖包 # 创建新的ROS功能包 |
删
1 | sudo apt purge xxx # 删除某个功能包 |
查
1 | rospack list # 列出所有功能包 |
改
1 | rosed 包名 文件名 # 修改功能包文件 |
执行
1 | roscore # 或(指定端口号) roscore -p xxxx |
1 | rosrun 包名 可执行文件名 # 运行指定的ROS节点,rosrun turtlesim turtlesim_node |
1 | roslaunch 包名 launch文件名 # 执行某个包下的 launch 文件 |