ROS使用教程--关于roslaunch

原创 2016年08月29日 23:07:10

roslaunch工具十分方便,可以通过SSH远程启动节点以及本机的节点。roslaunch工具使用一个XML格式的文件,后缀名为.launch,可以指定节点的从参数和节点运行的机器。

运行远程机器(多个机器)的节点

在实现该功能之前需要实现多机之间的通信设置,首先是修改各机器的hosts文件(位于/etc/hosts),增加如下两行

192.168.1.30    tegra-ubuntu
192.168.1.31    bobin-ThinkPad-T450
...

注意需要把相互之间的通信的所有机器指定到每一个机器的hosts中,不过内容都是一样的。经过实验证明,只有这种方式是最简单的,一定要修改hosts,而不是显式赋值ROS_MASTER_URI和ROS_HOSTNAME为对应的IP。
launch文件中运行的每个节点可以指定该节点运行的machine,所以可以设置machine参数,格式如下

<machine name="tk1" address="tegra-ubuntu" user="ubuntu"  env-loader="/home/ubuntu/Documents/ROS_WS/catkin_ws/src/uav_pose/config/ric_env.sh" default="true" />

password参数是强烈不推荐的。可以是使用ssh-keygen工具。

ssh keygen

使用SSH免密码的方法,首先在本地机器产生key,包括private key和public key,生成key使用命令

ssh-keygen -t rsa

这样会生成两个文件,分别是.ssh/id_rsa.pub 和.ssh/id_rsa,后者为private key,前者为public key,之后将public key复制到远程的机器上即可,也就是TK1.
命令是

ssh-copy-id <username>@<host>

refer here

后边的env-loader对应的文件十分重要。格式如下

#!/bin/sh
export ROS_MASTER_URI=http://tegra-ubuntu:11311
export ROS_HOSTNAME=tegra-ubuntu
. /opt/ros/indigo/setup.sh
. ~/Documents/ROS_WS/catkin_ws/devel/setup.sh
exec "$@"

注意两点,一是要source ROS的自有包对应路径下的setup文件,还有就是自己的包所在路径中的setup文件,其次是要运行这个语句‘exec “$@”’。该文件存放于对应的机器上,在本例中存放于机器tegra-ubuntu。
launch文件第二步是指定在该机器上运行哪些节点,写法和本地运行的节点相同,注意指定machine的语句()中的参数default=true表示之后的节点如果不指定机器,默认是在该机器中运行。完整的launch文件如下

<launch>
<machine name="tk1" address="tegra-ubuntu" user="ubuntu" password="ubuntu" env-loader="/home/ubuntu/Documents/ROS_WS/catkin_ws/src/uav_pose/config/ric_env.sh" default="true" />

<node  pkg="uav_pose" type="my_publisher" name="videoRead" output="screen" args = "0" />
<node  pkg="uav_pose" type="PattnRecg" name="pattrnRecg" output="screen" />
<node  pkg="uav_pose" type="GimbalControl" name="gimbalControl" output="screen" args ="/dev/ttyUSB0 115200" />
<include  file="$(find dji_sdk)/launch/sdk_manifold.launch" />

<machine name="ThinkPad" address="bobin-ThinkPad-T450" env-loader="$(find uav_pose)/config/base_config.sh" default="false" />
<node machine= "ThinkPad"  pkg="image_view" type="image_view" name="imageshow" >
<remap from="image" to="/camera/markedImage" />
</node>
<node machine= "ThinkPad" pkg="rviz" type="rviz" name="rviz" />
<node machine= "ThinkPad" pkg="uav_pose" type="menu" name="menu" output="screen" />
<node machine= "ThinkPad" pkg="qgrnd" type="qgrnd" name="qgrnd" output="screen" />
</launch>

指定了两个机器,远程机器tk1,本地机器对应ThinkPad。tk1是default=true,tk1上运行了一个读取视频、目标识别、云台控制和DJI的SDK节点。本地节点运行了一些GUI显示节点和菜单节点。
虽然远程机器运行的节点不在本机上,但是注意launch文件是在本机中运行的所以使用find等指令时注意查找的是本地的路径。另外注意在运行该launch文件之前应该设置本地机器的环境变量如下

#!/bin/bash
export ROS_MASTER_URI="http://tegra-ubuntu:11311"
export ROS_HOSTNAME=bobin-ThinkPad-T450
export ROSLAUNCH_SSH_UNKNOWN=1
. ~/catkin_ws/devel/setup.sh

注意其中ROSLAUNCH_SSH_UNKNOWN是必须的
总结一下,
- 远程的机器上只是运行了一个环境变量设置的文件,之后所有的节点在launch文件中指定。
- 本地的机器上首先要设置环境变量,进而启动launch文件。

顺序是这样的
- 本地的机器上设置境变量
- 启动launch文件,该文件指定了:
1. 远程节点的环境变量的设置。
2. 远程所需要运行的节点。
3. 本地机器所需要运行的节点。

reference

  1. Roslaunch machine wiki
  2. ros network setup,如果并不想使用launch文件,而是想直接在terminal中设置多机通信,可以参考3,当然首要条件是按照2中完成网络设置。
  3. ros multiple mahine
  4. http://answers.ros.org/question/12434/using-roslaunch-to-run-distributed-systems-over-ssh/

Roslaunch在大型项目中的使用技巧

摘取关键的原则
1. 可重用性好
2. 高层级的launch文件应该简短,利用include指令将系统的组成部分和ROS parameter引用过来即可。
3. 在决定应用需要多少个高层级的launch文件时,你要考虑利弊的权衡。
4. 使用 env 置换符可以使得launch文件的一部分依赖于环境变量的值。
5. 使用machine tags来平衡负载并控制节点在机器上的启动,同时也因考虑将机器配置文件(.machine)跟系统变量关联起来以便于重复利用。
6. 当一个给定类型的信息在不同的情况下发布在不同的topic上,我们可以使用topic remapping

refer

  1. [ros wiki cn]http://wiki.ros.org/cn/ROS/Tutorials/Roslaunch%20tips%20for%20larger%20projects
  2. (https://charlyhuangrostutorial.wordpress.com/2015/08/12/20/)

roslaunch 有一些利弊权衡:

优点: 我们可以少做几个 “打开新终端, roslaunch” 的步骤。
缺陷1: roslaunch一个launch文件会有一个持续一段时间的校准过程。如果2dnav_pr2 launch文件引用了机器人的launch文件,当我们用control-c终止这个roslaunch进程,然后又再次开启这个进程,校准过程还得再来一遍。
缺陷2: 一些导航node要求校准过程必须在它启动之前完成。roslaunch目前还没有对节点的启动时间和顺序进行控制。最完美的方案当然是让导航节点等到校准过程完成后再启动,但就目前的情况来看,把他们分别放在两个launch文件里,直到校准过程结束再启动导航节点是个可行的方案。
因此,对于是否应该把多个启动项放到一个launch文件里并没有一个统一的标准。就本教程的案例而言,我们把他们放到两个launch文件里。

object setting1 setting2
node explicit local machine
node include file find remote machine
parameters explicit remap
parameters env load from file

- env require

export ROBOT=pre
  • remap is configured by
 <remap from="odom" to="pr2_base_odometry/odom" />
 ```

 - load from files


“`

版权声明:本文为博主原创文章,未经博主允许不得转载。

ROS launch文档介绍

本文章转自:https://charlyhuangrostutorial.wordpress.com/2015/08/12/20/ 前面已经提过关于launch 档的角色,很类似bash 档,基本上...

ROS学习笔记(一):自己动手写一个ROS程序

本文建立的是一个基于ROS(Robot Operating System)的非常简单的发布(Publisher)、订阅(Subscriber)程序。...
  • yake827
  • yake827
  • 2015年03月23日 14:50
  • 14496

ROS探索总结(三)——ROS新手教程

前面我们介绍了ROS的特点和结构,接下来就要开始准备动手感受一下ROS的强大了。ROS官网的wiki上针对新手的教程很详细,最好把所有的新手教程都搞清楚,这是后面开发最基础的东西。尽管如此,ROS对于...
  • hcx25909
  • hcx25909
  • 2013年04月16日 21:56
  • 91930

roslaunch的使用和编写

1、使用$ roslaunch package_name file.launch2、编写roslaunch文件是使用XML语言来描述节点以及相关参数的设置和软件的启动的。2.1 标签标签是任何ros...

ROS Launch使用总结

ROS Launch使用总结
  • x_r_su
  • x_r_su
  • 2017年02月09日 19:10
  • 3406

ros使用ssh配置远程

本人使用的是indigo版本和turtlebot机器人,下面的配置是把程序放在桌面电脑上面,通过在桌面电脑上面操作来控制机器人,这样做的目的就是方便编程和测试。其实也可以把程序放在机器人电脑上面,但是...
  • deyuzhi
  • deyuzhi
  • 2016年07月14日 22:23
  • 2216

ROS 教程之 network:多台计算机之间网络通信(1)

LZ在实验室环境下要实现一台台式主机和移动机器人上的笔记本通信。台式机作为主机,用rviz监控和无线操作移动机器人,笔记本上通过ROS实现移动机器人的自主定位和路径规划等程序。主机上用的虚拟机装的ub...

windows端使用ssh和Xming远程连接ubuntu端调试ROS

windows端使用ssh和Xming远程连接ubuntu端调试ROS 1 windows 7或其他更高版本PC一台 2 Ubuntu 16.04+ROS kineticPC一台...

ROS学习之 roslaunch

wiki链接: http://wiki.ros.org/roslaunch 一.概览     roslaunch程序包包含了可以读取roslaunch.launch/XML format的...

玩转四旋翼无人机(DJI ROS SDK开发包及使用方法)

本文主要介绍Onboard-SDK-ROS的代码设计思想和使用方法,该软件包主要用来完成M100的开发等。 该软件包的主要有3个部分 1. 核心的API部分dji-sdk-lib,用于串口通信,建...
  • wendox
  • wendox
  • 2016年11月07日 14:26
  • 7207
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ROS使用教程--关于roslaunch
举报原因:
原因补充:

(最多只允许输入30个字)