文章目录
前言
- 转载自古月居,谢谢大佬的指导
- 视频链接见B站古月居
概述
- ROS全名为机器人操作系统
- ROS分为四部分,如下图
Linux简述
安装比较
-
虚拟机安装:复制系统镜像文件,容易在其他机器上运行
-
安装步骤:安装VMware——>安装全屏工具——>设置拔除镜像(具体见视频)
重点回顾
-
Windows是不同盘,而Linux是只有一个盘,但有不同文件夹
-
软件中心配置软件源便于下载
-
CTRL+ALT+T为打开终端的快捷键
常用命令
-
pwd:查看当前终端所在路径
-
默认打开的终端路径在用户目录下
-
sudo apt-get update:用于更新软件源列表
python与C++
- 安装C++编译器和python解析器
- python是不需要编译的解析性语言
循环
- C程序要先编译,然后运行可执行文件
- python程序直接运行
- iostream包含系统库和函数
- -o表示生成可执行文件
- ./用于运行程序或脚本
面向对象
安装ROS系统
- 安装参考官方文档
- 配置软件库
- 见下图
-
添加ROS软件源,因为ROS有单独镜像维护
-
安装前需要对照密钥,所以要添加秘钥
-
sudo apt update:从各种软件源的链接中去更新软件源的所有安装路径
-
更改热点,下载成功率inc
-
若更新软件源成功——>则将下载软件源下载地址更新到本地
-
rosdep:用于完成功能包依赖的设置和安装
-
rosdep update:更新软件源列表,确认每个版本间的依赖,具体地为从远程服务器上来更新不同ROS版本
-
设置环境变量:告诉系统ROS命令行的位置,类比Windows系统的环境变量
-
bashrc:终端配置文件
-
source命令用于运行脚本
-
ros+tab可显示ROS相关命令
ROS关键概念
通信机制
节点和节点服务器
话题通信
服务通信
比较
- 话题方式:单向传输方式
- topic:数据管道
- 服务:双向
- 缓冲区:用于发送方与接收方的速度匹配
- 服务通信方式:请求一次,响应一次,中间阻塞等待
参数服务器
- 全局共享对象字典
文件系统
- 松耦合式分布式通信
- 节点图=计算图
- ctrl+H:可显示隐藏文件
ROS常用命令
实例
命令行发布消息和调用服务
-
rosrun + 功能包 +节点
-
rqt_graph:计算图
-
rosout: ros启动后的默认启动节点,用于采集所有节点信息
-
命令行方式控制海龟运动
-
pub即通过命令行方式进行发布+topic+消息类型+消息内容
-
-r 10表示间隔10地循环进行publish
话题记录
- 默认保存在当前终端所在目录
- -a:-all
- -o表示保存为压缩文件
工作空间和功能包
-
工作空间:理解为工程目录
-
代码空间:存放功能包及其配置文件以及launch文件
-
编译空间:编译中所产生的中间文件,即二进制文件
-
开发空间:编译生成的可执行文件,库,脚本
-
install:安装空间,使用安装指令时的默认文件存储位置
单独使用它或者其后跟一个斜线(~/),代表了当前用户的宿主目录。
(在shell下可以通过命令“echo ~(~\)”来查看)。
例如“~/bin”代表“/home/username/bin/”(当前用户宿主目录下的bin目录)
-
主文件夹:自己用户名命名的目录下
-
catkin_ws可以不同,但后面的src一定要相同
-
要在工作空间的根目录上进行编译
-
install,dev功能类似,install更多强调在开发后分享给客户使用的结果文件
-
源码要放在功能包中
-
include文件夹:包含头文件等
-
source的原因:运行前要设置环境变量
-
package.xml:描述功能包的元信息,如作者,依赖的其他功能包等
-
CMakeLists:描述编译规则,即定义怎么编译源代码
发布者编程实现
- 发布者向topic发布Twist类型的topic,订阅者订阅该topic
创建功能包
发布者代码
- 初始化
- 注册节点,设置队列长度
- 创建消息数据
- 循环发布消息
- 节点句柄NodeHandle:用于管理ROS相关的API资源
- 设置消息队列的原因:底层以太网可能无法快速响应发布的频率,所以基本流程如下:
- 消息先存储在队列中,然后队列通过底层以太网的rostopic的TCP通讯机制发送消息
配置编译规则
- target_link_libraries:用于可执行文件的链接
编译并运行发布者
- 为了不用每次都source,所以在bashrc文件中,即终端配置文件中添加如下语句
- 最后一行语句是工作空间的setup.bash所在位置,通过此设置可找到相关功能包位置
python实现
- python文件不需要编译,但要注意设置属性为允许作为程序执行文件
订阅者
订阅者实现
- 回调函数不能处理时间过长,不然队列积压严重,因为只有当前回调函数处理完,才会处理下一个
- 接收队列存在意义:若积压严重,队列会抛出最老的数据
配置编译规则
编译并运行订阅者
python实现
- python文件不用编译,直接运行
话题消息定义与使用
自定义话题消息
-
消息定义文件与语言无关,所以在CMakeLists.txt时要添加编译选项,便于转化为其所对应的编程语言类型
-
添加功能包依赖:
- 添加了生成消息的功能包依赖
- 添加了动态生成的功能包依赖
-
编译选项中的std_msgs是自定义消息文件时所依赖的包
-
宏定义的调用方式
-
含有动态生成的代码,需要让可执行文件和动态生成的程序产生依赖关系
-
动态地和通过Person.msg生成的头文件进行连接
-
即用于和自定义的消息进行连接
-
roscore:婚介所角色
-
关注如何引入自定义消息接口
订阅者代码
配置编译规则
编译与运行
python实现
- 具体地如下图所示:
服务
- 服务模型:客户端+服务器
客户端实现
创建功能包
客户端代码
- waitForService:阻塞式服务,用于发现服务
- call方法:阻塞式方法
配置编译规则
编译并运行
python实现
- target_link_libraries:需要链接ROS相关的库
- 创建工作空间
- 创建功能包
- 创建源代码
- 设置编译规则
- 工作空间根目录编译
- 针对服务的标准定义:trigger数据类型
- 注意source有无的原因
- spinonce队列中没有数据,则继续执行,否则去回调
- python中spin是死循环
服务端实现
C语言实现
配置编译规则
编译并运行服务器
python实现
- 第一个函数为发布器内容
- 第二个函数为服务的回调函数
- 第三个号函数为创建服务
- 服务内容:使用publisher进行发布
服务数据的定义与使用
自定义服务数据
服务器代码
客户端代码
配置编译规则
编译与运行
python实现
服务器
客户端
-
—来分隔请求和响应
-
根据定义产生对应的头文件
-
添加动态生成message的依赖的功能包
-
使用编译产生的头文件
-
add_dependencies:添加动态生成的CPP头文件
-
spin:一直死循环
-
和动态生成的头文件进行依赖
参数服务器
-
保存各个节点的配置参数
-
全局变量的存储空间
创建功能包
参数命令行使用
程序实现
-
YAML参数文件
-
获取参数的方式
-
改变RGB值,然后向sim请求,才能生效
-
保存在终端当前路径
配置编译规则
编译与运行
python实现
ROS坐标管理系统
坐标变换基础
命令行工具与可视化工具
-
底层机制:广播监听机制
-
坐标系保存在TF树中
-
launch理解为启动脚本文件
-
rosrun tf view_frames
-
根坐标系+目标坐标系
-
RPY:XYZ轴旋转
-
rviz:三维可视化平台
-
fixed frame +add tf
TF坐标系广播和监听编程实现
广播代码
监听器代码
设置编译规则
编译并运行
python实现
广播器
监听器
-
重映射
-
创建广播器
-
是否存在——>查找变换关系
-
最大等待时间和查询时间
-
节点名字的重映射
-
通过参数设置获取海龟名字
launch启动文件
基本语法
参数设置
实例
-
启动launch文件,则自动启动roscore
-
ns:用于给节点配置命名空间
-
args:用于给节点配置参数
-
重映射=重命名,之前名字失效
-
连接其他库中的功能,本身没有可编程内容
创建launch文件夹,存放launch文件
关注param内外区别:有无命名空间
可视化工具
rviz
gazebo
显示插件标准已经定义好,按照标准数据结构发布,则可显示
添加图像显示插件(项)——>选择对应的图像的话题
roscore
rosrun rviz(功能包) rviz(执行文件名)
roslaunch gazebo
ros_control框架
moveit移动机械臂
课程总结
机器人控制与仿真
资源推荐
Moveit
集成化的功能包
moveJ
moveP
能够自主避障
关节空间和工作空间