ROS(二)基础
文档维护:Arvin
网页部署:Arvin
▶
写在前面:本文旨在记录学习ROS过程中的一些重要知识概念和遇到的错误问题。主要参考赵虚左老师的ROS课程(第一个参考链接),由于赵老师用的noetic版本,而我用的是melodic版本,细节上可能会有所差异。
ROS基础知识
ROS文件基础架构
ROS文件系统指的是在硬盘上ROS源代码的组织形式,其结构大致可以如图所示:
1 | WorkSpace --- 自定义的工作空间 |
ROS核心概念
-
工作空间(workspace)
在ROS机器人开发中,我们针对机器人某些功能进行代码开始时,各种编写的代码、参数、脚本等文件,也需要放置在某一个文件夹里进行管理,这个文件夹在ROS系统中就叫做工作空间。
所以工作空间是一个存放项目开发相关文件的文件夹,也是开发过程中存放所有资料的大本营。其具体架构入上所示。
-
功能包(workspace)
ROS软件中的基本单元,包含节点源码、配置文件、数据定义等。
-
节点(node)
- 节点是ROS中的具体可执行单元,其实就是一个个的可执行文件。
- 不同的节点相对独立(使用通信机制连接起来),可以使用不同的编程语言实现。
- 节点用系统中唯一的一个名称来标识。
-
通信模型
-
话题(topic)异步通信
-
话题是节点直接传输数据的重要总线
-
使用发布/订阅模型,数据由发布者传输到订阅者,同一个话题的订阅者或发布者可以不唯一
-
话题数据的载体就是消息(message),具有一定的类型和数据结构,使用.msg文件定义
-
-
服务(service)同步通信
-
使用客户端/服务器(C/S)模型,客户端发送请求数据,服务器完成处理后返回应答数据;
-
使用编程语言无关的.srv文件定义请求和应答数据结构,编译过程中生成对应的代码文件。
-
-
ROS文件系统相关命令
-
增
1
2
3catkin_create_pkg 自定义包名 依赖包 === 创建新的ROS功能包
sudo apt install xxx === 安装 ROS功能包 -
删
1
sudo apt purge xxx ==== 删除某个功能包
-
查
1
2
3
4
5
6
7
8
9rospack list === 列出所有功能包
rospack find 包名 === 查找某个功能包是否存在,如果存在返回安装路径
roscd 包名 === 进入某个功能包
rosls 包名 === 列出某个包下的文件
apt search xxx === 搜索某个功能包 -
改
1
2
3
4
5rosed 包名 文件名 === 修改功能包文件
# 需要安装 vim
# 比如:rosed turtlesim Color.msg -
执行
1.
roscore
:roscore === 是 ROS 的系统先决条件节点和程序的集合, 必须运行 roscore 才能使 ROS 节点进行通信。
roscore 将启动:
- ros master
- ros 参数服务器
- rosout 日志节点
用法:
1
2
3
4
5# 全部端口
roscore
# 指定端口
roscore -p xxxx2.
rosrun
:rosrun 包名 可执行文件名 === 运行指定的ROS节点
比如:
rosrun turtlesim turtlesim_node
3.
roslaunch
roslaunch 包名 launch文件名 === 执行某个包下的 launch 文件
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 | #! /usr/bin/env python |
参考资料: