初識ROS機器人操做系統

  最近因工做須要,學習了一下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賦值,或逐個賦值

相關文章
相關標籤/搜索