【ROS實踐入門(七)launch文件和動態參數使用】

【ROS實踐學習入門系列(七)launch文件和動態參數使用

本內容經官網實例以及一些參考書總結而成,歡迎留言評論交流~

聯繫方式:ziyuanw#foxmail.com(#換成@)

一、節點和launch文件關係

節點rosrun 一次只能執行一個,當我們自定義的程序功能包有許多個的話,此時一個一個執行起來就非常麻煩,因此此時可以利用一個很有用的功能launch。

命令爲:roslaunch

二、創建launch文件

添加文本:

<?xml version="1.0"?>
<launch>
	<node name ="example1_a" pkg="test" type="example1_a"/>
	<node name ="example1_b" pkg="test" type="example1_b"/>
</launch>

三、運行launch 文件:

roslaunch test.launch

 查看運行節點信息:

rosnode list

四、動態參數

動態參數的一個功能是可以實現動態地重新配置實時使用的程序,在上面的幾種情況中節點中的數據都是我初始化寫程序時就規定好的,但是如果要從外部動態改變這些值,可以使用參數服務器、服務、或主題傳入。如果使用PID節點控制一個電機機器人無人機等,那麼應該使用動態重配置參數來實時配置程序。

首先,要想使用動態參數首先要知道要使用的文件爲*cfg文件(大多ROS中.cfg文件語言爲python格式)。而且還要修改CMakeLists.txt文件和package.xml文件。

1.創建cfg文件:

添加test.cfg文件:

#!/usr/bin/python
# encoding: utf-8
##注意:上面python路徑換爲自己的python路徑
##若不清楚可使用:whereis python命令查看路徑
##注意:若出現編碼錯誤則添加上面第二行

##代碼初始化ROS並傳入參數生成器
PACKAGE = "test"
from dynamic_reconfigure.parameter_generator_catkin import *
##初始化參數生成器,通過下面的代碼行添加參數
gen = ParameterGenerator()
##添加int類型參數
gen.add("int_param",   int_t,    0, "An Integer parameter",1,0,100)
##添加double類型參數
gen.add("double_param",double_t, 0, "A double parameter",0.1,0,1)
##添加str類型參數
gen.add("str_param",   str_t,    0, "A string parameter","test_dynamic_reconfigure")
##添加bool類型參數
gen.add("bool_param",   bool_t,  0, "A Boolean parameter",True)

size_enum=gen.enum ([gen.const("Low",int_t,0,"Low is 0"),
		    gen.const("medium",int_t,1,"Medium is 1"),
 		    gen.const("High",int_t,2,"High is 2")],
		    "Select from the list")
gen.add("Size",int_t,0,"Select from the list",1,0,3,edit_method=size_enum)
##生成必要的文件並退出程序,.cfg文件是Python代碼寫的。
##輸出名稱爲test_,配置頭文件使用時爲test_Config.h
exit(gen.generate(PACKAGE,"test","test_"))
  • 如果出現錯誤:
  • SyntaxError: Non-ASCII character '\xe6' in file /home/ziyuan/Documents/catkin_ws/src/test/cfg/test.cfg on line 2, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
  • 這是由於編碼格式不對,需要做出下面修改:
  • 在第二行加上:
  • # encoding: utf-8

五、建立新節點以執行動態配置文件:

添加一個名爲example4.cpp的文件以支持執行新節點。

1.在test的src目錄下建立如下代碼:

#include<ros/ros.h>						//包含ROS核心程序頭文件
#include<dynamic_reconfigure/server.h>	//包含參數服務器
#include<test/test_Config.h>			//包含自己創建的config文件test.cfg


//callback函數輸出參數的新值,參數名稱必須與test.cfg配置文件參數相同
void callback(test::test_Config &config, uint32_t level1)
{
	ROS_INFO("Reconfigure Request: %d %f %s %s %d",
			config.int_param,
			config.double_param,
			config.str_param,
			config.bool_param?"True":"False",
			config.Size);
}

int main(int argc,char **argv)
{
	//ROS初始化並命名爲"example4_dynamic_reconfigure"
	ros::init(argc,argv,"example4_dynamic_reconfigure");
	//初始化服務器
	dynamic_reconfigure::Server<test::test_Config>server;
	dynamic_reconfigure::Server<test::test_Config>::CallbackType f;
	//想服務器發送callback 函數,當服務器得到重新配置請求時,調用callback函數。
	f=boost::bind(&callback,_1,_2);
	server.setCallback(f);
	ros::spin();
	return 0;
}

2.修改test下的CMakeLists.txt和package.xml文件:

find_package()中多了一項dynamic_reconfigure。然後依賴項變成了cfg文件。

## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
  dynamic_reconfigure
)

## Generate dynamic reconfigure parameters in the 'cfg' folder
generate_dynamic_reconfigure_options(
   cfg/test.cfg
 )


##Build the example4
add_executable(example4 src/example4.cpp)
add_dependencies(example4 test_gencfg)
target_link_libraries(example4 ${catkin_LIBRARIES})

package.xml文件還是之前的修改方式:

<build_depend>message_generation</build_depend>

行和:

<exec_depend>message_runtime</exec_depend> -->

    (PS:package .xml:還可以自定義個性化程序包,添加個人郵件信息標籤,許可方案等可選。)

3.修改一下test.cfg文件的權限

~/catkin_ws/src/test$ chmod a+x cfg/test.cfg 

注意一定:要修改一下test.cfg文件的權限,因爲ROS代碼主要是C++寫的,而*.cfg是python格式,但是文件要由ROS執行,所以需要改變該文件的權限。不然catkin_make時找不到該文件會報錯:

CMakeFiles/Makefile2:1050: recipe for target 'test/CMakeFiles/test_gencfg.dir/all' failed
make[1]: *** [test/CMakeFiles/test_gencfg.dir/all] Error 2

4.回到catkin_ws工作空間編譯:

roscd ~/catkin_ws
catkin_make

5.執行節點example4

  • (更新工作空間環境配置:每個終端狀窗口記得source devel/setup.bash)

CTRL+Alt+T第一個窗口:

roscore

CTRL+Shift+T第二個窗口:

rosrun test example4

CTRL+Shift+T第三個窗口:

rosrun rqt_reconfigure rqt_reconfigure

效果如下:

在第三個窗口執行:rosrun rqt_reconfigure rqt_reconfigure

動態拉動滑動條可以發現上方窗口數值和消息會隨之改變,即完成了動態參數的配置過程。

 

至此,ROS的基本架構以及工作方式,節點,主題,消息,服務,參數配置,服務器,接收端等進行交互的基本內容以及完畢,其中還演示了一些基本可視化UI的使用,包括rqt_graph等等。後面更多可視化工具以及調試工具和ROS常用的仿真包Gazebo使用等到用的時候再記錄。後面的博客可能就着重聯繫ROS和相機節點的交互以及圖像信息的處理。

 

 

上一篇:【ROS實踐入門(六)消息msg和服務srv文件創建與使用】

下一篇:【ROS實踐入門(八)ROS使用USB視覺傳感器相機】

 

 

參考資料:

【1】ROS官網:http://wiki.ros.org/cn

【2】ROS機器人高效編程

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章