文档维护:Arvin

网页部署:Arvin

写在前面:本文旨在记录学习ROS过程中的一些重要知识概念和遇到的错误问题。主要参考赵虚左老师的ROS课程(第一个参考链接),由于赵老师用的noetic版本,而我用的是melodic版本,细节上可能会有所差异。

0

ROS基础知识

ROS文件基础架构

ROS文件系统指的是在硬盘上ROS源代码的组织形式,其结构大致可以如图所示:

1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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: 编译的基本配置

ROS核心概念

  • 工作空间(workspace)

    在ROS机器人开发中,我们针对机器人某些功能进行代码开始时,各种编写的代码、参数、脚本等文件,也需要放置在某一个文件夹里进行管理,这个文件夹在ROS系统中就叫做工作空间

    所以工作空间是一个存放项目开发相关文件的文件夹,也是开发过程中存放所有资料的大本营。其具体架构入上所示。

  • 功能包(workspace)

    ROS软件中的基本单元,包含节点源码、配置文件、数据定义等。

  • 节点(node)

    • 节点是ROS中的具体可执行单元,其实就是一个个的可执行文件。
    • 不同的节点相对独立(使用通信机制连接起来),可以使用不同的编程语言实现。
    • 节点用系统中唯一的一个名称来标识。
  • 通信模型

    • 话题(topic)异步通信

      • 话题是节点直接传输数据的重要总线

      • 使用发布/订阅模型,数据由发布者传输到订阅者,同一个话题的订阅者或发布者可以不唯一

      • 话题数据的载体就是消息(message),具有一定的类型和数据结构,使用.msg文件定义

        2

        3

    • 服务(service)同步通信

      • 使用客户端/服务器(C/S)模型,客户端发送请求数据,服务器完成处理后返回应答数据;

      • 使用编程语言无关的.srv文件定义请求和应答数据结构,编译过程中生成对应的代码文件。

        4

        5

ROS文件系统相关命令

  • 1
    2
    3
    catkin_create_pkg 自定义包名 依赖包 === 创建新的ROS功能包

    sudo apt install xxx === 安装 ROS功能包
  • 1
    sudo apt purge xxx ==== 删除某个功能包
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    rospack list === 列出所有功能包

    rospack find 包名 === 查找某个功能包是否存在,如果存在返回安装路径

    roscd 包名 === 进入某个功能包

    rosls 包名 === 列出某个包下的文件

    apt search xxx === 搜索某个功能包
  • 1
    2
    3
    4
    5
    rosed 包名 文件名 === 修改功能包文件

    ## 需要安装 vim

    ## 比如:rosed turtlesim Color.msg
  • 执行

    1.roscore:

    roscore === 是 ROS 的系统先决条件节点和程序的集合, 必须运行 roscore 才能使 ROS 节点进行通信。

    roscore 将启动:

    • ros master
    • ros 参数服务器
    • rosout 日志节点

    用法:

    1
    2
    3
    4
    5
    ## 全部端口
    roscore

    ## 指定端口
    roscore -p xxxx

    2.rosrun:

    rosrun 包名 可执行文件名 === 运行指定的ROS节点

    比如:rosrun turtlesim turtlesim_node

    3.roslaunch

    roslaunch 包名 launch文件名 === 执行某个包下的 launch 文件

ROS简单程序实现

1.3 ROS快速体验 · Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程

根据教程链接一步一步来即可,教程很详细,关于IDE配置也是十分详细。不过因为ROS版本差异,细节略有不同,主要在Python实现程序上。

melodic版本的python版本是2.7,而且melodic的python程序并不需要编译,也不需要配置CmakeList.txt文件,只需要添加可执行权限即可运行。

报错

rosrun helloworld helloworld_p.py时报错

描述

1
File "/home/arvin/02_study/03_ros_melodic/demo01_ws/src/helloworld/scripts/helloworld_p.py", line 4 SyntaxError: Non-ASCII character '\xe7' in file /home/arvin/02_study/03_ros_melodic/demo01_ws/src/helloworld/scripts/helloworld_p.py on line 5, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

原因

因为使用melodic版本的ros默认支持的python版本是2.7。python2中使用ASCII码作为默认编码方式,不支持Unicode字符。

解决

加一行代码# -*-coding:utf-8-*

1
2
3
4
5
6
7
8
9
10
11
12
#! /usr/bin/env python
# -*-coding:utf-8-*

"""
Python 版 HelloWorld

"""
import rospy

if __name__ == "__main__":
rospy.init_node("Hello")
rospy.loginfo("Hello World!!!!")

参考资料:

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

古月居_GuYueHome: 享受机器人学习的乐趣 (gitee.com)