天天看點

ros 釋出資訊頻率_ROS入門筆記二基礎

ros 釋出資訊頻率_ROS入門筆記二基礎
1.建立工作空間

1.什麼是工作空間

工作空間(workspace)是一個存放工作開發相關檔案的檔案夾

  1. src:代碼空間(Source Space)
  2. build:編譯空間(Build Space)
  3. devel:開發空間(Development Space)
  4. install:安裝空間(Install Space)

2.建立工作空間

mkdir -p ~/catkin_ws/src
  cd ~/catkin_ws/src
  catkin_init_workspace
           

建立ROS 工作空間時出現:

程式“catkin_init_workspace”尚未安裝,程式“catkin_make”尚未安裝。

解決方法:

source /opt/ros/kinetic/setup.bash
           

3.編譯工作空間

cd ~/catkin_ws/
  catkin_make
           

4.設定環境變量

source devel/setup.bash
           

5.檢查環境變量

echo $ROS_PACKAGE_PATH
           

6.建立功能包

cd ~/catkin_ws/src
  catkin_create_pkg learning_communication std_msgs rospy roscpp
           

7.編譯功能包

cd ~/catkin_ws
  catkin_make
  source ~/catkin_ws/devel/setup.bash
           

注意:同一個工作空間下,不允許存在同名功能包;不同工作空間下,允許存在同名功能包。

ROS工作空間的Overlaying機制,即工作空間的覆寫

env | grep ros 檢視ROS相關的環境變量

  • 1).工作空間的路徑依次在ROS_PACKAGE_PATH環境變量中記錄
  • 2).新設定的路徑在ROS_PACKAGE_PATH中會自動放置在最前端
  • 3).運作時,ROS會優先查找最前端的工作空間中是否存在指定的功能包
  • 4).如果不存在,就順序向後查找其他工作空間

~#rospack find roscpp_tutorials

系統路徑下的功能包

catkin_ws# rospack find roscpp_tutorials

工作空間下的功能包

2.ROS通信程式設計

1.話題程式設計

話題程式設計流程

  • 建立釋出者
  • 建立訂閱者
  • 添加編譯選項
  • 運作可執行程式
ROS通信程式設計---話題程式設計

1. 如何實作一個釋出者

  • 初始化ROS節點
  • 向ROS Master注冊節點資訊,包括釋出的話題名和話題中的現象類型
  • 按照一定頻率循環釋出資訊

2.如何實作一個訂閱者

  • 初始化ROS節點
  • 訂閱需要的話題
  • 循環等待話題消息,接收到消息後進入回調函數
  • 在回調函數中完成消息處理

3.如何編譯代碼

  • 設定需要編譯的代碼和生成的可執行檔案
  • 設定連結庫
  • 設定依賴

CMakeLists.txt

add_executable(talker src/talker.cpp)
	target_link_libraries(talker ${catkin_LIBRARIES})
	#add_dependencies(talker ${PROJECT_NAME}_generate_messages_cpp)
 
	add_executable(listener src/listener.cpp)
	target_link_libraries(listener ${catkin_LIBRARIES})
	#add_dependencies(talker ${PROJECT_NAME}_generate_messages_cpp)
 
           

4.運作可執行檔案

rosrun learning_communication talker
	rosrun learning_communication listener
 
           

如何定義話題

1).定義msg檔案

Person.msg
			 string name
			 uint8 sex 
			 uint8 age
 
			 uint8 unknown=0
			 uint8 male = 1
			 uint8 female=2
           

2).在package.xml中添加功能包依賴

<build_depend>message_generation</build_depend>
	<exec_depend>message_runtime</exec_depend>
           

3).在CMakeLists.txt添加編譯選項

a.find_package(...... message_generation)
	b.catkin_package(CATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs message_runtime)
	c.add_message_file(FILES Person.msg)
	generate_messages(DEPENDENCIES std_msgs)
           

部分ROS版本中exec_depend需要改成run_depend

編譯 catkin_make

檢視自定義的消息

rosmsg show Person
           

2服務程式設計

服務程式設計流程:

  • 1).建立伺服器
  • 2).建立用戶端
  • 3).添加編譯選項
  • 4).運作可執行程式

如何自定義服務請求與應答

1).定義srv檔案 AddTwoInts.srv

int64 a 
		   int64 b 
		   ---
		   int64 sum 
           

2).在package.xml中添加功能包依賴

<build_depend>message_generation</build_depend>
	<exec_depend>message_runtime</exec_depend>
           

3).在CMakeLists.txt添加編譯選項

a.find_package(...... message_generation)
	b.catkin_package(CATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs message_runtime)
	c.add_service_file(FILES AddTwoInts.srv)
           

部分ROS版本中exec_depend需要改成run_depend

ROS通信程式設計---服務程式設計

1.如何實作一個伺服器

  • 1).初始化ROS節點
  • 2).建立Server執行個體
  • 3).循環等待服務請求,進入回調函數
  • 4).在回調函數中完成服務功能的處理,并回報應答資料

2.如何實作一個用戶端

  • 1).初始化ROS節點
  • 2).建立一個Client執行個體
  • 3).釋出服務請求資料
  • 4).等待Server處理之後的應答結果

3.如何編譯代碼

  • 1).設定需要編譯的代碼和生成的可執行檔案
  • 2).設定連結庫
  • 3).設定依賴
CMakeLists.txt 
			add_executable(server src/server.cpp)
			target_link_libraries(server ${catkin_LIBRARIES})
			add_dependencies(server ${PROJECT_NAME}_gencpp)
 
			add_executable(client src/client.cpp)
			target_link_libraries(client ${catkin_LIBRARIES})
			add_dependencies(client ${PROJECT_NAME}_gencpp)
 
           

4.如何運作可執行檔案

1).Server節點啟動後的日志資訊

rosrun learning_communication server 
           

2).Client啟動後釋出服務請求,并成功接收到回報結果

rosrun learning_communication client 3 5 
           

3).Server接收到服務調用後完成加法求解,并将結果回報給Client

rosrun learning_communication server 
           

3動作程式設計

1.什麼是動作程式設計

  • 1).一種問答通信機制
  • 2).帶有連續回報
  • 3).可以在任務過程中止運作
  • 4).基于ROS的消息機制實作

2.Action的接口

  • 1).goal:釋出任務目标
  • 2).cancel:請求取消任務
  • 3).status:通知用戶端目前的狀态
  • 4).feedback:周期回報任務運作的監控資料
  • 5).result:向用戶端發送任務的執行結果,隻釋出一次

3.如何自定義動作消息

1).定義action檔案

DoDishes.action 
		  #定義目标資訊
		  uint32 dishwasher_id
		  #Specify which dishwasher we want to use
		  ---
		  #定義結果資訊
		  uint32 total_dishes_cleaned
		  ---
		  #定義周期回報的消息
		  float32 percent_complete
           

2).在package.xml中添加功能包依賴

<build_depend>actionlib</build_depend>
			 <build_depend>actionlib_msgs</build_depend>
			 <exec_depend>actionlib</exec_depend>
			 <exec_depend>actionlib_msgs</exec_depend>
           

3).在CMakeLists.txt添加編譯選項

a.find_package(catkin REQUIRED actionlib_msgs actionlib)
			 b.add_action_file(DIRECTPRY action FILES DoDishes.action)
			 c.generate_messages(DEPENDENCIES actionlib_msgs)
           

部分ROS版本中exec_depend需要改成run_depend

4.如何實作一個動作伺服器

  • 1).初始化ROS節點
  • 2).建立動作伺服器執行個體
  • 3).啟動伺服器,等待動作請求
  • 4).在回調函數中完成動作服務功能的處理,并回報進度資訊
  • 5).動作完成,發送結資訊

5.如何實作一個動作用戶端

  • 1).初始化ROS節點
  • 2).建立動作用戶端執行個體
  • 3).連接配接動作服務端
  • 4).發送動作目标
  • 5).根據不同類型的服務端回報處理回調函數。

6.如何編譯代碼

  • 1).設定需要編譯的代碼和生成的可執行檔案
  • 2).設定連結庫
  • 3).設定依賴

CMakeLists.txt

add_executable(DoDishes_client src/DoDishes_client.cpp)
			target_link_libraries(DoDishes_client ${catkin_LIBRARIES})
			add_dependencies(DoDishes_client ${PROJECT_NAME}_EXPORTED_TARGETS)
			add_executable(DoDishes_server src/DoDishes_server.cpp)
			target_link_libraries(DoDishes_server ${catkin_LIBRARIES})
			add_dependencies(DoDishes_server ${PROJECT_NAME}_EXPORTED_TARGETS)
           

7.運作可執行檔案

rosrun learning_communication DoDishes_client
rosrun learning_communication DoDishes_server
           

3.實作分布式通信

ROS是一種分布式軟體架構,節點之間通過松耦合的方式進行組合

1.如何實作分布式多機通信

  • 1).設定IP位址,確定底層鍊路的聯通
  • 2).在從機端設定ROS_MASTER_URI,讓從機找到ROS Master
$export ROS_MASTER_URI=http://pc:11311 (目前終端有效)
		或
		$echo "export ROS_MASTER_URI=http://pc:11311">>~/.bzshrc (所有終端有效)
           

主機端啟動ROS Master與海龜仿真節點

roscore
rosrun turtlesim turtlesim_node
           

從機端釋出一個速度控制消息

rostopic pub -r 10 /turtle1/cmd_vel geometry_msgs/Twist"linear:
x:0.5
y:0.0
z:0.0
angular:
x:0.0
y:0.0
z:0.5"
           

4.ROS中的關鍵元件

1).Launch檔案

ros 釋出資訊頻率_ROS入門筆記二基礎

Launch檔案:通過XML檔案實作多節點的配置和啟動(可自動啟動ROS Master)

<launch> launch檔案中的根元素采用<launch>标簽定義

<node> 啟動節點

<node pkg="package-name" type="executable-name" name="node-name"/>
           
  • 1).pkg:節點所在的功能包名稱
  • 2).type:節點的可執行檔案名稱
  • 3).name:節點運作時的名稱
  • 4).output、respawn、required、ns、args

參數設定

<param>/<rosparam>
           

設定ROS系統運作中的參數,存儲在參數伺服器中。

<param name="output_frame" value="odom"/>
           

name:參數名 value:參數值

加載參數檔案中的多個參數

<rosparam file="param.yaml" command="load" ns="params"/>
<arg>
           

launch檔案内部的局部變量,僅限于launch檔案使用

<arg name="" default="arg-value"/>
           

name:參數名 value:參數值

調用

<param name="foo" value="$(arg arg-name)" />
<node name="node" pkg="package" type="type" args="$(arg arg-name)" />
           

重映射<remap>

重映射ROS計算圖資源的命名

<remap from="/turtlebot/cmd_vel" to="/cmd_vel" />
           

from:原命名 to:映射之後的命名

嵌套<include>

包含其他launch檔案,類似C語言中的頭檔案包含

<include file="$(dirname)/other.launch">
           

file:包含的其他launch檔案路徑

2).TF坐标變換

機器人中的坐标變換

ros 釋出資訊頻率_ROS入門筆記二基礎

TF功能包能幹什麼

  • 1).五秒鐘之前,機器人頭部坐标系相對于全局坐标系的關系是什麼樣的?
  • 2).機器人夾取的物體相對于機器人中心坐标系的位置在哪裡?
  • 3).機器人中心坐标系相對于全局坐标系的位置在哪裡?

TF坐标變換如何實作?

  • 1).廣播TF變換
  • 2).監聽TF變換
sudo apt-get install ros-kinetic-turtle-tf
	roslaunch turtle_tf turtle_tf_demo.launch
	rosrun turtlesim turtle_teleop_key
	rosrun tf view_frames
           

指令行工具

rosrun tf tf_echo turtle1 turtle2	
           
ros 釋出資訊頻率_ROS入門筆記二基礎

可視化工具

rosrun rviz rviz -d `rospack find turtle` /rviz/turtle_rviz.rviz
           

如何實作一個TF廣播器

  • 1).定義TF廣播器(TransformBroadcaster)
  • 2).建立坐标變換值
  • 3).釋出坐标變換(sendTransform)

如何實作一個TF監聽器

  • 1).定義TF監聽器(TransformListener)
  • 2).查找坐标變換(waitForTransform、lookupTransform)
ros 釋出資訊頻率_ROS入門筆記二基礎

3).Qt工具箱

  • 日志輸出工具---rqt_console
  • 計算圖可視化工具---rqt_graph
  • 資料繪圖工具---rqt_plot
  • 參數動态配置工具---rqt_reconfigure

4).Rviz可視化平台

機器人模型、坐标、運動規劃、導航、點雲、圖像、SLAM

Rviz是一款三維可視化工具,可以很好的相容基于ROS軟體架構的機器人平台

  • a.在rviz中,可以使用XML對機器人、周圍物體等任何實物進行尺寸、品質、位置、材質、關節等屬性的描述,并且在界面中呈現出來。
  • b.同時,rviz還可以通過圖形化的方式,實時顯示機器人傳感器的資訊、機器人的運動狀态、周圍環境的變化等資訊
  • c.總而言之,rviz通過機器人模型參數、機器人釋出的傳感資訊等資料,為使用者進行所有可監測資訊的圖形化顯示。使用者和開發者也可以在rviz的控制界面下,通過按鈕、滑動條、數值等方式,控制機器人的行為

rviz界面包括 3D視圖區、工具欄、顯示項清單、視角設定區、時間顯示區

ros 釋出資訊頻率_ROS入門筆記二基礎

rviz插件機制

5).Gazebo實體仿真環境

Features

:Dynamics Simulation、Advanced 3D Graphics、Sensors and Noise、Plugins、Robot Models、TCP/IP Transport、Cloud Simulation、

Command Line Tools.

0:3D視圖區 1:工具欄 2:模型清單 3:模型屬性項 4:時間顯示區

ros 釋出資訊頻率_ROS入門筆記二基礎

Gazebo是一款功能強大的三維實體仿真平台

  • a.具備強大的實體引擎
  • b.高品質的圖形渲染
  • c.友善的程式設計與圖形接口
  • d.開源免費

其典型應用場景包括:

  • a.測試機器人算法
  • b.機器人的設計
  • c.顯示情景下的回溯測試
  • gazebo_ros:主要用于gazebo接口封裝、gazebo服務端和用戶端的啟動、URDF模型生成等
  • gazebo_msgs:是gazebo的Msg和Srv資料結構
  • gazebo_plugins:用于gazebo的通用傳感器插件
  • gazebo_ros_api_plugin和gazebo_ros_path_plugin:這兩個gazebo的插件實作接口封裝

如何使用Gazebo進行仿真

  • 1).建立仿真環境
  • 2).配置機器人模型
  • 3).開始仿真

總結

ros 釋出資訊頻率_ROS入門筆記二基礎