Day 8 ROS Client Library 与 Roscpp

ROS Client Library

ROS 最为一款广为人知的机器人作业系统,当然也能让很多种程序语言来做使用。 尽管是不同的程序语言,但是他们都是需要建立 Topic 、 Service 、 param 等等 来让 ROS 可以进行通讯, 而此时便是需要 ROS Client Library 的时候了,他便是 ROS 提供给我们的 API ,可以让我们轻松的跨语言去沟通。

这边是目前 ROS 支援的 Client Library

Client Library 介绍
roscpp ROS的C++库,是目前最广泛应用的ROS客户端库,执行速度快
rospy ROS的Python库,开发速度快,通常用在对运行时间没有太大要求的场合,例如配置、初始化等操作
roslisp ROS的LISP库
roscs Mono/.NET.库,可用任何Mono/.NET语言,包括C#,Iron Python, Iron Ruby等
roseus EusLisp 语言库
rosgo ROS Go 语言库
rosjava ROS Java 语言库
rosnodejs Javascript 客户端库
RobotOS.jl Julia 语言库
rosR R 语言库
rosruby ruby 语言库
ROS-MATLAB Interface 跟 MATLAB 的 ROS 工具包 进行通讯用
ROS-Simulink Interface 跟 Simulink 的 ROS 节点进行通讯用

目前最常被用到的还是只有 ROS CPP 、 ROS Py 所以後面介绍还是以这两个为主。

Roscpp

Roscpp 他被放在 /opt/ros/kinetic 下面, 用 C++ 来达到跟 ROS 通讯的目的,在 ROS 中 , C++ 的程序码是通过 catkin 来进行编译的,这在前面有提到,忘记的话可以回去翻一下,所以我们在写的时候,只要直接 include roscpp 等等的 ROS libraries,我们就可以在 ROS 中进行使用了。

起手式,当我们要去使用 ROS C++ 时,需要把它 include 进来

#include <ros/ros.h>

roscpp 中,他主要的部份包含以下几点:

  • ros::init()
    • 解码 传到 ROS 的参数,他也是创建一个新节点所需要的函数
  • ros::NodeHandle
    • 和 topic、service、param 等通讯方式沟通使用
  • ros::master
    • 从 master 查询资讯
  • ros::this_node
    • 查询这个 node
  • ros::service
    • 查询服务使用
  • ros::param
    • 查询参数服务器使用
  • ros::names
    • 处理图相关资源名称

详细的部分可以参考 http://docs.ros.org/api/roscpp/html/index.html

Demo

这边展示一下怎麽从开启到关闭

#include<ros/ros.h>
int main(int argc, char** argv)
{
    ros::init(argc, argv, "your_node_name");
    ros::NodeHandle nh;
    ros::shutdown() 
}

首先先引入套件,然後宣告 main 函式,接下来初始化我们的 node 节点,再来我们帮我们的 node 加一个手把 NodeHandle ,让我们可以方便地去使用他,接下来我们关闭我们的节点 。

NodeHandle

接下来我们来看 NodeHandle 有哪一些功能

  • ros::Publisher advertise(const string &topic, uint32_t queue_size, bool latch=false);

这个便是创建一个新的 publisher,第一个参数是话题名称,第二个是资讯最大长度,如果发送的资ㄒ讯大於可被接受的资讯,就会被退回,第三个参数则是来看是否把这个参数锁住。

  • ros::Subscriber subscribe(const string &topic, uint32_t queue_size, void(*)(M));

这是用来创建一个新的 Subscriber ,,第一个参数是订阅的话题名称,第二个是资讯最大长度,但是如果收到的资讯还没来的及处理,旧的资讯就会被丢掉,第三个参数则是 回传函数的指标,指标指向一个函式来处理接收到的讯息。

  • ros::ServiceServer advertiseService(const string &service, bool(*srv_func)(Mreq &, Mres &));

这是用来创建一个新的 ServiceServer , 第一个参数是服务的名称,第二个是用来设定说服务是否要持续的连接,这样我们後面在传递时会比较快一点

  • bool getParam(const string &key, std::string &s);
  • bool getParam (const std::string &key, double &d) const;
  • bool getParam (const std::string &key, int &i) const;

从参数服务器上拿到某个 key 的 value

  • void setParam (const std::string &key, const std::string &s) const;
  • void setParam (const std::string &key, const char *s) const;
  • void setParam (const std::string &key, int i) const;

给 key 对应的 val 赋值

以上便是 NodeHandle 的一些使用方式,从中可以看到 NodeHandle 是很重要的,毕竟沟通类的方式基本上都是靠他完成的。

master

ros::master 底下有许多的功能可以让我们进行使用。

函式 功能
bool check() 检查 master 是否启动
const string & getHost 回传 master 所属的 hostname
bool getNodes (V_string &nodes) 回传 master 中已知的 node 名称
boolgetTopics (V_TopicInfo &topics) 回传所有正在发讯息的 topic 名单
bool getURI () 返回到 master 的 URL 位址
uint32_t getPort () 回传在正使用中的 port
void getTopics (V_TopicInfo &topics) 拿到这个 node 发布的 topic

以上就是常用到的 master 参数

结语

今天介绍了 ROS Client Library 与 Roscpp ~ 在明天我们将继续摸索 Roscpp

#Arm Arm Platforms


<<:  110/08 - 档案要存那里?

>>:  成员 11 人:坐卧有如优雅猫,转身形同慌张狗

Day 12:UI / UX

前言 UI 跟 UX 是两个完全不一样的东西,以工程师的角度简单来说, UI 是美术视觉看得到的, ...

Progressive Web App 跨平台安装上架 (30)

Progressive Web App 跨平台安装 Progressive Web App 本身就具...

Day16:终於要进去新手村了-Javascript-回圈-while

回圈有两种语法可以使用,分别是while与for回圈,今天这篇会先来讲到while回圈的部分。 基本...

Day-20 面试考古题破解区(2)

令我意外的是…昨天的面试考古题破解区(1)人气满高的也,哈哈哈! 事不疑迟,我们今天马上来看看面试...

day 2 coroutine和架构组件

今天会轻松一点,介绍coroutine的优势 coroutine有点难决定从哪里开始讲,最後决定从a...