0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ROS操作系統(tǒng)學(xué)習(xí)筆記3

jf_78858299 ? 來(lái)源:機(jī)器人網(wǎng) ? 作者:機(jī)器人網(wǎng) ? 2023-05-19 17:37 ? 次閱讀

摘要:這篇文章主要介紹ROS常用工具、ROSPY和ROSCPP常用模塊,完全看完三篇文章,可以說(shuō)ROS就基本入門(mén),可以自己動(dòng)手做實(shí)驗(yàn)了。

ROS常用工具

ROS工具的 功能大概有以下幾個(gè)方向:仿真、調(diào)試、可視化。這里主要介紹常用工具作用,如何添加模塊,設(shè)置參數(shù)B站都有視頻,這里不會(huì)有過(guò)多解讀。

gazebo是一種最常用的機(jī)器人仿真工具,模擬器,也是目前獨(dú)立的開(kāi)源機(jī)器人仿真平臺(tái)。gazebo可以進(jìn)行機(jī)器人的動(dòng)力學(xué)仿真,可以模仿機(jī)器人常用的傳感器(比如激光雷達(dá)、攝像頭、IMU等),也可以加載自定義的環(huán)境和場(chǎng)景。

RViz是可視化工具,是將接收到的信息呈現(xiàn)出來(lái);rviz和gazebo非常相似,但是gazebo實(shí)現(xiàn)的是仿真,提供一個(gè)虛擬世界,RVIZ實(shí)現(xiàn)的是可視化,呈現(xiàn)接收到的信息。

rqt主要作用和RVIZ一致都是可視化,有了它我們可以直觀的看到消息的通信架構(gòu)和流通路徑;

常用命令:

rqt_graph :顯示通信架構(gòu)

rqt_plot :繪制曲線

rqt_console :查看日志

rosbag是一套用于記錄和回放ROS主題的工具,此外還提供代碼API,對(duì)包進(jìn)行操作編寫(xiě)。

常用命令:cheak 確定一個(gè)包是否可以在當(dāng)前系統(tǒng)中進(jìn)行,或者是否可以遷移。decompress 壓縮一個(gè)或多個(gè)包文件。filter 解壓一個(gè)或多個(gè)包文件。fix 在包文件中修復(fù)消息,以便在當(dāng)前系統(tǒng)中播放。help 獲取相關(guān)命令指示幫助信息info 總結(jié)一個(gè)或多個(gè)包文件的內(nèi)容。play 以一種時(shí)間同步的方式回放一個(gè)或多個(gè)包文件的內(nèi)容。record 用指定主題的內(nèi)容記錄一個(gè)包文件。reindex 重新索引一個(gè)或多個(gè)包文件。

rosbridge是一個(gè)用在ROS系統(tǒng)和其他系統(tǒng)之間的一個(gè)功能包,就像是它的名字一樣,起到 一個(gè)"橋梁"的作用,使得ros系統(tǒng)和其他系統(tǒng)能夠進(jìn)行交互.Rosbridge為非ROS程序提供了 一個(gè)JSON API,有許多與Rosbridge進(jìn)行交互的前端,包括一個(gè)用于Web瀏覽器交互的 WebSocket服務(wù)器。Rosbridge_suite是一個(gè)包含Rosbridge的元程序包,用于Rosbridge 的各種前端程序包(如WebSocket程序包)和幫助程序包。

moveit它融合了研究者在運(yùn)動(dòng)規(guī)劃、操縱、3D感知、運(yùn)動(dòng)學(xué)、控制和導(dǎo)航方面的最新進(jìn)展,為操作 者提供了一個(gè)易于使用的平臺(tái),使用它可以開(kāi)發(fā)先進(jìn)的機(jī)器人應(yīng)用,也被廣泛應(yīng)用于工業(yè), 商業(yè),研發(fā)和其他領(lǐng)域。move結(jié)構(gòu)圖如下:

圖片

roscpp代碼演示

ROS為我們機(jī)器人開(kāi)發(fā)者提供了不同語(yǔ)言的 接口,比如roscpp是C++語(yǔ)言ROS接口(目前最廣泛應(yīng)用的ROS客戶(hù)端庫(kù),執(zhí)行效率高),rospy是python語(yǔ)言的ROS接口(開(kāi)發(fā)效率高,通常用在對(duì)運(yùn)行時(shí)間沒(méi)有太大要求的場(chǎng)合,例如配置、初始化等操作),rosjava是java語(yǔ)言的ROS接口(測(cè)試版本) 我們直接調(diào)用它所 提供的函數(shù)就可以實(shí)現(xiàn)topic、service等通信功能。

圖片

roscpp位于 /opt/ros/kinetic 之下,用C++實(shí)現(xiàn)了ROS通信。在ROS中,C++的代碼是通過(guò) catkin這個(gè)編譯系統(tǒng)(擴(kuò)展的CMake)來(lái)進(jìn)行編譯構(gòu)建的。每一個(gè)node的節(jié)點(diǎn)功能可能不一樣,但是都包含初始化、銷(xiāo)毀、句柄等操作。

  • ROS代碼邏輯整體

常見(jiàn)的ros代碼邏輯包含下面的執(zhí)行步驟:

1.調(diào)用ros::init()函數(shù)初始化節(jié)點(diǎn)的名稱(chēng)和其他信息

2.創(chuàng)建ros::NodeHandle對(duì)象,也就是節(jié)點(diǎn)句柄,用于創(chuàng)建Pub、Sub(NodeHandle就是節(jié)點(diǎn)資源的描述,需要借助“把手”才能操作資源)

3調(diào)用ros::shutdown()手動(dòng)關(guān)閉節(jié)點(diǎn)(一般是系統(tǒng)自動(dòng)幫我們完成)。

#include
int main(int argc, char** argv)
{
ros::init(argc, argv, "your_node_name");
ros::NodeHandle nh;
//....節(jié)點(diǎn)功能
//創(chuàng)建話題的publisher
ros::Publisher advertise(const string &topic, uint32_t queue_size, bool latch=false);
//創(chuàng)建話題的subscriber
ros::Subscriber subscribe(const string &topic, uint32_t queue_size, void(*)(M));
//創(chuàng)建服務(wù)的server,提供服務(wù)
ros::ServiceServer advertiseService(const string &service, bool(*srv_func)(Mreq &, Mre
s &));
//創(chuàng)建服務(wù)的client
ros::ServiceClient serviceClient(const string &service_name, bool persistent=false);
//查詢(xún)某個(gè)參數(shù)的值
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;
//給參數(shù)賦值
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;
//....
ros::spin();//用于觸發(fā)topic、service的響應(yīng)隊(duì)列
return 0;
}

roscpp的主要部分包括:ros::init() : 解析傳入的ROS參數(shù),創(chuàng)建node第一步需要用到的函數(shù)ros::NodeHandle : 和topic、service、param等交互的公共接口ros::master : 包含從master查詢(xún)信息的函數(shù)ros::this_node:包含查詢(xún)這個(gè)進(jìn)程(node)的函數(shù)ros::service:包含查詢(xún)服務(wù)的函數(shù)****ros::param:包含查詢(xún)參數(shù)服務(wù)器的函數(shù),而不需要用到NodeHandleros::names:包含處理ROS圖資源名稱(chēng)的函數(shù)

具體可見(jiàn):http://docs.ros.org/api/roscpp/html/index.html

以上功能可以分為以下幾類(lèi):Initialization and Shutdown 初始與關(guān)閉Topics 話題Services 服務(wù)Parameter Server 參數(shù)服務(wù)器Timers 定時(shí)器NodeHandles 節(jié)點(diǎn)句柄Callbacks and Spinning 回調(diào)和自旋(或者翻譯叫輪詢(xún)?)Logging 日志Names and Node Information 名稱(chēng)管理Time 時(shí)鐘Exception 異常

  • 回調(diào)函數(shù)與spin()方法

    CallBack回調(diào)函數(shù)與ros::spin() 方法需要配合使用,當(dāng)消息傳來(lái)時(shí),只指定回調(diào)函數(shù),系統(tǒng)不會(huì)自動(dòng)觸發(fā),必須要 ros::spin() 或 者 ros::spinOnce() 才能真正使回調(diào)函數(shù)生效。 處理流程:回調(diào)函數(shù)一般作為參數(shù)傳到另外一個(gè)函數(shù)(一般是函數(shù)指針),當(dāng)消息message到達(dá)時(shí),先會(huì)把消息放到一個(gè)隊(duì)列中,當(dāng)有spin函數(shù)執(zhí)行時(shí),就會(huì)處理消息隊(duì)列隊(duì)首的信息。spin具體的處理方法可以分成阻塞/非阻塞,單線程/多線程兩種。

    spin方法 阻塞 線程
    ros::spin() 阻塞 單線程
    ros::spinOnce() 非阻塞 單線程
    ros::MultiTreadedSpin() 阻塞 多線程
    ros::AsyncMultiThreadedSpin() 非阻塞 多線程
  • ROS節(jié)點(diǎn)編寫(xiě)

    基本流程,首先創(chuàng)建一個(gè)工作空間workplace,然后根據(jù)實(shí)際需要?jiǎng)?chuàng)建相應(yīng)的包package,編寫(xiě)相應(yīng)的需求文件,如源文件;根據(jù)編譯運(yùn)行需要,補(bǔ)充CMakeLists.txt、package.xml相應(yīng)說(shuō)明,如添加依賴(lài),查找相關(guān)包,運(yùn)行所需要的包,消息類(lèi)型等等。

    mkdir -p xxx_ws   //創(chuàng)建工作空間
    catkin_make     //編譯工作空間
    //打開(kāi).bashrc 設(shè)置xxx_ws工作空間的環(huán)境變量
    catkin_create_pkg xxxx(包) xx(依賴(lài))   //創(chuàng)建包
    
  1. 編寫(xiě)一個(gè)talker的node

在工作空間的src/目錄下,第1步,創(chuàng)建一個(gè)talker的包study:$ catkin_create_pkg study roscpp第2步,打開(kāi)vcode(或者其他ide),study/src,創(chuàng)建源文件study_node.cpp,代碼如下:

#include"ros/ros.h"
#include"std_msgs/String.h"
#include
//編寫(xiě)一個(gè)node并發(fā)布出來(lái)
int main(int argc,char **argv){
   ros::init(argc,argv,"study_talker");//定義node的屬性
   ros::NodeHandle n;//ros提供的一個(gè)類(lèi),可以實(shí)例化publisher,進(jìn)行發(fā)布數(shù)據(jù)
   ros::Publisher study_pub=n.advertise

第3步,設(shè)置CMakeLists.txt&package.xmlCMakeLists.txt:

find_package(catkin REQUIRED COMPONENTS
roscpp
std_msgs
)//告訴系統(tǒng)編譯本包時(shí),需要找到這兩個(gè)包

catkin_package(
# INCLUDE_DIRS include
# LIBRARIES study
CATKIN_DEPENDS roscpp std_msgs
# DEPENDS system_lib
)//聲明依賴(lài)本包同時(shí)需要里面這兩個(gè)ros包

add_executable(${PROJECT_NAME}_node src/study_node.cpp)//編譯本包生成的可執(zhí)行文件

add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})//鏈接可執(zhí)行文件和依賴(lài)庫(kù)

//一般情況而已,CMakeLists.txt是創(chuàng)建包同時(shí),系統(tǒng)自動(dòng)生成的,然后,我們需要的工作,一般情況就是把上面基本地方去掉#號(hào)就行了(目的告訴系統(tǒng),關(guān)于該包,在哪,依賴(lài)是啥)

package.xml:

roscppclass="hljs-name"build_depend>
std_msgsclass="hljs-name"build_depend>
roscppclass="hljs-name"exec_depend>
std_msgsclass="hljs-name"exec_depend>
//主要修改類(lèi)似樣式,當(dāng)然,本例子比較簡(jiǎn)單,系統(tǒng)生成的,不需要做其他修改,但是,如果節(jié)點(diǎn)添加新的依賴(lài),需要在這些地方添加相應(yīng)的包

第4步,編譯

$ catkin_make  #注意在要做工作空間的一級(jí)目錄下使用該指令

第5步,驗(yàn)證,終端運(yùn)行

$ roscore & #后臺(tái)運(yùn)行一個(gè)ROS master
$ rosrun study study_node & #后臺(tái)運(yùn)行包名+節(jié)點(diǎn)名
$ rostopic list #
/study_topic //表示定義的topic正常發(fā)布
/rosout
/rosout_agg
$ rostopic echo #查看study_topic
data: "hello study world!2360"//表示發(fā)布成功
---
data: "hello study world!2361"

這時(shí),從零開(kāi)始創(chuàng)建的talker節(jié)點(diǎn)node,成功創(chuàng)建完成

  1. 編寫(xiě)一個(gè)listener的node

在工作空間的src/目錄下,第1步,創(chuàng)建一個(gè)listener的包study_listen:

$ catkin_create_pkg study_listen roscpp

第2步,study_listen/src,創(chuàng)建源文件study_listen_node.cpp

#include"ros/ros.h"
#include"std_msgs/String.h"

//創(chuàng)建一個(gè)listener的node
void studyCallback(const std_msgs::String::ConstPtr& msg){
   //回調(diào)函數(shù)一定是要求是無(wú)返回類(lèi)型
   ROS_INFO("I can see you again,%s",msg->data.c_str());
}

int main(int argc,char ** argv){
   ros::init(argc,argv,"study_listener");//初始化這么一個(gè)node
   ros::NodeHandle n;//命名空間
   ros::Subscriber sub=n.subscribe("study_topic",10,studyCallback);
   //表示聆聽(tīng)study_topic這個(gè)主題,每次聽(tīng)到就會(huì)啟動(dòng)回調(diào)函數(shù),這里的10也表示一個(gè)緩沖數(shù)量,多了,前面的會(huì)被是放掉
   //這里一定要注意,聆聽(tīng)的topic一定要和發(fā)布的topic的名稱(chēng)對(duì)應(yīng)上,否則,是沒(méi)辦法接收的
   ros::spin();
   return 0;
}
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 仿真
    +關(guān)注

    關(guān)注

    50

    文章

    4003

    瀏覽量

    133238
  • 調(diào)試
    +關(guān)注

    關(guān)注

    7

    文章

    565

    瀏覽量

    33838
  • ROS
    ROS
    +關(guān)注

    關(guān)注

    1

    文章

    276

    瀏覽量

    16921
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    嵌入式Linux操作系統(tǒng)學(xué)習(xí)規(guī)劃,不看肯定后悔

    嵌入式Linux操作系統(tǒng)學(xué)習(xí)規(guī)劃,不看肯定后悔
    發(fā)表于 04-28 06:22

    探討嵌入式操作系統(tǒng)

    嵌入式操作系統(tǒng)學(xué)習(xí)筆記
    發(fā)表于 10-27 06:56

    嵌入式Linux操作系統(tǒng)學(xué)習(xí)內(nèi)容及目標(biāo)

    嵌入式Linux操作系統(tǒng)學(xué)習(xí)內(nèi)容及目標(biāo):Linux介紹、使用Linux操作(命令)、Linux開(kāi)發(fā)工具(會(huì)用?。蛴茫。。┣度胧?b class='flag-5'>系統(tǒng)課程學(xué)習(xí)儲(chǔ)備知識(shí):C語(yǔ)言(累計(jì)代碼量
    發(fā)表于 11-05 08:35

    嵌入式Linux操作系統(tǒng)學(xué)習(xí)規(guī)劃

    嵌入式Linux操作系統(tǒng)學(xué)習(xí)規(guī)劃ARM+LINUX路線,主攻嵌入式Linux操作系統(tǒng)及其上應(yīng)用軟件開(kāi)發(fā)目標(biāo):(1) 掌握主流嵌入式微處理器的結(jié)構(gòu)與原理(初步定為arm9)(2) 必須掌握一個(gè)嵌入式
    發(fā)表于 11-05 06:45

    UCOSII操作系統(tǒng)的簡(jiǎn)介

    前言這是我將UCOSII操作系統(tǒng)移植在STM32單片機(jī)上后進(jìn)行UCOSII操作系統(tǒng)學(xué)習(xí)的一些筆記與理解,此文最后會(huì)附上我自己在UCOSII操作系統(tǒng)下使用STM32寫(xiě)
    發(fā)表于 01-12 06:00

    ROS是什么?機(jī)器人操作系統(tǒng)ROS的介紹

    Robotics Foundation,Inc) 公司維護(hù)的開(kāi)源項(xiàng)目。 1、首先是一個(gè)操作系統(tǒng) 根據(jù) wikipedia 定義,操作系統(tǒng)是用來(lái)管理計(jì)算機(jī)硬件與軟件資源,并提供一些公用的 服務(wù)的系統(tǒng)軟件。而
    發(fā)表于 09-13 17:23 ?14次下載
    <b class='flag-5'>ROS</b>是什么?機(jī)器人<b class='flag-5'>操作系統(tǒng)</b><b class='flag-5'>ROS</b>的介紹

    ROS的含義與機(jī)器人操作系統(tǒng)ROS的介紹

    Operating System 的縮寫(xiě),原本是斯坦福大學(xué)的一個(gè)機(jī)器人項(xiàng)目,后來(lái)由 WillowGarage 公司發(fā)展,目前由 OSRF(Open Source Robotics Foundation,Inc)公司維護(hù)的開(kāi)源項(xiàng)目。 1、首先是一個(gè)操作系統(tǒng) 根據(jù) wikipedia 定義,
    發(fā)表于 09-26 14:08 ?12次下載

    機(jī)器人操作系統(tǒng)ROS詳細(xì)介紹

    機(jī)器人操作系統(tǒng)ROS詳細(xì)介紹 ROS( 機(jī)器人 操作系統(tǒng),RobotOperatingSystem),是專(zhuān)為機(jī)器人軟件開(kāi)發(fā)所設(shè)計(jì)出來(lái)的一套電腦操作系
    發(fā)表于 11-18 18:09 ?2314次閱讀

    嵌入式操作系統(tǒng)學(xué)習(xí)筆記

    嵌入式操作系統(tǒng)學(xué)習(xí)筆記
    發(fā)表于 10-20 13:51 ?3次下載
    嵌入式<b class='flag-5'>操作系統(tǒng)學(xué)習(xí)</b><b class='flag-5'>筆記</b>

    嵌入式系統(tǒng)學(xué)習(xí)筆記

    嵌入式系統(tǒng)學(xué)習(xí)筆記https://app.yinxiang.com/fx/97dd59b5-21f1-470c-969c-d3509ee38fce
    發(fā)表于 10-20 19:50 ?0次下載
    嵌入式<b class='flag-5'>系統(tǒng)學(xué)習(xí)</b><b class='flag-5'>筆記</b>

    51操作系統(tǒng)學(xué)習(xí)筆記(三):建立一個(gè)屬于自己的AVR的RTOS(1)

    這篇筆記雖然是“51操作系統(tǒng)學(xué)習(xí)筆記”,但沒(méi)有找到合適的代碼。用楊明記的感覺(jué)還有點(diǎn)難度。因而轉(zhuǎn)學(xué)《建立一個(gè)屬于自己的AVR的RTOS》這篇文章絕對(duì)是學(xué)操作系統(tǒng)入門(mén)經(jīng)典之作。經(jīng)典之處在于
    發(fā)表于 11-15 18:36 ?9次下載
    51<b class='flag-5'>操作系統(tǒng)學(xué)習(xí)</b><b class='flag-5'>筆記</b>(三):建立一個(gè)屬于自己的AVR的RTOS(1)

    51操作系統(tǒng)學(xué)習(xí)筆記(四):建立一個(gè)屬于自己的AVR的RTOS(2)

    承接51操作系統(tǒng)學(xué)習(xí)筆記(三):建立一個(gè)屬于自己的AVR的RTOS(1),在avr中調(diào)試一下下面的程序.為了加深學(xué)習(xí)應(yīng)用,決定把代碼全部輸一遍,比復(fù)制的學(xué)些效果應(yīng)該好一些吧。打開(kāi)Avr studio
    發(fā)表于 11-15 21:06 ?7次下載
    51<b class='flag-5'>操作系統(tǒng)學(xué)習(xí)</b><b class='flag-5'>筆記</b>(四):建立一個(gè)屬于自己的AVR的RTOS(2)

    ROS操作系統(tǒng)學(xué)習(xí)筆記1

    機(jī)器人操作系統(tǒng)(Robot operating system ,ROS)是一個(gè)應(yīng)用于機(jī)器人上的基礎(chǔ)框架,它把原本松散的零部件耦合在一起,提供通信的架構(gòu),近似上ROS是一個(gè)中間件。 ros
    的頭像 發(fā)表于 05-19 17:20 ?719次閱讀
    <b class='flag-5'>ROS</b><b class='flag-5'>操作系統(tǒng)學(xué)習(xí)</b><b class='flag-5'>筆記</b>1

    ROS操作系統(tǒng)學(xué)習(xí)筆記2

    機(jī)器人操作系統(tǒng)(Robot operating system ,ROS)是一個(gè)應(yīng)用于機(jī)器人上的基礎(chǔ)框架,它把原本松散的零部件耦合在一起,提供通信的架構(gòu),近似上ROS是一個(gè)中間件。 ros
    的頭像 發(fā)表于 05-19 17:21 ?553次閱讀

    ROS操作系統(tǒng)學(xué)習(xí)筆記4

    摘要:這篇文章主要介紹ROS常用工具、ROSPY和ROSCPP常用模塊,完全看完三篇文章,可以說(shuō)ROS就基本入門(mén),可以自己動(dòng)手做實(shí)驗(yàn)了。 **ROS常用工具** ROS工具
    的頭像 發(fā)表于 05-19 17:37 ?659次閱讀