![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iY1EzYlBzY2MjYiNGNldDN5UmNiBDMiNGOjdjNkNDZj9CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
1.什麼是工作空間
工作空間(workspace)是一個存放工作開發相關檔案的檔案夾
- src:代碼空間(Source Space)
- build:編譯空間(Build Space)
- devel:開發空間(Development Space)
- 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.話題程式設計
話題程式設計流程
- 建立釋出者
- 建立訂閱者
- 添加編譯選項
- 運作可執行程式
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檔案
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坐标變換
機器人中的坐标變換
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
可視化工具
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)
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視圖區、工具欄、顯示項清單、視角設定區、時間顯示區
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:時間顯示區
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).開始仿真
總結