ROS初探

ROS初探

ROS(Robot Operating System) 相关术语

ROS:让机器人和计算机进行交互的操作系统。

ROS network: 由一个通过ROS通讯的机器人系统的不同部分组成。

ROS master: 协调ROS网络中的不同部分。它由运行服务器的主机名或IP地址唯一标识。

ROS node: 包含一系列的ROS功能(publishers, subscribers,services), 一个ROS网络可以有很多节点

Publishers, subscribers和services是不同的处理数据的ROS实体对象,它们通过消息(messages)交换数据。

Ros publishers和subscribes之间的数据交换

ROS初探_第1张图片

一个publisher发送messages给一个特定的topic(比如”odometry”),这个topic对应的subscribers接收到这些messages。与一个topic相关的publishers和subscribers可以有多个。


数据结构(data structure)

ROS初探_第2张图片
设置消息数据:
     twist = rosmessage(rostype.geometry_msgs_Twist);    
     twist.Linear.Y = 5;

复制消息:

    1)reference copy(参考复制)
          twistCopyRef = twist
         修改twistCopyRef,twist也跟着改变。

    2)deep copy(深度复制)
          twistCopyDeep = copy(twist)
          修改twistCopyRef,twist不跟着改变。

保存和下载消息:

     posedata = receive(posesub,10);    
     save('posedata.mat','posedata')
     clear posedata;    
     messageData = load('posedata.mat');    
     messageData.posedata

消息中的对象数组(Object Arrays in Messages):

    来自ROS的消息被存储在对象数组中,同一种消息类型(type),多个对象,相同的特征


发布器(Publisher)

创建一个发送字符串消息到 /chatter topic的发布器
  rosinit
  exampleHelperROSCreateSampleNetwork

  chatterpub = rospublisher('/chatter', rostype.std_msgs_String) %添加一个发布器,将消息发给‘chatter’这一topic
  pause(2)          % 等待发布器被注册

  chattermsg = rosmessage(chatterpub);
  chattermsg.Data = 'hello world'
  chattersub = rossubscriber('/chatter', @exampleHelperROSChatterCallback)  % 与‘chatter’这一topic相关的订阅器接收消息,并调                                                                                                                               用exampleHelperROSChatter这一回调函数
  send(chatterpub,chattermsg)  %把消息传给发布器
  pause(2)

  exampleHelperROSShutDownSampleNetwork
  rosshutdown


订阅器(Subscriber)

普通订阅和等待消息
     rosinit
     exampleHelperROSCreateSampleNetwork
     laser = rossubscriber('/scan')
     scandata = receive(laser,10)
    当订阅器在等待新的消息的时候,不能执行其他的MATLAB程序。


用回调函数订阅消息
     robotpose = rossubscriber('/pose',@exampleHelperROSPoseCallback)
     global pos      %使用全局参量是回调函数和工作空间分享数据的一种方式
     global orient
     pause(2)
     pos
     orient
     clear robotpose
    定义一个回调函数(callback function),当一个新的消息被接受时就调用它,当订阅器等      待消息时,允许执行其他MATLAB程序。当使用多个订阅器时,使用回调函数是必要的。


ROS服务(Services)

    ROS的两种主要通信机制:Topics&Services
    服务: 更加紧密耦合的请求-应答的通信方式,服务客户端发送一个请求信号给服务服务器,等待应答。

    服务的特点:
    1)服务请求被用在一对一的通信中,一个节点初始化请求,有且只有一个节点将接收到请求并且发出应答。
    2)当产生一个服务请求时,服务客户端和服务服务器是紧密耦合的。请求发出时服务器必须存在,一旦请求被发出,客户端将屏蔽直至收到应答。

ROS初探_第3张图片

创建一个服务服务器
      rosinit exampleHelperROSCreateSampleNetwork
      testserver = rossvcserver('/test', rostype.std_srvs_Empty,     @exampleHelperROSEmptyCallback)
      
创建一个服务客户端
     testclient = rossvcclient('/test')
     testreq = rosmessage(testclient) % 为服务创建一个请求信息
     testresp = call(testclient,testreq,'Timeout',3) % 呼叫服务器返回一个应答信息


创建一个两数相加的服务

     sumserver = rossvcserver('/sum', rostype.roscpp_tutorials_TwoInts, @exampleHelperROSSumCallback)
     sumclient = rossvcclient('/sum')
     sumreq = rosmessage(sumclient)
     sumreq.A = 2
     sumreq.B = 1
     sumresp = call(sumclient,sumreq,'Timeout',3)

ROS简单使用方法介绍

MATLAB中配置ROS
     1. 初始化ROS network:使用'rosinit'语句创建一个ROS master,并创建一个与master相连的全局节点(global node)。
     2. 通过编写代码,添加nodes,然后自定义它的publishers, subscribersservers,并且定义要传递的messages
     3. 通过'rosnode list''rostopic list''rosservice list'命令来分别查看所有nodestopicsservices

查看ROS node, topicservicemessage的具体信息
     1. 使用'resnode info /node''resnode info /topic''resnode info /sevice'命令查看某个nodetopicservice的具体信息。
     2. 通过'rostopic type ...''rosmsg show ...'等系列命令可以查看messages中所含的具体信息。

关闭ROS network
     先从network移除nodespublisherssubscribers,然后调用'rosshutdown'命令关闭ROS



你可能感兴趣的:(Robotics)