ros操作系统入门_ros系统-程序员宅基地

技术标签: SLAM  

ros

ROS是一个用于开发机器人应用程序的、类似操作系统的机器人软件平台。ROS提供开发机器人应用程序时所需的硬件抽象、子设备控制,以及机器人工程中广泛使用的传感、识别、绘图、运动规划等功能。此外ROS还提供进程之间的消息解析、功能包管理、库和丰富的开发及调试工具。

ros是一种分布式机器人操作系统,依赖于linux(一般支持的linux系统有ubuntu系列debian系列),由斯坦福发布,目前,很多机器人的研究都是基于它。其基本框架如下:

 

上图是一个在机器人上跑起来的ros的整体框架图,下面我的介绍会依次从 安装、环境配置、文件系统、通信机制、基础实践 来展开。

在Ubuntu16.04上安装ros

ros有很多的版本,一般都是和linux系统的版本绑定的,在Ubuntu16.04上,我们可以安装的是kinetic版本。安装过程可以按照官网教程进行,建议直接安装desktop−full版

安装完毕记得照着教程初始化rosdep设置环境、安装一些用于构建包的依赖

ros的环境管理

在ros安装完毕后,我们会将source /opt/ros/kinetic/etc/ros写入到~/.bashrc中,这样每次打开终端,会自动设置ros相关的环境变量

同时,通常除了系统的环境变量外,我们基于ros的开发通常会存在于一个工作空间中,在这个工作空间中我们也会新建一些包,此时我们也会需要导入这个工作空间的环境变量,使用source ws/devel/setup.bash

ros文件系统

ros文件系统主要指的是在硬盘上ROS源代码的组织形式。主要有包(package)元包(meta package)工作空间(workspace)等概念。

工作空间

通常工作空间是我们开发某个应用的地方,在这里我们会新开发出一些专用的包来共我们的应用(node)使用。

  • 创建一个名叫catkin_ws的工作空间
    mkdir -p ~/catkin_ws/src
    cd ~/catkin_ws
    catkin_make
    source /devel/setup.bash
    

功能包(package)是构成ROS的基本单元。ROS应用程序是以功能包为单位开发的。功能包包括至少一个以上的节点或拥有用于运行其他功能包的节点的配置文件。它还包含功能包所需的所有文件,如用于运行各种进程的ROS依赖库、数据集和配置文件等。

  • 在工作空间中创建new_package,依赖于depend_p1depend_p2
    cd ~/catkin_ws/src
    catkin_create_pkg new_package depend_p1 depend_p2 
    

  • 查看一个包的直接依赖rospack depends1 new_packsge

  • 查看一个包的所有依赖(包括直接与间接)rospack depends new_package

  • 编译包,直接编译整个工作空间就可以了
    cd ~/catkin_ws
    catkin_make
    

元功能包(metapackage)是一个具有共同目的的功能包的集合。例如,导航元功能包包含AMCL、DWA、EKF和map_server等10余个功能包。

常用命令

  • 查找ros包  roscpp:rospack find roscpp

  • 进入ros文件系统的某个目录下:roscd 包名称/子目录

  • 查看ros包的保存路径echo $ROS_PACKAGE_PATH,结果应该为ros系统目录下的包路径与你当前的工作空间的ros包路径,比如:/home/sky/catkin_ws/src:/opt/ros/kinetic/share

  • 罗列ros文件系统某个目录rosls 包名称/子目录

  • ros命令行工具支持tab自动补全功能

  • 使用rosed快速编辑指定文件(默认编辑器是vim):rosed [package_name] [filename],例如rosed roscpp Logger.msg

ros节点

主节点

主节点(master)负责节点到节点的连接和消息通信,类似于名称服务器(Name Server)。roscore是它的运行命令,当您运行主节点时,可以注册每个节点的名字,并根据需要获取信息。没有主节点,就不能在节点之间建立访问和消息交流(如话题和服务)。

主节点使用XML远程过程调用(XMLRPC,XML-Remote Procedure Call)与节点进行通信。XMLRPC是一种基于HTTP的协议,主节点不与连接到主节点的节点保持连接。换句话说,节点只有在需要注册自己的信息或向其他节点发送请求信息时才能访问主节点并获取信息。通常情况下,不检查彼此的连接状态。由于这些特点,ROS可用于非常大而复杂的环境。XMLRPC也非常轻便,支持多种编程语言,使其非常适合支持各种硬件和语言的ROS。

当启动ROS时,主节点将获取用户设置的ROS_MASTER_URI变量中列出的URI地址和端口。除非另外设置,默认情况下,URI地址使用当前的本地IP,端口使用11311。

普通节点

节点(node)是指在ROS中运行的最小处理器单元。可以把它看作一个可执行程序。在ROS中,建议为一个目的创建一个节点,建议设计时注重可重用性。例如,在移动机器人的情况下,为了驱动机器人,将每个程序细分化。也就是说,使用传感器驱动、传感器数据转换、障碍物判断、电机驱动、编码器输入和导航等多个细分节点。

节点在运行的同时,向主节点注册节点的名称,并且还注册发布者(publisher)订阅者(subscriber)服务服务器(service server)服务客户端(service client)的名称,且注册消息形式、URI地址和端口。基于这些信息,每个节点可以使用话题和服务与其他节点交换消息。

节点使用XMLRPC与主站进行通信,并使用TCP/IP通信系列的XMLRPC或TCPROS进行节点之间的通信。节点之间的连接请求和响应使用XMLRPC,而消息通信使用TCPROS,因为它是节点和节点之间的直接通信,与主节点无关。URI地址和端口则使用存储于运行当前节点的计算机上的名为ROS_HOSTNAME的环境变量作为URI地址,并将端口设置为任意的固有值。

ros节点是整个机器人控制系统的一个功能单元,运行起来一个ros节点,即运行一个ros程序包中的一个可执行文件。例如rosrun turtlesim turtle_teleop_key

ros系统在启动之前,首先需要运行rosore,我们可以将node看做ros操作系统上的应用软件。

roslaunch

使用rosrun每次只能启动一个节点,我们可以使用roslaunch来启动定义在launch文件中的多个节点。

用法:roslaunch [package] [filename.launch]

launch文件语法解析,运行如下launch文件会启动两个节点

<launch>

  <group ns="turtlesim1">
    <node pkg="turtlesim" name="sim" type="turtlesim_node"/>
  </group>

  <group ns="turtlesim2">
    <node pkg="turtlesim" name="sim" type="turtlesim_node"/>
  </group>

  <node pkg="turtlesim" name="mimic" type="mimic">
    <remap from="input" to="turtlesim1/turtle1"/>
    <remap from="output" to="turtlesim2/turtle1"/>
  </node>

</launch>

ros通信(计算图级网络形式)

了解ros的通信主要需要了解以下四个概念:节点(node)消息(messages)话题(topic)服务(service)动作(action)

ros消息(msg)

节点之间通过消息(message)来发送和接收数据。消息是诸如integer、floating point和boolean等类型的变量。用户还可以使用诸如消息里包括消息的简单数据结构或列举消息的消息数组的结构。使用消息的通信方法包括TCPROS,UDPROS等,根据情况使用单向消息发送/接收方式的话题(topic)和双向消息请求(request)/响应(response)方式的服务(service)。

msg文件就是一个描述ROS中所使用消息类型的简单文本。通常msg文件存放在epackage的msg目录下

ros中在一个包里消息msg与服务srv的创建教程详细可以查看官网教程

ros话题(topic)

ros话题是ros中不同节点之间的一种通信方式,一个节点在一个话题上发布消息,另一个节点订阅该话题以接收该消息。

我们通常使用rostopic来进行话题的相关操作

rostopic -h
rostopic is a command-line tool for printing information about ROS Topics.

Commands:
    rostopic bw display bandwidth used by topic
    rostopic delay  display delay of topic from timestamp in header
    rostopic echo   print messages to screen
    rostopic find   find topics by type
    rostopic hz display publishing rate of topic    
    rostopic info   print information about active topic
    rostopic list   list active topics
    rostopic pub    publish data to topic
    rostopic type   print topic or field type

Type rostopic <command> -h for more detailed usage, e.g. 'rostopic echo -h'


话题(topic)就是“故事”。在发布者(publisher)节点关于故事向主节点注册之后,它以消息形式发布关于该故事的广告。希望接收该故事的订阅者(subscriber)节点获得在主节点中以这个话题注册的那个发布者节点的信息。基于这个信息,订阅者节点直接连接到发布者节点,用话题发送和接收消息。

ros的服务

服务(service)是ros提供的一种同步双向消息通信。其中服务客户端请求对应于特定目的任务的服务,而服务服务器则负责服务响应。

使用rosservice可以轻松使用ros客户端、服务器框架提供的服务。

rosservice list         输出可用服务的信息
rosservice call         调用带参数的服务
rosservice type         输出服务类型
rosservice find         依据类型寻找服务find services by service type
rosservice uri          输出服务的ROSRPC uri

一个srv文件描述一项服务。它包含两个部分:请求与响应。一般rv文件存放在package的srv目录下。

动作

动作(action)是在需要像服务那样的双向请求的情况下使用的消息通信方式,不同点是在处理请求之后需要很长的响应,并且需要中途反馈值。动作文件也非常类似于服务,目标(goal)和结果(result)对应于请求和响应。此外,还添加了对应于中途的反馈(feedback)。它由一个设置动作目标(goal)的动作客户端(action client)和一个动作服务器(action server),动作服务器根据目标执行动作,并发送反馈和结果。

动作客户端动作服务器之间进行异步双向消息通信

发布与发布者

发布(publish)是指以与话题的内容对应的消息的形式发送数据。为了执行发布,发布者(publisher)节点在主节点上注册自己的话题等多种信息,并向希望订阅的订阅者节点发送消息。发布者在节点中声明自己是执行发布的个体。单个节点可以成为多个发布者。

订阅与订阅者

订阅是指以与话题内容对应的消息的形式接收数据。为了执行订阅,订阅者节点在主节点上注册自己的话题等多种信息,并从主节点接收那些发布此节点要订阅的话题的发布者节点的信息。基于这个信息,订阅者节点直接联系发布者节点来接收消息。订阅者在节点中声明自己执行订阅的个体。单个节点可以成为多个订阅者。

发布和订阅概念中的话题异步,这是一种根据需要发送和接收数据的好方法。另外,由于它通过一次的连接,发送和接收连续的消息,所以它经常被用于必须连续发送消息的传感器数据。然而,在某些情况下,需要一种共同使用请求和响应的同步消息交换方案。因此,ROS提供叫做服务(service)的消息同步方法。服务分为响应请求服务服务器和请求后接收响应服务客户端。与话题不同,服务是一次性的消息通信。当服务的请求和响应完成时,两个节点的连接被断开。

发布者、订阅者、服务服务器、服务客户端、动作服务器和动作客户端都存在于不同的节点中,这些节点需要连接才能进行消息通信。这时候,主节点是帮助节点之间的连接。主节点就像节点名称、话题和服务、动作名称、URI地址和端口以及参数们的名称服务器。换句话说,节点同时向主节点注册自己的信息,并从主节点获取其他节点希望通过主节点访问的节点的信息。然后,节点和节点直接连接进行消息通信。

ros中的参数

ros中还存在参数服务器(由主节点维护),上面存储一些服务的参数设置,参数可以看作是节点中使用的全局变量。可以使用rosparam进行如下操作

rosparam set            设置参数
rosparam get            获取参数
rosparam load           从文件读取参数
rosparam dump           向文件中写入参数
rosparam delete         删除参数
rosparam list           列出参数名

ros基础案例

总结

这篇博客主要是对ros的整体概念进行介绍,并且介绍了ros官网基础教程中我个人认为最值得介绍的点。至此,ros的入门算是基本完成了,接下来就是需要使用仿真或者实战对ros进行进一步的操作与体验了。

 

 

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42518956/article/details/107620853

智能推荐

OpenStack之keystone(身份认证服务)_openstack中最重要的身份服务是什么?是如何运作的?-程序员宅基地

文章浏览阅读5.3k次。keystone概述概念Keystone (OpenStack ldentity Service)是OpenStack中的一个独立的提供安全认证的模块,主要负责openstack用户的身份认证、令牌管理、提供访问资源的服务目录、以及基于用户角色的访问控制。Keystone类似一个服务总线,或者说是整个Openstack框架的注册表,其他服务通过keystone来注册其服务的Endpoint(服务访问的URL),任何服务之间相互的调用,需要经过Keystone的身份验证,来获得目标服务的Endpoi_openstack中最重要的身份服务是什么?是如何运作的?

Vuejs2.0开发仿QQ音乐webpp案例分析-程序员宅基地

文章浏览阅读2.1k次。仿QQ音乐webapp是基于Vue2.0,vuex,vue-router,axios和html5的flexible box布局与及css3的transform,animation,transition组成。Vuejs是一套MVVM框架,主要注重于view层,实现数据双向绑定与及虚拟DOM,解放你的双手,让你不用直接和真实的DOM进行操作,只要数据改变,vue自动检查DOM结构不同,更新DOM元素..._webpp

实现多模交互融合的四个阶段-程序员宅基地

文章浏览阅读2.9k次。多模交互融合是普适计算和自然交互中最重要的组成部分。笔者认为,实现完整的多模交互融合需要分成四个阶段,分别为独立工作阶段、初步融合阶段、语义理解阶段和任务自适应阶段。01独立工作阶段各自..._多模态融合阶段

C++设计模式-建造者模式-程序员宅基地

文章浏览阅读5.2k次,点赞23次,收藏25次。目录基本概念代码与实例基本概念建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。建造者模式是在当创建复杂对象的算法应该独立于该对象的组成部分以及它们装配方式时适用的模式。下面给出一个UML实例:代码与实例程序运行截图如下:源码如下:Head.h#include ..._建造者模式

苹果手机怎么录屏 苹果录屏方法步骤详解-程序员宅基地

文章浏览阅读1.3w次。苹果手机使用的是ios苹果系统,在操作上与传统的安卓手机相比会有一定差异,因此一些刚使用苹果手机的网友会不清楚一些基础功能的使用方法,比如苹果手机录屏等。2、需要录屏的时候直接打开控制中心,点击屏幕录制图标,倒计时3秒之后开始录屏,想要结束录屏直接点击左上方的红色区域,然后点击停止即可,录制的视频就自动保存到相册中了。我们还可以使用第三方的工具进行苹果手机录屏,而且体验更多更丰富的功能。3、这些都设置好之后就可以开始录屏,在录屏开始前可以开启摇一摇结束录屏的功能,想要结束录屏的时候只需要晃动手机就可以。_苹果手机怎么录屏

error: resource android:attr/fontVariationSettings not found. (flutter项目解决方案)-程序员宅基地

文章浏览阅读3.1k次。原因:是编译的targer SDK版本过低(support v7-28.0.0会包这个问题)纯android项目只需要修改build.gradle中 compileSdkVersion 版本>=28。flutter项目,稍微有些不一样。flutter用的一些插件有些compileSdkVersion需要单独改。这是我的错误,如下:FAILURE: Build failed with an exception. ..._error: resource android:attr/fontvariationsettings not found.

随便推点

微软Windows操作系统全面兼容机器人操作系统ROS1和ROS2_ros2_java for windows-程序员宅基地

文章浏览阅读7.4k次,点赞4次,收藏10次。微软Windows操作系统全面兼容机器人操作系统ROS1和ROS2turtlebot2:https://github.com/bfjelds/turtlebot2-win10文档:https://libraries.io/github/bfjelds/turtlebot2-win10安装在/opt/ros/melodic/x64文件夹下,依据如下教程即可安装成功。ROS..._ros2_java for windows

qt 子窗口向父窗口发送信息_qt中对话框返回信息给父页面-程序员宅基地

文章浏览阅读4.3k次,点赞7次,收藏20次。场景:点击父窗口按钮1,弹出子窗口。点击子窗口查询按钮,隐藏子窗口并把查询结果显示在父窗口上。参考文献Qt实例–主窗口和子窗口互发信号简化需求为:子窗口点击按钮,向父窗口发送消息,并显示在子窗口上:子窗口 DatasetQueryConditionWgt.h要定义两个函数:点击按钮,发送信号的槽函数SlotQueryBtnClicked(),注意带上slots发送信息的函数 SignalQueryConditionBtnClicked(QVariantMap m_queryCondition)_qt中对话框返回信息给父页面

Makefile and Paul's Rules of Makefiles_suffix rules are obsolete: .c.o-程序员宅基地

文章浏览阅读546次。Defining and Redefining Pattern Rules_suffix rules are obsolete: .c.o

Retrofit2+Okhttp3添加统一请求体_retrofit 设置请求体-程序员宅基地

文章浏览阅读941次。前言上篇讲到Retrofit2+Okhttp3添加统一请求头,这篇是添加统一请求体,原理是相通的,把参数以请求体的方式添加到拦截器中,然后在配置给okhttp。 代码实现创建拦截器,并添加参数public class HeaderInterceptor implements Interceptor { @NonNull @Override public Re..._retrofit 设置请求体

mysql删除表中指定数据,delete from..where-程序员宅基地

文章浏览阅读2.4k次。mysql -uxx -pyyyselect count(id) from lottery.mop_bet_order_history where created_at < '2015-11-01' and created_at > '2015-10-01';delete from lottery.mop_hot_history where cre..._delete from where created_at < '2024-02-01';

gradle settings use local gradle(设置gradle版本为本地版本)-程序员宅基地

文章浏览阅读5.8k次。下面过程说明了“android studio如何设置gradle版本为本地版本”:1. 打开File->Settings;2. 选择Build,Execution,Deployment->Gradle;3. 再选择右边的Project level settings ,选中use local gradle,在Gradle Home的右边,选择本地gradle的目录。最后,点击OK即可_use local gradle