【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机器人高效编程