无所谓位置
不需要有可执行权限
xml格式
私有参数,在命令行指定的方法:前面加_
mkdir -p turtle_launch_ws/src
catkin_make
cd ~/turtle_launch_ws/src
catkin_create_pkg turtlesim_launch roscpp rospy
cd ~/turtle_launch_ws
cd src/turtlesim_launch
mkdir launch
catkin_make
第一个launch,node标签
<launch>
<node pkg="turtlesim" type="turtlesim_node" name="turtle1"/>
</launch>
roslaunch -v turtlesim turtlesim_node
输出详细信息
对应的话题是
/rosout
/rosout_agg
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose
还有就是name属性给节点指派了名称,它将覆盖任何通过调用 ros::init来赋予节点的名称。在默认状态下,从启动文件启动节点的标准输出被重定向到一个日志文件中,而不是在制台显示。该日志文件的名称是: ~/.ros/log/run_id/node_name-number-stout.log 其中,run_id 是节点管理器(master)启动时生成的一个唯一标示符,使用output时,将输出到屏幕
第二个launch————name
<launch>
<node pkg="turtlesim" type="turtlesim_node" name="turtle1"/>
<node pkg="turtlesim" type="turtle_teleop_key" name="turlte1_tele"/>
</launch>
类似用法 rosrun turtlesim turtlesim_node __name:=node-newname
output的使用————output
<launch>
<node pkg="turtlesim" type="turtlesim_node" name="turtle1"/>
<node pkg="turtlesim" type="turtle_teleop_key" name="turlte1_tele" output="screen"/>
</launch>
类似用法roslaunch –screen pkg-name launch-file.launch
第三个launch————name只是改了节点名
<launch>
<node pkg="turtlesim" type="turtlesim_node" name="t1"/>
<node pkg="turtlesim" type="turtlesim_node" name="t2"/>
</launch>
存在的问题,话题相同
robot@ubuntu:~/Documents/launch$ rosnode list
/rosout
/t1
/t2
robot@ubuntu:~/Documents/launch$ rostopic list
/rosout
/rosout_agg
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose
第4个launch————respawn
<launch>
<node pkg="turtlesim" type="turtlesim_node" name="t1" respawn="true"/>
<node pkg="turtlesim" type="turtlesim_node" name="t2" respawn="true"/>
</launch>
respawn 请关闭一个turtle的窗口!!!!观察!!!“”再生,复位“”
节点属性之必要节点:当一个节点被声明为必要节点即 required=”true”终止的时候,roslaunch 会终止所有其他活跃节点并退出。比如在依赖控制台的机器人遥控导航中,关闭了该远程控制节点所在的窗口,roslaunch将会终止其他节点,然后退出。
respawn_delay=”30” (可选, 默认为 0)—–如果重启为真,在尝试重启之前,档检测到节点故障后则等待延时30秒。
required=”true”(可选)—如果节点死亡,则杀死整个launch
required属性与respawn相反,不能同时对同一个node使用。
第5个launch————group ns
<launch>
<group ns="NUM1">
<node pkg="turtlesim" type="turtlesim_node" name="t1" respawn="true"/>
</group>
<group ns="NUM2">
<node pkg="turtlesim" type="turtlesim_node" name="t2" respawn="true"/>
</group>
</launch>
ns=”namespace”,前提是节点的代码在创建 ros::Publisher 和 ros::Subccriber 对象时使用了像 turtle1/pose 这样的相对名称 (而不是/turtle1/pose 这样的全局名称)。同样,启动文件中的节点名称是相对名称。例如而不能是
node name=”/turtlesim_node” ,可以这么不准确的理解:两只连体小龟,他们做一件事是同时在做,比如让他们以不同的速度前进,他们做不到,若做手术分开,把他俩放在不同的房间(命名空间)他俩真正地独立起来,这样每个小龟可以接受不同的命令去做事,而且互不干扰。动文件默认命名空间是全局命名空间“/”,因此,节点的默认命名空间就解析为/sim1,所以对应的全局名称即/sim1/turtlesim_node。
带来的不同
robot@ubuntu:~/Documents/launch$ rosnode list
/NUM1/t1
/NUM2/t2
/rosout
robot@ubuntu:~/Documents/launch$ rostopic list
/NUM1/turtle1/cmd_vel
/NUM1/turtle1/color_sensor
/NUM1/turtle1/pose
/NUM2/turtle1/cmd_vel
/NUM2/turtle1/color_sensor
/NUM2/turtle1/pose
/rosout
/rosout_agg
第六个launch ————remap
当我们要改变话题名字时,比如本包的话题输出,原来话题名字叫”original”,然后转变成“new-name”,重映射说白了就是覆盖!!!
<remap from="original-name" to="new-name"/>
<launch>
<node pkg="turtlesim" type="turtlesim_node" name="turtle1">
<remap from="turtle1/pose" to="MMM"/>
</node>
</launch>
robot@ubuntu:~/Documents/launch$ rostopic list
/MMM
/rosout
/rosout_agg
/turtle1/cmd_vel
/turtle1/color_sensor
robot@ubuntu:~/Documents/launch$ rosnode list
/rosout
/turtle1
命令行的类似用法是
rosrun turtlesim turtlesim_node turtle1/pose:=MMM turtle1/cmd_vel:=NNN
结果是
robot@ubuntu:~/Documents/launch$ rosnode list
/rosout
/turtlesim
robot@ubuntu:~/Documents/launch$ rostopic list
/MMM
/NNN
/rosout
/rosout_agg
/turtle1/color_sensor
第8个launch————args
启动参数( 运行时的参数):
roslaunch还支持启动参数,有时也简称为参数甚至args。在ROS中parameter和argument 是不同的,虽然翻译一样。
parameter是运行中的ROS系统使用的数值,存储在参数服务器(parameter server)中,每个活跃的节点都可以通过 ros::param::get 函数来获取parameter的值,用户也可以通过rosparam来获得parameter的值。而argument只在启动文件内才有意义他们的值是不能被节点直接获取的。
<arg name=”arg-name” default=”arg-value”/>与
<arg name=”arg-name” value=”arg-value”/>
两者的唯一区别在于命令行参数(roslaunch xx yy.launch dd:=t)可以覆盖默认值default,但是不能覆盖参数值 value。用$(arg arg-name)在每个该替换出现的地方,roslaunch 都将它替换成参数值。
<launch>
<arg name="a" default="1" />
<arg name="b" value="2" />
<node pkg="beginner_tutorials" name="add_two_ints_server" type="add_two_ints_server"/>
<node pkg="beginner_tutorials" name="add_two_ints_client" type="add_two_ints_client" args="$(arg a) $(arg b)"/>
</launch>
定义参数a,默认值为0,运行时可以重新赋值;
定义参数b,值为2,运行时不能赋值;
args="$(arg a) $(arg b)"#a,b作为参数传入节点,运行时可以将a重新赋值,不赋值使用默认值1.
运行:
1.(未定义arg时) roslaunch beginner_tutorials add_two.launch a:=4 b:=5
2.(定义arg后) roslaunch beginner_tutorials add_two.launch 或者roslaunch beginner_tutorials add_two.launch a:=4(只给a赋值,b不可,这是default 和value的区别??)
第9个launch————include
这个属性期望我们添加想要包含的文件的完整路径。但是大多数时候,include 元素使用一个 find 命令来搜索一个程序包,代替一个明确的完整路径:
<include file="$(find package-name)/launch-file-name" />
roslaunch 命令 将会在程序包(package)的子目录里搜索launch文件。 include 元素必须要指定文件的特定路径,你可以使用 find 来找到这个程序包,但是却不能在这个程序包目录里面自动的找到某个子目录里有launch文件。举例:
这样做是正确的:<include file = "find learning_tutrols"/launch/start_demo.launch" / >
这样做是错误的:<include file = "find learning_tutrols"/start_demo.launch" />
include 元素也支持 ns 属性,可以让这个文件里的内容推送到一个命名空间里面:
<include file=". . . " ns="namespace" />
第10个launch————launch-prefix
8让一个节点在单独的终端窗口中启动:
roslaunch 使所有的节点都共用一个终端,要想节点有自己的终端可以使用
launch-prefix="xterm -e"
第7个launch————param
parameter server:http://wiki.ros.org/Parameter%20Server
roslaunch/xml/param:http://wiki.ros.org/roslaunch/XML/param
roslaunch/xml/rosparam:http://wiki.ros.org/roslaunch/XML/rosparam
参数服务器:
参数服务器是一个共享的,多变量的字典,节点可以通过网络API访问(即节点运行时可从服务器上获取或者修改)(全局可见)!!但是其设计本身造成其效率低,常被使用静态非二进制数据作为配置参数。
通过使用XMLRPC 解析,且运行在ros master 内部。
(1)parameter
和ROS使用相同的命名传统,为了避免同名,参数继承了话题和节点作为前缀。符合树状结构。如下所示
/camera/left/name: leftcamera
/camera/left/exposure: 1
/camera/right/name: rightcamera
/camera/right/exposure: 1.1
解析:
/camera/left/name 的值是leftcamera
/camera/left 的值是字典{name:leftcamera ; exposure:1}
/camera 的值是字典
left:{name:leftcamera,exposure:1}
right:{name:rightcamera,exposure:2}
(2) parameter type
32-bit integers
booleans
strings
doubles
iso8601 dates
lists
base64-encoded binary data
加入你想保存如下参数
/gains/P = 10.0
/gains/I = 1.0
/gains/D = 0.1
可以通过一个字典获取/gains的值
{‘P’:10.0,‘I’:1.0‘D’:0.1}
(3) Privte Paramters
~name 作为私有名称,只有本基点可以使用。
当时用命令行重映射机制时,具体指定节点参数时,隐藏2掉“~”,直接使用一个下划线命令行_作为前缀分配专用参数
rosrun rospy_tutorials talker _param:=1.0
(3)roslaunch/xml/param
param 标签定义一个在parameter server 的参数,其值可以是文本文件,二进制文件,命令。
param 在node 中时,是私有名称。
属性:
name=”namespace/name”
——参数名,其中可加上命名空间。但不应该使用全局名称
value=”value”
——参数值!!如果该属性没有,那么其他binfile textfile command 必须被指定说明。
type=”str|int|double|bool|yaml” (optional)
——参数类型,如果不指定类型,roslaunch 将尝试自动决定类型。
基本规则是
———带小数点是浮点数 或者整形
———true 和false是boolean
———所有其他都是strings
textfile=”
(findpkg−name)/path/file.txt”(optional)——改文件的内容被保存作为字符串。binfile=”
(
f
i
n
d
p
k
g
−
n
a
m
e
)
/
p
a
t
h
/
f
i
l
e
.
t
x
t
”
(
o
p
t
i
o
n
a
l
)
—
—
改
文
件
的
内
容
被
保
存
作
为
字
符
串
。
b
i
n
f
i
l
e
=
”
(find pkg-name)/path/file”(optional)
——该文件的内容将被保存作为a base64-encoded XML-RPC binary object
command=”
(findpkg−name)/exe′
(
f
i
n
d
p
k
g
−
n
a
m
e
)
/
e
x
e
′
(find pkg-name)/arg.txt’”(optional)
——命令的输出被读取和保存作为字符串。
例子——设置一个参数
<param name="publish_frequency" type="double" value="10.0" />
launch param 和 程序 结合使用的实例
double parking_x;
double parking_y;
ros::param::get("~parking_x",parking_x);
ros::param::get("~parking_y",parking_y);
ROS_ERROR("parking_x:%.3f",parking_x);
ROS_ERROR("parking_y:%.3f",parking_y);
launch 文件
<launch>
<node pkg="beginner_tutorials" name="talker" type="talker">
<param name="parking_x" type="double" value="100.0" />
<param name="parking_y" type="double" value="600.0" />
</node>
</launch>
(4)roslaunch/xml/rosparam
操作yaml 文件参数
The rosparam tag enables the use of rosparam YAML files for loading and dumping parameters from the ROS Parameter Server. 也可以用来删除参数。rosparam 在node 标签内时,为私有名称。
delete 和 dump 命令可以运行在load 之前,或者任何参数被上传之前。
load 默认添加 或者覆盖
rosparam 可以指向一个yaml 文件。
属性:
command=”load|dump|delete” (optional ,default=load)
load load parameter from file
dump dump parameter to file
delete delete parameter
load/dump表示装载和卸载yaml文件
file=”$(find pkg-name)/path/foo.yaml”
param=”param-name”
ns=”namespace”
subst_value=”true|false” #允许在yaml 文本中使用代替参数标志
http://wiki.ros.org/rosparam
http://www.cnblogs.com/gary-guo/p/6290420.html
rosparam 传入yaml 参数文件。
color.yaml #这部分可以创建并放在param/ 一些包是放在config /中
background_r:255
background_g:255
background_b:255
dump.yaml
<launch>
<node pkg="turtlesim" type="turtlesim_node" name="turtle1" output="screen">
<rosparam command="load" file="$(find turtlesim_launch)/param/color.yaml"/>
</node>
<node pkg="turtlesim" type="turtle_teleop_key" name="turlte1_tele" output="screen">
</node>
</launch>
include 标签
<launch>
<include file="$(find turtlesim_launch)/telop.launch" />
<node pkg="turtlesim" type="turtlesim_node" name="turtleism_node" respawn="true" output="screen" >
<param name="turtle" value="1" />
<rosparam command="dump" file="$(find turtlesim_launch)/color.yaml" />
</node>
<arg name="foo" value="2" />
</launch>
telop.launch
<launch>
<node pkg="turtlesim" type="turtle_teleop_key" name="turtle_teleop_key" respawn="false" output="screen" />
</launch>
其他demo reference
<rosparam command="load" file="$(find rosparam)/example.yaml" />//加载文件中的参数
<rosparam command="delete" param="my/param" />//删除参数
<arg name="whitelist" default="[3, 2]"/>
<rosparam param="whitelist" subst_value="True">$(arg whitelist)</rosparam> //替换
<rosparam param="a_list">[1, 2, 3, 4]</rosparam>
<rosparam>
a: 1
b: 2
</rosparam>
<launch>
<!-- send table urdf to param server -->
<param name="table_description" command="$(find xacro)/xacro.py $(find gazebo_worlds)/objects/table.urdf.xacro" />
<!-- push table_description to factory and spawn robot in gazebo -->
<node name="spawn_table" pkg="gazebo" type="spawn_model" args="-urdf -param table_description -z 0.01 -model table_model" respawn="false" output="screen" />
</launch>
<launch>
<node name="fake_localizaton" type="fake_localization" pkg="fake_localization">
<rosparam>
odom_frame_id: odom_combined
base_frame_id: base_footprint
</rosparam>
</node>
</launch>
xacro launch 文件rbx1_test_turtlebot_with_head.launch
<launch>
<!-- Load the URDF/Xacro model of our robot -->
<param name="robot_description" command="$(find xacro)/xacro.py '$(find rbx1_description)/urdf/turtlebot_with_head.xacro'" />
<!-- Provide simulated control of the robot joint angles -->
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher">
<param name="/use_gui" value="True"/>
<param name="rate" value="20"/>
</node>
<!-- Publish the robot state -->
<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher">
<param name="publish_frequency" value="20.0"/>
</node>
<!-- Publish a static transform between the robot base and the world frame -->
<node pkg="tf" type="static_transform_publisher" name="world_base_broadcaster" args="0 0 0.0325 0 0 0 /world /base_link 100" />
<!-- We need a static transforms for the wheels -->
<node pkg="tf" type="static_transform_publisher" name="odom_left_wheel_broadcaster" args="0 0.13 0.015 0 0 0 /base_link /left_wheel_link 100" />
<node pkg="tf" type="static_transform_publisher" name="odom_right_wheel_broadcaster" args="0 -0.13 0.015 0 0 0 /base_link /right_wheel_link 100" />
</launch>
roslaunch 与环境变量 的交互 env optenv
#1 设置环境变量
export limao=1
#env 确认
使用env 标签在launch————取得环境变量的值来赋值
<launch>
<param name="wo" value="$(env limao)"/>
</launch>
使用optenv标签在launch————分环境变量有没有在之前设置
<launch>
<param name="wo" value="$(optenv limao)"/>
</launch>
此时,/wo 值为1,因为环境变量 设置过
<launch>
<param name="wo" value="$(optenv limao2 100)"/>
</launch>
此时,/wo 值为100,因为环境变量没有设置,取第三个为默认值。
- 条件判断 if unless
if=value (optional)
———————-If value evaluates to true, include tag and its contents. 真则执行
unless=value (optional)
———————Unless value evaluates to true (which means if value evaluates to false), include tag and its contents. 除了真之外(那就是假),则执行