无人驾驶汽车系统入门(十四)——ROS入门与实践(1)

前言:作为目前最广泛使用的开源机器人软件平台,ROS(Robot Operating System)极大的提升了机器人开发的效率。目前无人驾驶系统的实际实现仍然依赖于ROS,作为一个相对成熟的机器人软件平台,ROS虽然存在一些缺点,在无人驾驶系统的系统实现上,ROS仍然是开源框架中最好的选择,这也是为什么诸如Apollo,Autoware等无人驾驶开源项目会选择ROS。本文主要讨论ROS的入门知识,后续的文章会对基于ROS的无人车系统编程进行进一步探讨。

创作不易,转载请注明出处: http://blog.csdn.net/AdamShan/article/details/79653378

ROS简介

ROS是什么?

ROS概念:ROS = Robot Operating System,包括:
1. 通道:ROS提供了一种发布-订阅式的通信框架用以简单、快速地构建分布式计算系
2. 工具:ROS提供了大量的工具组合用以配置、启动、自检、调试、可视化、登录、测试、终止分布式计算系统;
3. 能力:具有控制,规划,预测,定位操纵等功能;
4. 生态系统:ROS的支持与发展依托着一个强大的社区。ros.org尤其关注兼容性和支持文档,提供了一套“一站式”的方案使得用户得以搜索并学习来自全球开发者数以千计的ROS程序包。

ROS的历史

ROS系统是起源于2007年斯坦福大学人工智能实验室的STAIR项目与机器人技术公司Willow Garage的个人机器人项目(Personal Robots Program)之间的合作,2008年之后就由Willow Garage来进行推动。如今已被许多的学校公司所使用。为机器人变成提供了实际标准(Defacto standard)

ROS的特性

  1. 点对点设计:ROS的点对点设计以及服务和节点管理器等机制可以分散由计算机视觉和语音识别等功能带来的实时计算压力,能够适应多机器人遇到的挑战。
  2. 分布式设计:程序可以在多核计算机中运行,并且可以通过网络来通信。
  3. 多语言:ROS现在支持许多种不同的语言,例如C++、Python、Octave和LISP,也包含其他语言的多种接口实现。语言无关的消息处理,让多种语言可以自由的混合和匹配使用。
  4. 轻量级:鼓励将所有的驱动和算法逐渐发展成为和ROS没有依赖性单独的库。ROS建立的系统具有模块化的特点,各模块中的代码可以单独编译,而且编译使用的CMake工具使它很容易的就实现精简的理念。ROS基本将复杂的代码封装在库里,只是创建了一些小的应用程序为ROS显示库的功能,就允许了对简单的代码超越原型进行移植和重新使用。
  5. 免费且开源:ROS大多数的源代码都是公开发布的。

ROS中的概念

需要理解的ROS中的核心概念包括:

  • master(主机)
  • node(节点)
  • topic(主题)
  • message(消息)

Master(主机)

用于管理节点间的通信,ROS Master 通过RPC(Remote Procedure Call Protocol,远程过程调用)提供了登记列表和对其他计算图表的查找。没有控制器,节点将无法找到其他节点,交换消息或调用服务。

开启Master命令:

roscore

Node(节点)

节点就是一些独立编译,执行运算任务的进程。ROS利用规模可增长的方式使代码模块化:一个系统就是典型的由很多节点组成的。在这里,节点也可以被称之为“软件模块”。我们使用“节点”使得基于ROS的系统在运行的时候更加形象化:当许多节点同时运行时,可以很方便的将端对端的通讯绘制成一个图表,在这个图表中,进程就是图中的节点,而端对端的连接关系就是其中弧线连接。

运行节点:

rosrun package_name node_name

查看激活节点列表:

rosnode list

检索有关节点的信息:

rosnode info node_name

Topic(主题)

在ROS中消息以一种发布/订阅的方式传递。一个节点可以在一个给定的主题中发布消息。一个节点针对某个主题关注与订阅特定类型的数据。可能同时有多个节点发布或者订阅同一个主题的消息。总体上,发布者和订阅者不了解彼此的存在。

查看激活主题:

rostopic list

订阅和打印一个主题的内容:

rostopic echo /topic

显示主题相关信息:

rostopic info /topic

Message(消息)

消息用来定义主题topic类型的数据结构,是整型,浮点型,布尔型,字符串等一系列结构进行压缩后,定义成*.msg文件。
查看主题类型:

rostopic type /topic

向topic发布一个消息:
rostopic pub /topic type args

catkin 创建系统
catkin是ROS构建系统,用来生成可执行文件,库和接口。
(现在很多人建议用catkin build 来代替 catkin_make)
首先进入工作区:

cd ~/catkin_ws

然后创建一个包:

catkin_create_pkg package_name depend1 depend2 depend3

每当你创建一个新包时,都需要更新你的环境:

source devel/setup.zsh

在catkin创建的工作区中包含以下三个文件夹:
1. src:这个就是用来存放源码的地方,操作者在这里面进行编码,修改
2. build:用来存放缓存文件和一些中间文件
3. devel:(development)存放创建目标的地方(在存放之前安装)

ROS中的项目组织

ROS的软件使用package(包)进行组织,包下通常包含一下内容:

  • /src: 源代码
  • /msg: 定义一些message
  • /srv: 定义一些service
  • /launch:包含用于启动节点的launch file
  • /config:包含配置文件
  • /test: Unit/ROS tests
  • /include/package_name: C++ include头文件
  • /doc:包含文档文件
  • package.xml: package 信息
  • CMakeLists.txt: CMake构建文件

package.xml

这个文件定义了package的属性,这些属性包括:

  • package的名称
  • 版本号
  • 作者
  • 协议
  • 对其他package的依赖
  • ……

下面是一个简单的例子的package信息:

<?xml version="1.0"?>
<package format="2"><name>ros_practice</name><version>0.0.1</version><description>The ros_practice package</description><maintainer email="your-email@gmail.com">Adam</maintainer><license>MIT</license><buildtool_depend>catkin</buildtool_depend><build_depend>roscpp</build_depend><build_depend>sensor_msg</build_depend><build_export_depend>roscpp</build_export_depend><build_export_depend>sensor_msg</build_export_depend><exec_depend>roscpp</exec_depend><exec_depend>sensor_msg</exec_depend>
</package>

在这个例子中,我们使用了roscpp的client的库,同时我们使用了一个sensor_msg消息。

CMakeLists.txt

CMakeLists.txt文件是CMake构建系统的输入,在这里我们不会详细讨论CMake的写法(因为它本身可以很复杂),我们大致熟悉一下我们常用的CMake的语法:

  • cmake_minimum_required:需要的CMake的最低版本
  • project():包的名称
  • find_package() 查找建构是需要的其他 CMake/Catkin 包
  • add_message_files() add_service_files() add_action_files 生成Message/Service/Action
  • generate_messages() 调用消息生成
  • catkin_package() 指定包的构建信息
  • add_library()/add_executable()/target_link_libraries() 用于构建的库,可执行代码
  • install() 安装规则

下图是一个 CMakeLists.txt 的例子:

基于Husky模拟器的实践

我们使用Husky模拟器来实践ROS编程,Husky本身是一种小型的轮式移动机器人(和我们关注的无人车比较相似),该模拟器基于Gazebo物理仿真环境,Gazebo是一款机器人仿真软件,基于ODE物理引擎,可以模拟机器人以及环境中的很多物理特性,Husky模拟器的安装请参考:
http://wiki.ros.org/husky_gazebo/Tutorials/Simulating%20Husky

如果ros kinetic使用apt安装存在问题的话,请参考:https://answers.ros.org/question/256756/how-to-install-husky-simulator-in-kinetic/

使用roslaunch启动husky模拟器,启动一个空的世界:

roslaunch husky_gazebo husky_empty_world.launch

roslaunch是ROS中启动多个节点的机制,Launch文件是ROS提供的可以同时运行多个nodes的文件。Launch文件以一种特殊的XML格式编写,以.launch结尾。

在运行了模拟器以后使用rqt_graph查看正在运行的节点和话题:

我们发现/gazebo节点订阅了一个/cmd_vel话题,使用rostopic info /husky_velocity_controller/cmd_vel 查看话题信息,得到如下信息:

Type: geometry_msgs/TwistPublishers:* /twist_mux (http://adam:40181/)Subscribers:* /gazebo (http://adam:35678/)

也就是说,这个控制指令是一个geometry_msgs/Twist消息,ROS中我们使用geometry_msgs/Twist消息类型来发布运动命令。控制命令会被基本的控制器节点使用。话题 /cmd_vel 全名 ” command velocities “ 。控制器节点订阅 /cmd_vel 话题,并将里面的运动命令(Twist 消息)通过 PID 控制算法转换成电机信号。使用osmsg show geometry_msgs/Twist查看消息的格式:

geometry_msgs/Vector3 linearfloat64 xfloat64 yfloat64 z
geometry_msgs/Vector3 angularfloat64 xfloat64 yfloat64 z

其中,linear表示线速度(单位:m/s) ;angular表示角速度(单位:rad/s) 。

下面我们在指令行中通过向/husky_velocity_controller/cmd_vel发送Twist消息来驱动我们的小车,我们让它以0.2m/s的速度和0.2rad/s的角速度运动:

rostopic pub -r 10  /husky_velocity_controller/cmd_vel geometry_msgs/Twist '{linear: {x: 4, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0.5}}'

其实我们还可以直接向/cmd_vel主题发消息来控制小车(不信的话可以试试rostopic info /cmd_vel看看订阅它的节点):

rostopic pub -r 10  /cmd_vel geometry_msgs/Twist '{linear: {x: 4, y: 0, z: 0}, angular: {x: 0, y: 0, z: 0.5}}'

接下来我们使用手柄来控制Husky机器人,我们使用teleop_twist_joy包来实现对手柄数据转换为Twist指令并将Twist发布到/cmd_vel主题,启动teleop_twist_joy下的launch文件:

roslaunch teleop_twist_joy teleop.launch

启动后会在终端打印如下的信息:

PARAMETERS* /joy_node/autorepeat_rate: 20* /joy_node/deadzone: 0.3* /joy_node/dev: /dev/input/js0* /rosdistro: kinetic* /rosversion: 1.12.12* /teleop_twist_joy/axis_angular: 0* /teleop_twist_joy/axis_linear: 1* /teleop_twist_joy/enable_button: 8* /teleop_twist_joy/enable_turbo_button: 10* /teleop_twist_joy/scale_angular: 0.4* /teleop_twist_joy/scale_linear: 0.7* /teleop_twist_joy/scale_linear_turbo: 1.5NODES/joy_node (joy/joy_node)teleop_twist_joy (teleop_twist_joy/teleop_node)

下面的NODES表示启动了joy_nodeteleop_node两个节点,它们分别位于joyteleop_twist_joy两个包中,上面是启动文件的参数信息,我们着重看一下三个参数:

 * /teleop_twist_joy/axis_angular: 0* /teleop_twist_joy/axis_linear: 1* /teleop_twist_joy/enable_button: 8

其中enable_button表示必须要按下该按键(8号按键,在我的手柄上是back键)才能控制,前面两个分别表示控制速度和角速度的按钮(在我的手柄上是左摇杆)

Note: Husky作为一种轮式机器人,其能够控制的速度只有x方向的速度(前向)和z方向的角速度(Yaw,偏航角速度)

我们看一下此时的rqt_graph:

至此,命令行下的ros操作相信大家都熟悉并理解了,后面我们开始ROS编程部分。

无人驾驶汽车系统入门(十四)——ROS入门与实践(1)相关推荐

  1. 无人驾驶汽车系统入门(二十六)——基于深度学习的实时激光雷达点云目标检测及ROS实现

    无人驾驶汽车系统入门(二十六)--基于深度学习的实时激光雷达点云目标检测及ROS实现 在前两篇文章中,我们使用PCL实现了在点云中对地面的过滤和点云的分割聚类,通常来说,在这两步以后我们将对分割出来的 ...

  2. 无人驾驶汽车系统入门(二十五)——基于欧几里德聚类的激光雷达点云分割及ROS实现

    无人驾驶汽车系统入门(二十五)--基于欧几里德聚类的激光雷达点云分割及ROS实现 上一篇文章中我们介绍了一种基于射线坡度阈值的地面分割方法,并且我们使用pcl_ros实现了一个简单的节点,在完成了点云 ...

  3. 无人驾驶汽车系统入门(二十八)——基于VoxelNet的激光雷达点云车辆检测及ROS实现

    无人驾驶汽车系统入门(二十八)--基于VoxelNet的激光雷达点云车辆检测及ROS实现 前文我们提到使用SqueezeSeg进行了三维点云的分割,由于采用的是SqueezeNet作为特征提取网络,该 ...

  4. 无人驾驶汽车系统入门(十六)——最短路径搜索之A*算法

    无人驾驶汽车系统入门(十六)--最短路径搜索之A*算法 路线规划中一个很核心的问题即最短路径的搜索,说到最短路径的搜索我们就不得不提A*算法,虽然原始的A*算法属于离散路径搜索算法(我们的世界是连续的 ...

  5. 无人驾驶汽车系统入门(二十二)——使用Autoware实践激光雷达与摄像机组合标定

    无人驾驶汽车系统入门(二十二)--使用Autoware实践激光雷达与摄像机组合标定 单目相机分辨率高,我们可以使用各种深度学习算法完成对目标检测,但是缺乏深度,坐标等信息.激光雷达能够获得目标相当精确 ...

  6. 无人驾驶汽车系统入门(十八)——使用pure pursuit实现无人车轨迹追踪

    无人驾驶汽车系统入门(十八)--使用pure pursuit实现无人车轨迹追踪 对于无人车辆来说,在规划好路径以后(这个路径我们通常称为全局路径),全局路径由一系列路径点构成,这些路径点只要包含空间位 ...

  7. 无人驾驶汽车系统入门(十二)——卷积神经网络入门,基于深度学习的车辆实时检测

    无人驾驶汽车系统入门(十二)--卷积神经网络入门,基于深度学习的车辆实时检测 上篇文章我们讲到能否尽可能利用上图像的二维特征来设计神经网络,以此来进一步提高识别的精度.在这篇博客中,我们学习一类专门用 ...

  8. 无人驾驶汽车系统入门(十)——基于运动学模型的模型预测控制

    无人驾驶汽车系统入门(十)--基于运动学模型的模型预测控制 在前面的第五篇博客中,我们介绍了两种常见的车辆模型--运动学自行车模型和动力学自行车模型,本节我们基于运动学车辆模型引入一种新的控制理论-- ...

  9. “无人驾驶汽车系统入门”博客专栏

    "无人驾驶汽车系统入门"专栏链接地址: https://blog.csdn.net/column/details/28410.html?&page=1 前言:随着深度学习近 ...

  10. 无人驾驶汽车系统入门

    无人驾驶汽车系统入门(一)--卡尔曼滤波与目标追踪 链接:https://blog.csdn.net/adamshan/article/details/78248421 无人驾驶汽车系统入门(二)-- ...

最新文章

  1. Soft-to-Hard Vector Quantization for End-to-End Learning Compressible Representations
  2. RocketMQ 基本概念
  3. linux apache两种工作模式详解
  4. Linux 系统启动流程图/系统初始化流程图
  5. K-Means算法Demo
  6. begintrans返回值_SQL事务回滚 ADO BeginTrans, CommitTran 以及 RollbackTrans 方法
  7. 【Elasticsearch】all shards failed no shard available for get .xxx[doc] routing null
  8. Selenium 编写第一个自动化脚本
  9. 没有电脑可以学习python_有没有适合初学者学习Python的方法?
  10. ios开发之获取版本号,部分设备信息
  11. 说说PMO 的工作思路
  12. 【学习】把自己的电脑创建成ftp服务器,用Cuteftp软件上传文件和下载文件。
  13. 7-4 华氏度转摄氏度 (5分) java
  14. Android-TextView添加字体库
  15. 总体均值的区间估计和习题
  16. C语言基础知识复习(1)
  17. 在macOS下如何格式化磁盘
  18. Jmeter如何进行接口测试-实操
  19. fl2440串口编程
  20. 申请软著需要什么材料,多长时间下证?

热门文章

  1. IDEA 插件开发 - 创建自定义私有仓库
  2. 实时增量学习在云音乐直播推荐系统中的工程实践
  3. 旧版本ios软件整理
  4. MySQL配置+SQLyog安装教程
  5. word文档字体段落文档格式标准设置(个人)
  6. 身份证号码验证处理工具类
  7. 安装torch与luarocks的一些问题
  8. CS61C 学习笔记 --实时更新
  9. 服务器子接口配置的几种方式:子接口模式、vlan模式
  10. 【一周头条盘点】中国软件网(2018.1.15~2018.1.19)