ROS下工作空間、功能包的建立,以及建立節點,實現節點之間的通訊
第一步:建立ROS工作空間
我們通過mkdir -p直接建立多層目錄。
$ mkdir -p ~/dev/catkin_ws/src //catkin_ws是工作空間目錄,src工作空間下的原檔案目錄
$ cd ~/dev/catkin_ws/src
$ catkin_init_workspace //在工作空間中建立CMakeList.txt檔案,這個檔案是建立在~/dev/catkin_ws/src目錄下的
$ cd ~/dev/catkin_ws //移動到工作空間目錄是為了編譯工作空間
$ catkin_make //編譯工作空間,只能在工作空間目錄進行
此時,如果輸入ll命令,就可以看見工作空間目錄下自動建立了新檔案,分別是build和devel資料夾
$ source devel/setup.bash //重新載入setup.bash檔案,你也可以通過關閉終端重新開啟來重新載入
最後還要在~/.bashrc檔案的末尾新增命令列,來配置我們的環境 $ echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc 如果在安裝ros時已經配置了,那就不需要配置了,我們使用的ROS版本是ROS kinetic,如果要使用其他版本的,請自行更改該配置語句!
第二步:建立ROS功能包和元功能包
$ cd ~/dev/catkin_ws/src
$ catkin_create_pkg chapter2_tutorials std_msgs roscpp //chapter2_tutorials是功能包名字,std_msgs和roscpp是依賴項,std_msgs包含了常見道訊息型別,表示基本資料型別和其他基本道訊息構造,如多維陣列。roscpp 使用C++ 實現ROS的各種功能。如果你還要使用Python庫,還需要在最後邊新增 rospy
第三步:編譯ROS功能包
$ cd ~/dev/catkin_ws
$ catkin_make //編譯工作空間下的所有包,依然是要到工作空間下編譯
第四步:建立節點
$ roscd chapter2_tutorials/src //節點是要建立到功能包下邊的原始檔下邊,所以要先移動到該目錄,如果該語句執行失敗,可以用 $ cd ~/dev/catkin_ws/src/chapter2_tutorials/src替代。
然後建立兩個檔案,分別命名為example1_a.cpp和example1_b.cpp,第一個檔案會發送帶有節點名稱的資料,第二個檔案接受這些資料並把他顯示在命令列中。
$ vim example1_a.cpp //建立並開啟example1_a.cpp檔案
把以下內容複製到該檔案中:
#include "ros/ros.h"
#include "std_msgs/String.h"//
#include <sstream>///////////包含要使用的檔案型別
int main(int argc, char **argv)
{
ros::init(argc, argv, "example1_a");//啟動該節點並設定其名稱,名稱必須唯一
ros::NodeHandle n;//設定節點程序的控制代碼
ros::Publisher pub = n.advertise<std_msgs::String>("message", 1000);//將節點設定成釋出者,並將所釋出>主題道型別和名稱告知節點管理器。第一個引數是訊息的名稱:message,第二個是緩衝區道大小。如果主題釋出資料速度較快
,那麼將緩衝區設定為1000個訊息。
ros::Rate loop_rate(10);//設定傳送資料道頻率為10Hz
while (ros::ok())//當收到Ctrl+C的按鍵訊息或ROS停止當前節點執行時,ros::ok()庫會執行停止節點執行道命令
{
//////建立一個訊息變數,變數型別必須符合傳送資料的要求
std_msgs::String msg;
std::stringstream ss;
ss << " I am the example1_a node ";
msg.data = ss.str();
//ROS_INFO("%s", msg.data.c_str());
pub.publish(msg);//訊息被髮布
ros::spinOnce();//如果一個訂閱者出現,ROS就會更新和讀取所有主題
loop_rate.sleep();//按照10Hz的頻率將程式掛起
}
return 0;
}
儲存之後建立開啟第二個檔案
$ vim example1_b.cpp
複製以下內容:
#include "ros/ros.h"
#include "std_msgs/String.h"
void messageCallback(const std_msgs::String::ConstPtr& msg)//每次該節點收到一條訊息時都呼叫此函式,就可以使用或
處理資料。本例中,將收到道資料在命令視窗中輸出來
{
ROS_INFO("I heard: [%s]", msg->data.c_str());//用於在命令列中輸出資料
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "example1_b");
ros::NodeHandle n;
/////建立一個訂閱者,並從主題獲取以message為名稱的訊息資料。設定緩衝區為1000個訊息,處理訊息控制代碼的回撥函式>為messageCallback
ros::Subscriber sub = n.subscribe("message", 1000, messageCallback);
//// ros::spin()庫是節點讀取資料道訊息響應迴圈,當訊息到達的時候,回撥函式就會被呼叫。當按下Ctrl+C時,節點
會退出訊息迴圈,於是迴圈結束。
ros::spin();
return 0;
}
第五步:編譯節點,其實前邊的步,基本不會出現問題,後邊可能就會有問題出現了
接下來需要自行編輯CMakeList.txt檔案,使用如下語句編輯他
$ rosed chapter2_tutorials CMakeList.txt //如果你這步沒有出現錯誤,恭喜你,但是我在執行這步時出現問題:不能找見chapter2_tutorials這個包,我找了好久才發現在編譯之前,需要修改CMakeLists.txt檔案和manifest.xml檔案,需要通過rosmake編譯一下功能包
$ rosmake chapter2_tutorials //編譯完這步後,應該就不會出現上述問題了,接下來再執行上一步,就能成功開啟CMakeList.txt檔案了
開啟CMakeList.txt檔案後,把以下內容新增到最後邊:
include_directories(
include
${catkin_INCLUDE_DIRS}
)
add_executable(example1_a src/example1_a.cpp)
add_executable(example1_b src/example1_b.cpp)
add_dependencies(example1_a
chapter2_tutorials_generate_messages_cpp)
add_dependencies(example1_b
chapter2_tutorials_generate_messages_cpp)
target_link_libraries(example1_a ${catkin_LIBRARIES})
target_link_libraries(example1_b ${catkin_LIBRARIES})
這部分內容一定不能寫錯,我第一次也是把最後一行中的LIBRARIES的最後一個s寫成了小寫,導致第二個檔案一直不能接收資訊,找了好久才找見!
接下來就是編譯CMakeList.txt檔案,還是要先到工作空間才能進行編譯
$ cd ~/dev/catkin_ws
$ catkin_make --pkg chapter2_tutorials
接下來在電腦中啟動ROS,需要首先呼叫:
$ roscore
啟動ros後,需要再開啟一個終端,我們稱為終端2;
第六步:執行節點
首先要檢查ROS是否在執行,在終端2中使用rosnode list命令查詢
$ rosnode list
接下來在終端2中執行第一個節點:
$ rosrun chapter2_tutorials example1_a //在這裡可能會出現問題依然是:不能發現chapter2_tutorials包,需要在該終端中繼續編輯chapter2_tutorials包,載入setup.bash檔案,執行以下兩步
$ catkin_make --pkg chapter2_tutorials
$ source devel/setup.bash
然後在重新執行上邊哪一步,即 $ rosrun chapter2_tutorials example1_a ,執行成功後出現空白行,處於等待狀態,
接著繼續開啟另一個終端,即終端3,在該終端中執行第二個節點:
$ rosrun chapter2_tutorials example1_b //如果出現找不到chapter2_tutorials包的問題,請參考上一步。
如果執行成功,你會發現命令列會不斷重複 [ INFO] [*********.**********]: I heard : [I am the example1_a node]
則建立連結成功!相關推薦
ROS下工作空間、功能包的建立,以及建立節點,實現節點之間的通訊
我是ROS初學者,完全根據《ROS機器人高效程式設計》第三版這本書學習的,學習第2.4節時,經常會出現一些莫名其妙的問題,所以通過各種上網查資料,最後終於完成了書上的程式設計!以下是我對ROS工作空間的建立、建立節點、實現通訊進行總結 第一步:建立ROS工作空間 我們
ROS學習筆記(一):建立工作空間和功能包
所有的ROS程式,包括我們自己開發的程式,都被組織成功能包,而ROS的功能包被存放在稱之為工作空間的目錄下。因此,在我們寫程式之前,第一步是建立一個工作空間以容納我們的功能包。其實ROS工作空間就是linux下的一個目錄,建立ROS工作空間就是建立一個linux目錄(我們建立名為catkin_ws的
【ROS】建立工作空間和程式包
要使用ROS系統進行開發,首先需要在ROS下建立工作空間(workspace)和程式包(package)。 建立工作空間: $ mkdir -p ~/catkin_ws/src 執行上述命令即在使用者主目錄下建立了catkin_ws資料夾及其子資料夾src(-p表示建立目標路徑上的所
ROS知識(16)----如何編譯時自動鏈接同一個工作空間的其他包的頭文件(包含message,srv,action自動生成的頭文件)
logs package fin 空間 依賴庫 osc div build 知識 catkin_make編譯時,往往需要自動鏈接同一個工作空間的其他包的頭文件。否則會出現類似如下的錯誤: /home/xx/xx_ws/srcA_package/src/db.hpp:13:
ubuntu16.04下ROS作業系統學習(四 / 一)ROS基礎-工作空間
主要知識點: 1.src、build、devel、install各資料夾的功能介紹。 2.建立工作空間(建立資料夾,初始化工作空間)、編譯工作空間、設定環境變數,檢查環境變數 (echo $ROS_PACKAGE_PATH) 3.建立功能包:catkin_create_pkg <
2、ROS使用工作空間
一、引言 本篇中,我們首先會展示catkin_make如何構建package,然後演示在不使用catkin_make的情況下手動構建,從而加深對catkin_make工作流程的理解。 二、使用catkin_make 1、使用catkin_make的
ROS基礎學習筆記——工作空間、CMakeList、package.xml
ROS學習筆記(一) 東南大學 zscseu 一、如何建立一個catkin工作空間 如下步驟: source/opt/ros/indigo/setup.bash mkdir-p
編譯ROS工作空間某一個包的命令
首先切換到自己的ROS工作空間: $ cd ~/catkin_ws如果你想編譯整個工作空間裡面的包:$ catkin_make如果你只想編譯工作空間某一個包:$ catkin_make -DCATK
Centos系統下解除安裝、安裝MySQL及使用者的建立、授權和使用(詳細。。。。)
由於經常使用linux系統,並且大資料環境搭建中經常會使用到mysql,不像windows系統下的安裝,今天有點空寫一篇,下面我給大家演示一遍。 主要有三部分內容: 1、MySQL的解除安裝 2、MySQL的安裝 3、MySQL使用者的授權和使用者建立、刪除 一、MySQL的解除安裝(如果是僅僅安裝
Windows下工作列、開始選單圖示資料夾位置
工作列: C:\Users\使用者名稱\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar 開始選單: C:\Users\使用者名稱\AppData\Roaming\Microsoft\
ROS roscd找不到功能包 環境變數缺少/opt/ros/ingido/stacks
我按裝ROS後 建立工作空間和功能包 但是在使用roscd 進入功能包時卻顯示找不到這個包,然後使用rosed 編輯這個包裡的訊息檔案,也顯示找不到這個包 然後我echo $ROS_PACKAGE_PATH
Android Studio下新增library、jar包、so包
新增jar包 複製jar檔案,貼上到 Project標籤下app/libs資料夾下。 然後新增到依賴庫:可以右鍵jar包選擇“Add As Library”。或者:ctrl+shift+alt+s進
[轉]IE9.0或者360下js(JavaScript、jQuery)不能正確執行(加載),按F12後執行正常;Firefox下ajax的success返回數據data(json、string)無法獲取
cli onf string 不同 logs script blog 綁定 導入 兼容問題1: 頁面的分享等插件加載不全,並無法點擊。 兼容問題2: IE下頁面選擇器(#id、.class.etc.)綁定click事件無法訪問到,後臺springmvc方法,也無法獲取
Oracle創建表空間、創建用戶以及授權
指定表 count conf fault 除了 max limited 初學 ati Oracle安裝完後,其中有一個缺省的數據庫,除了這個缺省的數據庫外,我們還可以創建自己的數據庫。 對於初學者來說,為了避免麻煩,可以用‘Database Configuratio
Git 工作區、版本庫中的暫存區和版本庫之間的關系
再次 出現 它的 git rm div 理解 方式 ast 版本 下圖展示了 工作區、版本庫中的暫存區和版本庫之間的關系: 1. 理解 Git 暫存區 (stage) 在版本庫 .git 目錄下有一個 index 文件,下面針對這個文件做一個有趣的試驗。要說明
DB2中storage group的概念,以及建立各種型別的表空間
DB2的表空間根據是否是自動儲存型別的,可以分為兩種,Automatic Storage(AS)和非Automatic Storage,如果是Automatic Storage型別的,建立時不能指定容器的路徑,那麼DB2是怎麼知道它存放的位置的呢?這裡要引申出一個概念:St
MAC下最好用的抓包工具charles簡單操作教程,charles mac入門
ado 端口號 proc 通過 代理 關於 基本操作 sha 今天 Charles for Ma是 mac 平臺上一款非常強大的抓包神器,可以讓開發者監視查看所有連接互聯網的 HTTP 通信,包括請求,響應和 HTTP 頭信息等等,charles mac讓您的 Intern
二叉樹的建立,以及前序,中序,後序遍歷
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; typedef struct BIT_Node{// ch
Python中建立程序的方法,以及併發並行,殭屍程序,孤兒程序的相關概念
一、併發與並行 並行:多個計算機核心在同時處理多個任務,這時多個任務間是並行關係 併發:同時處理多個任務,但是核心在多個任務間不斷地切換,達到好像都在處理執行的效果,但實際一個時間點核心只能處理其中一個任務。 二、程序 程序與執行緒是實現多工程式設計的實施方案 程序與執
HTML+CSS的兩欄、三欄布局以及垂直居中的實現方式
外邊距 add round relative pla tran 樣式 lex 代碼 1.兩欄布局(左固定,右適應) 先寫出初始樣式和結構。 <div class="container"> <div class="left">Lorem ip