ROS初学笔记

ROS学习历程


搭建ROS开发环境

1.安装ROS Kinetic

2.搭建开发环境

ROS配置
集成开发环境(IDE)

3.安装与TurtleBot3相关的软件

安装TurtleBot3相关的依赖包和TurtleBot3功能包

可视化工具Gazebo的使用,在Gazebo中搭建虚拟环境

创建.sdf,.world文件,使用launch文件调用搭建好的环境
ROS初学笔记


ROS编程基础

创建工作空间与功能包

ROS的构建系统默认使用CMake(Cross Platform Make),其构建环境在功能包目录中的CMakeLists.txt文件中描述。在ROS中,CMake被修改为适合于ROS的“catkin” 构建系统。
Catkin工作空间是创建、修改、编译catkin软件包的目录。

发布者Publisher、订阅者Subscriber的编程实现

如何实现一个发布者

  • 初始化ROS节点;
  • 向ROS Master注册节点信息,包括发布的话题名和话题中的消息类型;
  • 创建消息数据;
  • 按照一定频率循环发布消息。

如何实现一个订阅者

  • 初始化ROS节点;
  • 订阅需要的话题;
  • 循环等待话题消息,接收到消息后进入回调函数;
  • 在回调函数中完成消息处理。

话题消息的定义与使用

  • 定义msg文件;
  • 在package.xml中添加功能包依赖;
  • 在CMakeLists.txt添加编译选项;
  • 编译生成语言相关文件。

客户端Client、服务端Server的编程实现

如何实现一个客户端:

  • 初始化ROS节点;
  • 创建一个Client实例;
  • 发布服务请求数据;
  • 等待Server处理之后的应答结果。

如何实现一个服务端:

  • 初始化ROS节点;
  • 创建Sercer实例;
  • 循环等待服务请求,进入回调函数;
  • 在回调函数中完成服务功能的处理,并反馈应答数据。

服务数据的定义与使用

  • 定义srv文件;
  • 在package.xml中添加功能包依赖;
  • 在CMakeLists.txt添加编译选项;
  • 编译生成语言相关文件。

参数的使用与编程方法

如何获取/设置参数:

  • 初始化ROS节点;
  • get函数获取参数;
  • set函数设置参数。

TF坐标系广播与监听的编程实现

如何实现一个TF广播器:

  • 定义TF广播器(TransformBroadcaster);
  • 创建坐标变换值;
  • 发布坐标变换(sendTransform)。

如何实现一个TF监听器:

  • 定义TF监听器(TransformLisener);
  • 查找坐标变换(waitForTransform、lookupTransform)。

launch启动文件的使用方法

launch文件一般以.launch或.xml结尾,它对ROS需要运行程序进行了打包,通过一句命令来启动。一般launch文件中会指定要启动哪些package下的哪些可执行程序,指定以什么参数启动,以及一些管理控制的命令。launch文件通常放在软件包的 launch/ 路径中中。

launch文件同样也遵循着xml格式规范,是一种标签文本。它的格式包括的标签见:
https://wiki.ros.org/roslaunch/XML


ROS中的TF与URDF

坐标转换TF

ROS中的tf是一个可以让用户随时记录多个坐标系的软件包。tf保持缓存的树形结构中的坐标系之间的关系,并且允许用户在任何期望的时间点在任何两个坐标系之间转换点,矢量等。
tf本质是树状的数据结构,所以我们通常称之为"tf tree"。ROS中机器人模型包含大量的部件,这些部件统称之为link,每一个link上面对应着一个frame,即一个坐标系。link和frame概念是绑定在一起的,tf tree来维护各个坐标系之间的关系。

统一机器人描述格式URDF

URDF(Unified Robot Description Format)统一机器人描述格式,URDF使用XML格式描述机器人文件。

如何制作URDF模型:

  • 添加基本模型
  • 添加机器人link之间的相对位置关系
  • 添加模型的尺寸、颜色等属性
  • 显示URDF模型

ROS中的SLAM和导航

地图

ROS中的地图就是一张普通的灰度图像,通常为pgm格式。这张图像上的黑色像素表示障碍物,白色像素表示可行区域,灰色是未探索的区域。

SLAM应用

  • 准备工作
    安装相关依赖包和软件包。

  • 建图
    打开一个终端,运行现有的环境节点
    roslaunch turtlebot3_gazebo turtlebot3_stage_1.launch
    打开第二个终端,运行键盘控制节点,建图时切换到改终端用键盘控制turtlebot3运动
    roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch
    打开第三个终端,运行slam节点
    roslaunch turtlebot3_slam turtlebot3_slam.launch
    这里重要的是不要过快改变机器人的速度,也不要以过快的速度前进、后退或旋转。移动机器人时,机器人必须扫描要测量的环境的每个角落。这需要经验和技巧,因此需要在大量的SLAM实验中积累经验。

  • 导航
    用刚才保存的地图进行turtlebot3的自主导航仿真实验
    roslaunch turtlebot3_gazebo turtlebot3_house.launch roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:=/home/user/maps/yourmap.yaml
    先使用Rviz中的2D Pose Estimate对机器人的位置进行初始化,再用2D New Goal指定目标进行导航。

Gmapping、Karto