2.5 參數(shù)服務(wù)
場景
在機器人系統(tǒng)中不同的功能模塊可能會使用到一些相同的數(shù)據(jù),比如:
導(dǎo)航實現(xiàn)時,會進行路徑規(guī)劃,路徑規(guī)劃主要包含, 全局路徑規(guī)劃和本地路徑規(guī)劃,所謂全局路徑規(guī)劃就是設(shè)計一個從出發(fā)點到目標(biāo)點的大致路徑,而本地路徑規(guī)劃,則是根據(jù)車輛當(dāng)前路況生成實時的行進路徑。兩種路徑規(guī)劃實現(xiàn),都會使用到車輛的尺寸數(shù)據(jù)——長度、寬度、高度等。那么這些通用數(shù)據(jù)在程序中應(yīng)該如何存儲、調(diào)用呢?
上述場景中,就可以使用參數(shù)服務(wù)實現(xiàn),在一個節(jié)點下保存車輛尺寸數(shù)據(jù),其他節(jié)點可以訪問該節(jié)點并操作這些數(shù)據(jù)。
概念
參數(shù)服務(wù)是以共享的方式實現(xiàn)不同節(jié)點之間數(shù)據(jù)交互的一種通信模式。保存參數(shù)的節(jié)點稱之為參數(shù)服務(wù)端,調(diào)用參數(shù)的節(jié)點稱之為參數(shù)客戶端。參數(shù)客戶端與參數(shù)服務(wù)端的交互是基于請求響應(yīng)的,且參數(shù)通信的實現(xiàn)本質(zhì)上對服務(wù)通信的進一步封裝。
作用
參數(shù)服務(wù)保存的數(shù)據(jù)類似于編程中“全局變量”的概念,可以在不同的節(jié)點之間共享數(shù)據(jù)。
2.5.1 案例以及案例分析
1.案例需求
需求:在參數(shù)服務(wù)端設(shè)置一些參數(shù),參數(shù)客戶端訪問服務(wù)端并操作這些參數(shù)。

2.案例分析
在上述案例中,需要關(guān)注的要素有三個:
參數(shù)客戶端;
參數(shù)服務(wù)端;
參數(shù)。
3.流程簡介
案例實現(xiàn)前需要先了解ROS2中參數(shù)的相關(guān)API,無論是客戶端還是服務(wù)端都會使用到參數(shù),而參數(shù)服務(wù)案例實現(xiàn)主要步驟如下:
編寫參數(shù)服務(wù)端實現(xiàn);
編寫參數(shù)客戶端實現(xiàn);
編輯配置文件;
編譯;
執(zhí)行。
案例我們會采用C++和Python分別實現(xiàn),二者都遵循上述實現(xiàn)流程。
4.準(zhǔn)備工作
終端下進入工作空間的src目錄,調(diào)用如下兩條命令分別創(chuàng)建C++功能包和Python功能包。
ros2 pkg create cpp04_param --build-type ament_cmake --dependencies rclcpp
ros2 pkg create py04_param --build-type ament_python --dependencies rclpy
2.5.2 參數(shù)數(shù)據(jù)類型
在ROS2中,參數(shù)由鍵、值和描述符三部分組成,其中鍵是字符串類型,值可以是bool、int64、float64、string、byte[]、bool[]、int64[]、float64[]、string[]中的任一類型,描述符默認情況下為空,但是可以設(shè)置參數(shù)描述、參數(shù)數(shù)據(jù)類型、取值范圍或其他約束等信息。
為了方便操作,參數(shù)被封裝為了相關(guān)類,其中C++客戶端對應(yīng)的類是rclcpp::Parameter
,Python客戶端對應(yīng)的類是rclpy.Parameter
。借助于相關(guān)API,我們可以實現(xiàn)參數(shù)對象創(chuàng)建以及參數(shù)屬性解析等操作。以下代碼提供了參數(shù)相關(guān)API基本使用的示例。

