ROS初学笔记

ROS学习历程


文章目录

  • ROS学习历程
    • 搭建ROS开发环境
      • 1.安装ROS Kinetic
      • 2.搭建开发环境
      • 3.安装与TurtleBot3相关的软件
    • 可视化工具Gazebo的使用,在Gazebo中搭建虚拟环境
    • ROS编程基础
      • 创建工作空间与功能包
      • 发布者Publisher、订阅者Subscriber的编程实现
      • 话题消息的定义与使用
      • 客户端Client、服务端Server的编程实现
      • 服务数据的定义与使用
      • 参数的使用与编程方法
      • TF坐标系广播与监听的编程实现
      • launch启动文件的使用方法
    • ROS中的TF与URDF
      • 坐标转换TF
      • 统一机器人描述格式URDF
    • ROS中的SLAM和导航
      • 地图
      • SLAM应用
      • 局部导航算法

搭建ROS开发环境

1.安装ROS Kinetic

2.搭建开发环境

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

3.安装与TurtleBot3相关的软件

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

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

创建.sdf,.world文件,使用launch文件调用搭建好的环境
Gazebo界面


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指定目标进行导航。

局部导航算法

导航功能包中的各个组成部分:

在ROS中,进行导航需要使用到的三个包是:
(1) move_base:根据参照的消息进行路径规划,使移动机器人到达指定的位置;
(2) gmapping:根据激光数据(或者深度数据模拟的激光数据)建立地图;
(3) amcl:根据已经有的地图进行定位。
在负责路径规划的move_base包中主要包含两个部分,全局路径规划(global planner)和局部路径规划(local planner)

● 全局路径规划(global planner):根据给定的目标位置进行总体路径的规划,在ROS的导航中,首先会通过全局路径规划,计算出机器人到目标位置的全局路线。这一功能是navfn这个包实现的。navfn通过Dijkstra或A*等最优路径的算法,计算costmap上的最小花费路径,作为机器人的全局路线。

全局路径规划所依赖的算法有以下几种,感兴趣的朋友可以去研究一下:A*、Dijstra、prm、人工势场、单元分解、快速搜索树(RRT)等

● 局部路径规划(local planner):根据附近的障碍物进行躲避路线规划。本地的实时规划是利用base_local_planner包实现的。该包使用Trajectory Rollout 和Dynamic Window approaches算法计算机器人每个周期内应该行驶的速度和角度(dx,dy,dtheta velocities)。

base_local_planner这个包通过地图数据,通过算法搜索到达目标的多条路经,利用一些评价标准(是否会撞击障碍物,所需要的时间等等)选取最优的路径,并且计算所需要的实时速度和角度。

其中,Trajectory Rollout 和Dynamic Window approaches算法的主要思路如下:

(1) 采样机器人当前的状态(dx,dy,dtheta);
(2) 针对每个采样的速度,计算机器人以该速度行驶一段时间后的状态,得出一条行驶的路线。
(3) 利用一些评价标准为多条路线打分。
(4) 根据打分,选择最优路径。
(5) 重复上面过程。

你可能感兴趣的:(笔记)