最近因工做須要,學習了一下ROS(機器人操做系統)。說是系統,其實只是一個運行在Linux下的一個框架,具備強大的分佈式功能。下面是總結的一些知識點,懶得仔細整理了。node
獲取全部已安裝的ROS軟件包列表清單 rospack list
找到一個軟件包的目錄 rospack find package-name
查看軟件包目錄下的文件 rosls package-name
將當前目錄切換至此軟件包目錄 roscd package-name
ROS 節點管理器 roscore
啓動節點 rosrun package-name executable-name
查看節點列表 rosnode list
顯式設置節點的名稱 rosrun package-name executable-namec++
查看節點 rosnode info node-name
終止節點 rosnode kill node-name ctrl-c不會當即終止
查看節點之間的鏈接關係 rqt_graph
話題列表 rostopic list
打印消息內容 rostopic echo topic-name
測量發佈頻率 rostopic hz topic-name rostopic bw topic-name
查看話題 rostopic info topic-name
查看消息類型 rosmsg show message-type-name
用命令行發佈消息 rostopic pub -r rate-in-hz topic-nameshell
建立工做區 mkdir -p ~/catkin_ws/src
建立功能包 進入src文件夾 catkin_create_pkg package-name數組
編寫程序:bash
1.功能包文件夾中建立xxx.cpp文件
2.包含依賴庫 #include <ros / ros.h>
每個消息類型 #include <package_name/type_name.h>
3.main函數中 ros::init 最後一個參數爲節點默認名
4.ros::NodeHandle一個程序建立一個對象服務器
編譯程序:
1.聲明依賴庫 (package-names roscpp)
CMakeLists.txt中 find_package(catkin REQUIRED COMPONENTS package-names)
package.xml中
<build_depend>package-name</build_depend>
<run_depend>package-name</run_depend>
2.聲明可執行文件 CMakeLists.txt 中添加兩行
add_executable(executable-name source-files)
target_link_libraries(executable-name ${catkin_LIBRARIES})
3.編譯工做區 從工做區目錄運行 catkin_make框架
4.source ~/catkin_ws/devel/setup.bash 每一個終端運行一次分佈式
發佈消息:
1.包含消息類型聲明
#include <package_name/type_name.h>
2.建立發佈者對象
ros::Publisher pub = node_handle.advertise<message_type>( topic_name, queue_size);
topic_name相對名稱
同一個節點發布關於多個話題的消息,須要爲每一個話題建立一個獨立的 ros::Publisher 對象
建立一個發佈者是一個很耗時的操做
3.建立並填充消息對象
4.發佈消息
pub.publish(msg);
5.定義輸出格式
ROS_INFO_STREAM函數
節點是否中止工做的檢查 ros::ok()
控制消息發佈頻率 ros::Rate對象 ros::Rate rate(hz); rate.sleep();學習
訂閱消息:
1.編寫回調函數
void function_name(const package_name::type_name &msg)
{
. . .
}
2.建立訂閱者對象
建立一個ros::Subscriber對象
ros::Subscriber sub = node_handle.subscribe (topic_name,queue_size, pointer_to_callback_function)
3.給ROS控制權
ros::spin() 這個方法要求 ROS 等待而且執行回調函數(阻塞方式)
ros::spinOnce()這個代碼要求 ROS 去執行全部掛起的回調函數,而後將控制權限返回給咱們(非阻塞)
每個日誌消息都被髮布到話題/rosout 上。該話題的消息類型是rosgraph_msgs/Log
查看/rosout消息 rostopic echo /rosout rqt_console
設置某個節點的日誌級別:
1.經過命令行設置日誌級別 rosservice call /node-name/set_logger_level ros.package-name level
2.經過圖形界面設置日誌級別 rqt_logger_level
3.經過 C++代碼設置日誌級別
全局名稱 前斜槓"/"
默認命名空間+相對名稱=全局名稱
爲每一個節點設置默認命名空間(不設則使用"/")
1.ROS 程序 _ _ns:=default-namespace
2.環境變量爲在 shell 內執行的 ROS 程序設置默認命名空間 Export ROS_NAMESPACE=default-namespace
3.啓動文件 ns=」namespace(最經常使用)
私有名稱 以一個波浪字符(~)開始
節點名+私有名稱=全局名稱
匿名名稱 通常用於爲節點命名 ros::init_options::Anonymous-Name 做爲第四個參數傳遞給ros::init 方法
啓動文件:
.launch 由一個包含若干節點元素(node elements)的根元素(root element)組成
執行啓動文件 roslaunch package-name launch-file-name
每一個節點元素有以下三個必需的屬性 pkg type name
在啓動文件內使用一個匿名名稱 name=」$(anon base_name)
在控制檯中輸出信息 output=」screen
令 roslaunch 在控制檯中顯示全部節點的輸出 roslaunch -screen package-name launch-file-name
請求復位 respawn=」true 這樣當節點中止的時候, roslaunch 會從新啓動該節點
必要節點 required=」true 當一個必要節點終止的時候,roslaunch 會終止全部其餘活躍節點並退出
爲節點維護獨立的窗口 Launch-prefix=「comman-prefix? launch-prefix=」xetr-e?
名稱重映射
建立重映射
1.當使用命令行啓動節點時 original-name := new-name
2.經過啓動文件的方式 <remap from=」origina-name」to 」n-name」/>
怎樣理解重映射?????
啓動文件包含其餘文件 <include file=」$(find packag-name)/launch-file-name」
聲明參數 <arg name=」ag-name」>
參數賦值 roslaunch package-name launch-file-name arg-name:=arg-value
<arg name=」ar-name」 default=」a-value」/ >
<arg name=」ar-name」 value=」a-value」/ >
命令行參數能夠覆蓋默認值default,可是不能覆蓋參數值value.由 value 設置的參數值是不能更改的
獲取參數值 $(arg arg-name)
查看參數列表 rosparam list
查詢參數 rosparam get parameter_name
檢索給定命名空間中的每個參數的值 rosparam get namespace
設置參數 rosparam set parameter_name parameter_value
只有當節點的/clear服務被調用時,它纔會從參數服務器讀取這些參數的值 rosservice call /clear
使用c++獲取參數 void ros::param::set(parameter_name, input_value);
bool ros::param::get(parameter_name, output_value);
在啓動文件中設置參數 <param name="param-name" value="param-value" />
設置私有參數 在節點元素中包含param元素
服務調用是雙向的,一個節點給另外一個節點發送信息並等待響應
服務調用實現的是一對一通訊
服務數據類型分爲兩部分,分別表示請求和響應
列出全部服務 rosservice list
查看某個節點的服務類型 rosnode info node-name
查找提供服務的節點 rosservice node service-name
查找服務的數據類型 rosservice info service-name
功能包名+類型名=服務數據類型
查看服務數據類型 rossrv show service-data-type-name
從命令行調用服務 rosservice call service-name request-content
一個服務的客戶端程序:
1.聲明請求和響應的類型 #include <package_name/type_name.h>
2.建立客戶端對象 ros::ServiceClient client = node_handle.serviceClient<service_type>( service_name);
3.建立請求和響應對象 package_name::service_type::Request
package_name::service_type::Response
4.調用服務 bool success = service_client.call(request,reponse);
5.聲明對定義服務類型的功能包的依賴
編輯CMakeLists.txt的find_package行和清單文件 packag.xml的build_depend、run_depend
服務器程序:
1.編寫服務的回調函數,給 Response 對象的數據成員賦值
bool function_name(
package_name::service_type::Request &req),
package_name::service_type::Response &resp)
) {
...
}
2.建立服務器對象 (service_name局部名稱)
ros::ServiceServer server = node_handle.advertiseService( service_name,pointer_to_callback_function);
編譯單個或多個package catkin_make --pkg <package A> <package B>
建立自定義消息msg\srv文件 1.變量類型與名稱之間只能用空格,不能用tab 2.數組能夠不指定大小,代碼中數組不能直接用{}賦值,用pushback或resize賦值,或逐個賦值