roslaunch的 launch 文件中 arg、rosparam 等标签配合 $eval与if 条件判断配合使用的简单测试

roslaunch的 launch 文件中 arg、rosparam 等标签配合 $eval与if 条件判断配合使用的简单测试

launch 文件中 arg rosparm 标签

arg 标签可以定义接收 launch的参数
rosparm 可以定义 ros参数,保存到参数服务器中

配合$(eval xxx)可以执行python代码,于是让launch文件有了灵活性

理论上可以根据参数不同来做:
1节点启动的控制 让if 属性不那么刻板
2读取参数服务器的数据,给节点传参(有点重复呵呵)
3延时?
4有待发掘

launch文件测试源码

注意要先启动roscore哦,因为这个文件内部要用python调用参数
如果参数服务器都没有启动好,会报错的哦

<!-- roslaunch的 launch 文件中  arg eval  与if 条件判断配合使用的简单测试 -->

<launch>

<arg name="delay" default="$(eval eval('_'+'_import_'+'_(&quot;time&quot;)').sleep(2))"/>
<arg name="radius" default="[3.0, 1.0]"/><!-- 注意radius传递的值为字符串 $(eval arg('radius')[0])为   [   -->
<rosparam param="zzzzzz" subst_value="True">$(eval 2.* 3.1415 * float(arg('radius')[3]))</rosparam><!-- 不恰当的解析-->
<rosparam param="z1" subst_value="True">$(eval float(arg('radius')[1:][:-1].split(',')[0]))</rosparam><!-- 合适的解析-->
<rosparam param="z2" subst_value="True">$(eval float(arg('radius')[1:][:-1].split(',')[0])==3)</rosparam>
<rosparam param="z3" subst_value="True">$(eval 'true' if float(arg('radius')[1:][:-1].split(',')[0])==3 else 'false')</rosparam>
<rosparam param="z4" subst_value="True">$(eval 'true' if float(arg('radius')[1:][:-1].split(',')[1])==0 else 'false')</rosparam>
<rosparam param="zdir" subst_value="True">$(eval eval("_"+"_import_"+"_('os')").system('dir')  )</rosparam>
<!--rosparam param="zget" subst_value="True">$(eval eval("_"+"_import_"+"_('subprocess').check_output(eval("['rosparam','get','z1']")).strip()") )</rosparam-->
<rosparam param="z5" subst_value="True">$(eval eval("_"+"_import_"+"_('subprocess')").check_output(eval("['rosparam','list']")).strip() )</rosparam>

<rosparam param="z6" subst_value="True">$(eval eval("_"+"_import_"+"_('subprocess').check_output(['rosparam','list']).strip()") )</rosparam>
<rosparam param="z7" subst_value="True">$(eval 1 if  (lambda a,b,c,d: a+b+c+d)(1,2,3,4)==eval("1+2+3+4") else 2 )</rosparam>
<rosparam param="z8" subst_value="True">$(eval (lambda a,b,c,d:(eval("_"+"_import_"+"_('time')").sleep(2), exec("1+1"),a+b+c+d))(1,2,3,4) )</rosparam>
<arg name="test" default="$(arg radius)"/>

<rosparam param="ztest" subst_value="True">$(arg test)</rosparam>
<arg name="class" default="stand"/>

<group if="$(eval 'true' if arg('class')=='stand' else 'false')">
  <arg name="user" default="0"/>
  <arg name="stand" default="1"/>
<rosparam param="zuser" subst_value="True">$(arg user)</rosparam>
<rosparam param="zstand" subst_value="True">$(arg stand)</rosparam>
</group>

<group if="$(eval 'true' if arg('class')=='user' else 'false')">
  <arg name="user" default="1"/>
  <arg name="stand" default="0"/>
<rosparam param="zuser" subst_value="True">$(arg user)</rosparam>
<rosparam param="zstand" subst_value="True">$(arg stand)</rosparam>
</group>
<!-- group定义的arg 下面的调用测试不通过  组内问题还是launch执行顺序问题没有深究,需要看launch文件执行时的逻辑了-->
<!--

<group if="$(arg stand)">

$(eval xxx )
xxx是表达式有返回值
测试import时,对__双下划线有检测。做了点手脚还真蒙混过关了。
exec 不支持 不是function 不行的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值