5.使用dynamic_reconfigure實現節點參數動態更新
0x00 為何需要在線動態更新參數
在整個ROS開發過程中,經常需要配置各種參數保證系統的正常運行,默認提供的參數一般都是寫好固定在相應的配置文件中,在各節點啟動時從配置文件中一次性的讀取然後保持該參數一直運行,如果想要重新修改參數需要將當前節點停止,修改好配置文件中相應參數,然後重新啟動節點這樣才能完成參數的更新。整個過程比較費時費力,而且難免也會影響系統的正常運行,所以我們就需要在不停止節點運行情況下來實時更新所需的參數,在ROS下dynamic_reconfigure軟體包就可以來完成在線動態更新節點參數的功能。
0x01 安裝必須軟體包
首先是安裝ROS下相應版本的dynamic_reconfigure軟體包,使用如下命令來安裝(ROS各版本都可以使用該命令):
sudo apt-get install -y ros-$ROS_DISTRO-dynamic-reconfigure
在本次教程中我們使用turtlesim來做相應的演示,所以需要確保turtlesim相關軟體包已經安裝好了:
sudo apt-get install -y ros-$ROS_DISTRO-turtlesim
使用如下命令確保turtlesim可以正常運行:
0x02 使用yaml配置文件來更新節點參數
我們首先演示如何使用yaml文件來載入配置參數,這種方式雖然也可以修改節點參數,但是如果要想更新參數必須要先將節點停止重新啟動重新讀取參數才能使配置參數生效,接下來是整個操作過程:
(1)創建軟體包,使用如下命令:
catkin_create_pkg turtlesim_dynamic rospy roscpp dynamic_reconfigure
(2)在src目錄下編寫源碼文件turtlesim_dynamic.cpp,控制turtlesim來轉圈:
(3)在cfg目錄下增加dynamic.yaml配置文件,需要注意每個參數都是一個鍵值對,冒號後面有一個空格,文件內容如下:
(4)在launch目錄下創建turtlesim_dynamic.launch文件,文件內容如下:
(5)最後修改編譯配置文件CMakeLists.txt,主要就是修改源碼文件名和將target_link_libraries注釋取消掉即可,具體需要修改的地方如下圖所示:
(6)編譯軟體包使用turtlesim_node來進行測試:
直接在catkin_ws目錄下執行catkin_make命令來編譯所有軟體包,然後source devel/setup.bash後就可以來使用roslaunch來啟動該節點了,完整命令如下:
roslaunch turtlesim_dynamic turtlesim_dynamic.launch
接下來啟動turtlesim_node節點,命令如下:
rosrun turtlesim turtlesim_node
啟動後完整的測試效果如下所示,可以發現我們設置的默認頻率是1Hz,移動的線速度x是1m/s,角速度z是1rad/s執行都是正常的:
GIF
當需要修改參數時,我們需要先將該節點停止,然後修改dynamic.yaml配置文件,然後重新啟動才能看到修改參數後的效果,如下圖所示:
GIF
0x03 使用dynamic_reconfigure動態更新參數
(1)首先編寫需要的cfg文件,在cfg目錄下創建dynamic.cfg文件,該文件是使用python來編寫的,配置文件內容如下:
下面來對上述源碼進行簡要解析,需要注意的代碼如下:
gen = ParameterGenerator() :創建一個動態參數生成器,後面就可以往該變數中添加可以動態配置的參數。
gen.add("cmd_pub_rate", int_t, 0, "turtlesim cmd pub rate", 1, 0, 5):第一個參數代表是該可配置動態參數名,是一個字元串形式;第二個參數表示參數的數據類型;第三個參數表示需要傳入參數動態配置回調函數中的掩碼,在回調函數中會修改所有參數的掩碼,表示參數已經進行修改,一般都是設置為0;第四個參數表示對該參數的說明描述;第五個參數表示參數設置的默認值;第六個參數表示參數可以設置的最小值;最後一個參數表示可設置的參數的最大值;
exit(gen.generate(PACKAGE, "turtlesim_dynamic_node", "dynamic")):用於生成所有C++和Python相關的頭文件並且退出程序,這裡第二個參數表示動態參數運行的節點名,第三個參數是生成文件所使用的前綴,需要和配置文件名相同,不要帶後面的.yaml後綴,這樣根據該配置文件就會生成dynamicConfig.h的頭文件,後面在cpp的源碼中可以直接引用。
需要注意給該文件增加上執行許可權,使用chmod +x dynamic.yaml來給該文件加上執行許可權。
(2)修改turtlesim_dynamic.cpp源碼文件,具體代碼如下:
下面對上述源碼進行簡要解析,需要注意的代碼如下:
dynamic_reconfigure::Server server:創建了一個動態參數配置的服務端實例,參數配置的類型就是配置文件中描述的類型,該服務端實例會監聽客戶端的參數配置請求。
dynamic_reconfigure::Server::CallbackType callback;
callback = boost::bind(&dynamic_callback, _1);
server.setCallback(callback);定義一個回調函數,並將回調函數和服務端綁定,當客戶端請求修改參數時,服務端即可跳轉到回調函數中進行處理。
(3)修改CMakeLists.txt編譯配置文件:
(4)修改launch文件,同時啟動turtlesim_node模擬小烏龜和rqt_reconfigure控制面板:
(5)重新編譯該軟體包,然後啟動launch文件開始測試,測試效果如下圖所示:
GIF
0x04 使用dynparam命令行工具
我們除了可以使用GUI工具rqt_reconfigure來調整各參數外,還可使用命令行工具來操作各參數,該命令工具使用規則如下:
rosrun dynamic_reconfigure dynparam COMMAND
目前支持的命令列表如下:
rosrun dynamic_reconfigure dynparam list :列出當前可以動態配置參數的節點
rosrun dynamic_reconfigure dynparam get 節點名 :獲取節點的配置參數信息
rosrun dynamic_reconfigure dynparam set 節點名 參數名 參數值 :設置節點的配置參數信息
rosrun dynamic_reconfigure dynparam dump 節點名 ×××.yaml:將節點的配置參數信息保存進xxx.yaml文件中
rosrun dynamic_reconfigure dynparam load 節點名 ×××.yaml:將保存節點配置參數信息的xxx.yaml文件載入到節點中
接下來通過演示來分別詳細介紹每個命令的用法:
(1)列出當前系統中哪些節點可以動態配置參數,命令如下:
rosrun dynamic_reconfigure dynparam list
(2)獲取節點的詳細配置參數信息,命令如下:
rosrun dynamic_reconfigure dynparam get /turtlesim_dynamic_node
(3)設置節點的某一個參數,假如設置linear_x為2.0,命令如下:
rosrun dynamic_reconfigure dynparam set /turtlesim_dynamic_node linear_x 2.0
GIF
(4)將節點的配置信息保存到yaml文件中,假設文件名為my_dynamic.yaml,完整命令如下:
rosrun dynamic_reconfigure dynparam dump /turtlesim_dynamic_node my_dynamic.yaml
(5)修改yaml配置文件里參數,重新將參數載入到節點中,修改參數如下所示:
使用如下命令來將修改的參數重新載入,命令如下:
rosrun dynamic_reconfigure dynparam load /turtlesim_dynamic_node my_dynamic.yaml
GIF
0x04 參考資料
[1].dynamic_reconfigure軟體包在ROS WiKi官網地址[OL].http://wiki.ros.org/dynamic_reconfigure/Tutorials
0x05 問題反饋
大家在按照教程操作過程中有任何問題,可以關注ROS小課堂的官方微信公眾號,在公眾號中給我發消息反饋問題即可,我基本上每天都會處理公眾號中的留言!當然,如果你要是順便給ROS小課堂打個賞,我也會感激不盡的,打賞30塊還會邀請進ROS小課堂的微信群與更多志同道合的小夥伴一起學習和交流!
TAG:ROS小課堂 |