iT邦幫忙

2021 iThome 鐵人賽

DAY 8
0
Arm Platforms

ROS with Deep learning 開發與實戰系列 第 8

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


上一篇
Day7 ROS 工具介紹
下一篇
Day9 Topic in Cpp
系列文
ROS with Deep learning 開發與實戰11

尚未有邦友留言

立即登入留言