ROS Learning-032 (提高篇-010 Launch)Launch 深入研究 --- (启动文件编程)ROS 的 XML语法简介

【ROS学习】节点运行管理launch文件的基本操作 阅读详情

ROS 提高篇 之 Launch 深入研究 - 01 — 启动文件的编程 — ROS 的 XML语法简介


我使用的虚拟机软件:VMware Workstation 11
使用的Ubuntu系统:Ubuntu 14.04.4 LTS
ROS 版本:ROS Indigo


注意:
1 . ROS 提高篇这个专栏的教学有门槛。
2 . 如果你没有学习前面的教程,请想学习前面的 beginner_Tutorials 和 learning_tf 的ROS 相关教程。


1 . 前言

在之前的 beginner_Tutorials 教程里面,我们已经初步学习了 Launch文件 要如何编写。但是那篇博客只是简单的讲解了一些 Launch 文件里面比较常用的几个 标签如何使用。
这一篇博客和接下来的几篇博客,我们将详细的讲解 Launch 文件要如何编写。

使用 launch文件,我们可以一次性配置并且运行很多节点。

至今,如果你按照我们的教程(ROS Learning)学习到这里,想必你一定运行了许多的例子。你可能会对在许多的终端中运行不同的节点感到麻烦,并且你会因为不了解我们运行过的例子中的 launch文件 都做了什么事情会感到困扰。我们在ROS Learning教程中 的 beginner_Tutorials 和 learning_tf 的ROS 相关教程 中已经学习简单的 launch启动脚本 如何编写,现在的你所知道的launch文件的编写技巧已经无法满足你现在想编写更复杂更大型的launch启动脚本文件了。所以这一篇博客和接下来的几篇博客,我们会详细的讲 launch文件 的技巧,当你学完这几篇的博客,你会具备编写大型launch启动脚本的能力。

说了一堆废话,接下来进入正题。

2 . 使用launch启动脚本文件:

<launch>
    <node
    pkg="turtlesim"
    type="turtlesim_node "
    name="turtlesim "
    respawn="true "
    />
    <node
    pkg="turtlesim"
    type="turtle_teleop_key "
    name="teleop_key"
    required="true"
    launch−prefix="xterm −e"
    />
    <node
    pkg="agitr"
    type="subpose"
    name="pose_subscriber"
    output="screen"
    />
</launch>

roslaunch 是如何允许我们一次启动多个节点”?
基本的实现思想是列表,在一个指定的XML格式,一组节点需要在同一时间被启动。你会很熟悉下面的列表,它展示启动了海龟(turtlesim)模拟器的一个简单的launch文件。

再我们深入研究launch文件的格式的细节前,让我们看看这些文件都是如何使用的:

roslaunch 命令的使用格式:

# roslaunch package-name launch-file-name

在 编写简单的启动脚本文件 的博客中最后的小练习中,我们自己编写了一个launch文件,如果一切工作正常的话,这个命令将会启动3个节点。在开始任何一个节点前,roslaunch 将会确定 roscore节点 是否已经在运行,如果没有,自动启动它。

注意: 要小心,不要与 rosrun命令 混淆,rosrun 只能启动一个节点。roslaunch 命令可以同时启动多个节点。

扩展 :你也可以在使用 roslaunch 启动launch文件的时候没有package-name这部分。要想做到这一定,launch-file-name 文件需要写成绝对路径的形式。只要可以让 roalaunch 命令找到唯一的一个 launch 文件,你就可以不提供 package-name 部分。举例:

$ roslaunch ~/catkin_ws/src/beginner_turtorls/launch/xxx.launch

关于 roslaunch 的一个重要的事实,这个事实很容易被忽略,就是在launch文件中的所有节点几乎被同一时间启动。结果,我们不能确定这些节点初始化的顺序。好在 ROS节点 不关系彼此的启动顺序。

为什么?
这个行为体现了ROS哲学:每一个节点与其他的节点都应该尽可能的独立、不相关。

如果你想请求 roslaunch命令 请求详细输出( Requesting verbosity )信息的话。就像其他的命令行工具一样,roslaunch 也有请求详细输出的选项。在你进行调试程序的时候,使用 -v 参数对你是有帮助的,你可以看到 roslaunch 是如何解读你的 launch文件 的详细解释。

# roslaunch -v package-name launch-file-name


3 . 创建launch启动脚本文件:

3-1 . 基本的成分:

3-1-1 . <launch>

最简单的启动文件是由一个包含了几个节点元素的根元素(root element)组成。

根元素:launch文件是XML文档,每一个XML文档必须有且只有一个跟元素(root element)。对于ROS launch文件,根元素(root element)是由一对 launch 标签定义的。

<launch>
    ...
</launch>

其他的所有元素标签都要写在 <launch>...</launch> 便签之间。


3-1-2 . <node>

启动的节点:任何一个launch文件的重点都是:节点(node)元素的集合。启动的每一个节点(node)都要有自己独一无二的名字(name)。一个节点(node)元素看上去就像下面这个样子:

 <node
  pkg="package-name"
  type="executable-name"
  name="node-name"
  />

注意: 在节点(node)标签的末尾加上’ / ‘斜杠是重要的,并且也容易被忘记。’ / ’ 表明:这里不会再有”</node>“出现,并且node元素定义完成。
XML解析器非常严格,如果你忘记了加’ / ‘,你要对这样的错误做好准备:

    Invalid roslaunch XML syntax: mismatched tag

你也可以写成显式关闭标签的形式:

 <node pkg=". . . " type=". . . " name=". . . "></node>

事实上,如果node(节点)元素有children,就需要显式标签来定义,children比如是:remap 元素或者 param 元素。这些元素会在下面介绍。


3-1-2-1 . 一个node(节点)元素必需的三个属性:pkg 、 type 和 name 属性:

pkg 和 type 属性确定了:启动此节点,ROS应该运行哪个程序。它们与 rosrun 的两个命令行参数一样,它们分别是:程序包名字 和 可执行文件的名字。
name 属性指定了一个节点的名字。这个节点程序会调用 ros::init() 函数内有一个这个节点的 name 参数,导致这个节点的 name 被改写,所以这个 name 属性容易被覆盖。

扩展: ros::init() 函数 提供的 name 信息将会全面的覆盖命名信息(launch文件中<node>标签里面的name 属性),就算这个节点已经以匿名name被创建。如果你想在 launch文件 中使用匿名name,使用anon 属性 来替代name 属性:

name="$(anon base_name)"

但是请注意,多次使用同样的基本名称,将生成同样的匿名name。这意味着,(一)我们参考launch文件中其他部分的name,但(二)我们必须小心的为每一个我们想要匿名的节点使用不同的base names。


3-1-2-2 . 查找节点(node)的日志文件(log files):

使用 roslaunch 命令 和 使用 rosrun 命令 单独运行每个节点 之间的重要区别是:默认情况下,roslaunch 命令 从启动节点开始,标准输出信息会重定向到一个日志文件中,而不会像 rosrun 命令那样,将 log 信息显示在终端(console)上。

日志文件所在路径: ∼/.ros/log/run_id/node_name-number-stdout.log

当主机( master )被启动,run_id 是被生成的唯一的标识符。在log文件名中的number是一个小整数,表示节点的数量。例如:运行上面的launch文件,2个节点的标准输出信息将会传给这些节点的日志文件(log files):

turtlesim-1-stdout.log
telep_key-3-stdout.log

这些日志文件可以被任何的文本编辑器(比如:gedit、vim、cat)打开。


3-1-2-3 . 将标准输出信息显示在终端(console)上

Q: 如何将标准输出信息显示在终端(console)上?
A: 在 node 元素中使用 output 属性:

output="screen"

带这个属性启动的节点会将标准输出信息显示在终端的窗口中,而不会保存在日志文件中。这也解释了为什么这个带有output="screen"的节点(node) 的日志文件在上面日志文件列表中丢失的原因。

扩展: node 元素的 output 属性只能影响这个节点自己。除了 output 属性,我们可以使用 roslaunch命令行工具的 --screen 命令行选项强制性的在终端的窗口中显示所有节点的输出信息。

roslaunch --screen package-name launch-file-name

3-1-2-4 . 请求重生(respawning) :

启动完所有请求启动的节点之后,roslaunch 监测每一个节点,让它们保持正常的运行状态。对于每一个节点(node),当它终止( terminates)时,我们可以要求 roslaunch 重新启动它,这就是 respawn 属性做的事情:

respawn="true"
-- This can be useful, for example, for nodes that might terminate prematurely, due to software crashes, hardware problems, or other reasons.
The respawn attribute is not really necessary in our example—All three programs are
quite reliable—but we include it for the turtlesim_node to illustrate how respawning
works. If you close the turtlesim window, the corresponding node will terminate. ROS
quickly notices this and, since that node is marked as a respawn node, a new turtlesim
node, with its accompanying window, appears to replace the previous one.

3-1-2-5 . 必需节点(Requiring):

让一个节点可以重生的另一种方法是:宣布这个节点是必需的(require):

required="true"

当一个必需的节点终止时,roslaunch会做出响应,终止其他所有的节点并退出它自己。这种行为机制是有用的。例如,对于一些节点(一)它们非常的重要,如果它们失败了它,那么整个会话应该被放弃,或者这些节点(二)不能使用重生( respawn )属性完美的重新启动,在这些情况下,我们都需要对这个 节点(node)使用 required="true" 属性。上面 roslaunch 例子文件中,我们给 turtle_teleop_key 节点使用了这个 required 属性。如果你关闭了运行 teleoperation 节点的窗口,roslaunch 将会杀死其他的2个节点退出。

注意: 由于 required 属性和 respawn 属性的含义,所以如果你给单个的一个节点同时设置了这2个属性,roslaunch 命令会抱怨。所以不要这样设置。


3-1-2-6 . 让每一个节点在单独的终端窗口中启动它们自己:

使用 roslaunch 命令 的一个潜在的缺点:相比我们原来对每个节点在单独的终端使用 rosrun 命令启动的做法,roslaunch 则是让所有的节点共享同一个终端。 那些只需要生产简单的日志消息文件而不需要终端(console)输入的节点是容易管理的,而那些依赖终端输入的节点,比如 turtle_teleop_key 节点,它可能要优先的保留在独立的终端上。

庆幸的是,roslaunch 提供了一个简单的属性去实现这一点,在 node 元素里使用 launch-prefix 属性:

launch-prefix="command-prefix"

在例子launch文件中,我们给 teleoperation 节点使用了这个属性:

launch-prefix="xterm -e"

因为这个属性,启动这个 node 元素的 rosrun 命令大致相当于:

xterm -e rosrun turtlesim turtle_teleop_key

正如我们所知道的,xterm 命令会开一个新的终端窗口。 -e 参数告诉 xterm :执行其命令行剩余部分(rosrun turtlesim turtle_teleop_key)。

扩展: launch-prefix 属性不是只能使用 xterm 。它还可以使用gdb 或者 valgrind 或者 nice 命令。


3-1-2-7 . 在一个命名空间内启动一个节点:

<launch>
    <node
    name="turtlesim_node "
    pkg="turtlesim"
    type="turtlesim_node "
    ns="sim1"
    />
    <node
    pkg="turtlesim"
    type="turtle_teleop_key "
    name="teleop_key"
    required="true"
    launch −prefix="xterm −e"
    ns="sim1"
    />
    <node
    name="turtlesim_node "
    pkg="turtlesim"
    type="turtlesim_node "
    ns="sim2"
    />
    <node
    pkg="a gitr "
    type="pubvel"
    name="velocity_publisher "
    ns="sim2"
    />
</launch>

在 node 元素中指定 ns 属性:

ns="namespace"

在例子launch文件中,使用这个属性创建了两个无关的 turtlesim 模拟器。

turtlesim 话题名字(turtle1/cmd_vel、turtle1/color_sensor 和 turtle1/pose )被从全局命名空间移动到 /sim1 和 /sim2 的单独命名空间里。


3-1-2-8 . 重映射名字:

在启动一个节点的时候,有两种方法创建重映射:

在终端命令行中启动一个节点时,要重新给这个节点命名:给出一个节点原来的名字和新的名字,中间用:=分开。

original-name:=new-name

例如,在运行turtlesim实例时,我们现在想把发布姿态数据的话题/turtle1/pose名称改为:/tim,那么命令就是这样的:

rosrun turtlesim turtlesim_node turtle1/pose:=tim

在launch文件中重新命名:使用 remap 元素:

<remap from="original-name" to="new-name" />

如果这个 remap 是 launch 元素的一个child(子类),与 node 元素同一层级, 并在 launch 元素内的最顶层。那么这个 remapping 将会作用于后续所有的节点。

这个 remap 元素也可以作为 node 元素的一个child(子类)出现。下面这个就是使用模板:

    <node node-attributes >
        <remap from="original-name" to="new-name" />
        . . .
    </node>

例如:上面命令行命令如果在launch文件中,就是下面这个样子的:

    <node pkg="turtlesim" type="turtlesim_node"
        name="turtlesim" >
        <remap from="turtle1/pose" to="tim" />
    </node>


3-2 . 其他launch文件元素:

这一节介绍几个额外的 roslaunch 结构元素。

3-2-1 . <include> 元素

3-2-1-1 . file 属性

包含(including)其他文件:

<include file="path-to-launch-file" />

这个 file 属性期望我们添加想要包含的文件的完整路径。但是大多数时候,include 元素使用一个 find 命令来搜索一个程序包,代替一个明确的完整路径:

<include file="$(find package-name)/launch-file-name" />

<launch>
    <node
    pkg="turtlesim"
    type="turtlesim_node "
    name="turtlesim "
    >
        <remap
        from="turtle1 /cmd_vel"
        to="turtle1 /cmd_vel_reversed"
        />
    </node>
    <node
    pkg="turtlesim"
    type="turtle_teleop_key "
    name="teleop_key"
    launch−prefix="xterm −e"
    />
    <node
    pkg="a gitr "
    type="reverse_cmd_vel"
    name="reverse_velocity "
    />
</launch>

注意:roslaunch 命令 将会在程序包(package)的子目录里搜索launch文件。 include 元素必须要指定文件的特定路径,你可以使用 find 来找到这个程序包,但是却不能在这个程序包目录里面自动的找到某个子目录里有launch文件。举例:

这样做是正确的:<include file = "find learning_tutrols"/launch/start_demo.launch" / >

这样做是错误的:<include file = "find learning_tutrols"/start_demo.launch" />

你可以使用 roslaunch 命令:roslaunch learning_tutrols start_demo.launch ,这样是可以成功运行的。但是同样的程序包名和launch文件名使用include元素就会失败。


3-2-1-2 . ns 属性

include 元素也支持 ns 属性,可以让这个文件里的内容推送到一个命名空间里面:

<include file=". . . " ns="namespace" />

一般我们都会给 include 元素设置一个 ns 属性。


3-2-2 . 启动参数(Launch arguments)

为了帮助launch文件配置,roslaunch 支持 launch arguments(启动参数),也叫做 arguments 或者 args。它的功能有点像一个可执行程序的局部变量。它的优点是,你可以通过编写launch文件来避免编写重复代码。为少数的信息使用arguements,可以改变程序的运行。

为了说明这个道理,我们的例子launch文件中使用了一个argument,叫做 use_sim3,目的是为了确定是否启动了3个turtlesim副本或只有2个。

Z:尽管术语argument和parameter在许多计算机环境中稍微可以互换使用,它们的含义在ROS中有很大的不同。Parameters(参数)在一个运行的ROS系统中是变量(values),它被存储在parameter服务器中,活动(或者叫:运行)的节点通过ros::param::get()函数访问它,并且用户可以通过 rosparam 命令行工具使用它。

相比之下,arguments只有在launch文件里合法,它们的值不是直接提供给节点。



<launch>
    <include file ="$( find agitr )/doublesim.launch "/>
        <arg
        name="use_sim3"
        default ="0"
        />

    <group ns="sim3" if ="$( arg use_sim3 )" >
        <node
        name="turtlesim_node "
        pkg="turtlesim"
        type="turtlesim_node "
        />
        <node
        pkg="turtlesim"
        type="turtle_teleop_key "
        name="teleop_key"
        required="true "
        launch−prefix="xterm −e"
        />
    </group>
</launch>

3-2-3 . Declaring arguments(声明参数)

在launch文件中,要声明一个参数的存在,我们使用arg元素:

<arg name="arg-name" />

声明里面只有一个 name 是起不上什么作用的,这就像是你在程序中定义了一个 int 类型的变量,但是你并没有使用它一样。(你至少还需要给 arg 元素分配 default 属性或 value 属性,请看下面)


3-2-3-1 . Assigning argument values(分配argument的数值)

在launch文件中使用的每一个argument必须给它分配一个 value(赋值)。有这么一下几种方法来实现这一点:

在命令行中你可以这样做:给 roslaunch 提供一个 value :

roslaunch package-name launch-file-name arg-name:=arg-value

另外,在launch文件中,你可以提供一个 value(赋值) 作为 arg 声明的一部分,使用下面的两种语法之一就可以:

<arg name="arg-name" default="arg-value" />
<arg name="arg-name" value="arg-value" />

这两种语法的唯一不同是:命令行是argument可以覆盖default的值,但是不能覆盖 value 。在例子launch文件中,use_sim3 节点的 default 值为 0,所以它可以通过命令行改变值,就像下面这样:

roslaunch agitr triplesim.launch use_sim3:=1

如果我们修改了这个例子launch文件:使用value替换default。那么上面这个命令执行的时候会出现错误,因为使用 value属性 配置的argument的值是不允许改变的。


3-2-3-2 . Accessing argument values(获取argument的数值)

一旦声明了一个argument,并且使用 value 属性给它分配值,你可以在程序中通过arg substitution来使用它的 value 属性的值。像是这样子:

$(arg arg-name)

$() 这个符号出现的任何地方,roslaunch命令 都将会把它替换成给定argument 的值(value)。在例子launch文件中,我们使用 use_sim3 参数(argurnt),???????一个 group 元素内的 if 属性。(下面我们将会简短的介绍 if 和 group )


3-2-4 . Sending argument values to included launch files(给包含(included)的launch文件传递argument)

在argument的传递上有一个限制,就是argument不能传递给 include 元素里包含的子launch文件使用。这个问题非常重要,因为这个 argument 就像是一个局部变量,它不能被包含的launch文件所 “继承” 。

解决这个问题的方法:在 include 元素中插入 arg 元素作为 include 元素的子类(children),就像是这样:

<include file="path-to-launch-file">
    <arg name="arg-name" value="arg-value"/>
    . . .
</include>

注意,这里的 arg 元素不同于我们已经知道的 arg 声明,在 inchude 标签内的arguments是给包含(included) 的launch文件提供的arguments,不是为本launch文件提供的。

一种常见的情况是,被包含(included)的launch文件和本launch文件会有共同的参数。在这种情况下,我们希望这些值(values)永远不变。像这样的元素,在这两个地方使用相同的argument name(参数名),要这样做:

<arg name="arg-name" value="$(arg arg-name)" />

在这种情况下,第一个 arg-name 和往常一样。第二个 arg-name 是launch文件中提供的。结果是,这两个launch文件中给定的argument具有相同的值(value)。


3-2-5 . Creating groups (创建组)

最后一个要介绍的launch文件特性就是,再来说说:group 元素,它提供了一个方便的方法来在一个大型的launch文件中组织节点。group元素可以达到两个目的:

1 . 组(group)可以把几个节点推送到同一个命名空间中。

<group ns="namespace" />
    . . .
</group>

2 . 组(groups)里面的每一个节点在启动的时候都会给定默认的命名空间。

:如果一个已经被分组的节点有自己的 ns 属性,那么结果:被启动的节点的命名空间会出现嵌套的关系: /group-namespace/ns-namespace/node-name 。


3 . 组(groups)可以通过 判别条件 来启用或禁用节点(nodes):

<group if="0-or-1" />
    . . .
</group>

如果 if 属性的值是 1 ,<group> 标签内封闭的元素(elements)会被包含。如果 if 属性 值是 0 ,则 <group> 标签内包含的元素会被忽略。 unless 属性的工作方式类似 if 属性,但是含义颠倒:

<group unless="1-or-0" />
    . . .
</group>

当然了,通常我们不会给这些属性使用简单的 0 或 1 这样的幅值。建议:结合 arg 的 $() 技术,它们会将你的launch文件的配置变得非常的强大。

注意: 注意 1 和 0 是唯一的合法值。具体来说,你通常会使用布尔(boolean)的 AND 和 OR 操作符,而不会直接使用 1 或 0 。


在例子launch文件中,有一个group元素具有ns 和 if 这两属性。这个 group 元素的 ns 属性:将这个 group 元素内的两个节点推送到 sim3 命名空间。if 属性:基于use_sim3 参数的值来落实:是启动还是禁止 group 元素内包含的节点。

扩展: 遗憾的是,只有这三个属性( ns 、if 、unless )可以通过 group 元素向下传递给 group 元素内包含的 node (节点)元素。
例如,我们可能会想给 group 元素添加一个 output="screen" 来让这个 group 元素内的节点启动后输出的信息都显示在终端窗口里,但是我们不可以这样设置,我们必须要对每一个 node 元素直接给予 output="screen" ,这样才能达到我们的要求。

完

By The Way: 可能以后,这篇博客,我还会继续完善。现在的这些关于:如何编写Launch文件的语法 ,基本上介绍的差不多了。

ROS 学习笔记(七)—— roslaunch 详解 1. rosrun 与 roslaunch rosrun 启动单个节点 rosrun package_name executable_file_name roslaunch 是一个用于批量启动ros节点的命令行工具: roslaunch package_name launch_file_name launch 文件是描述一组节点及其话题重映射和参数的 XML 文件。根据规范,这些文件的后缀都是.launch 。 一个最简单的launch文件可以像下面这样: <launch> &lt 阅读详情

相关推荐

【ROS学习】launch文件的使用

我们都知道在使用ROS时,启动一个节点我们可以使用rosrun启动一个节点!但是如果要启动多个节点呢?是不是得一个个都得启动!是不是感觉特别麻烦和累赘!don't worry!ROS已经帮我们考虑好了!那就是launch 文件,我们可以在launch文件编写多个node节点,然后只需启动launch文件,就可以实现一键启动! 目录 一、launch文件快速使用 二、launch文件一些配置 1、launch根标签设置 2、launch的node标签 3、launch文件的include标签(常用

Q小鑫 4969

ROS运行管理之launch文件

launch文件的详细解释

mxh3600的博客 8580

RLException: Invalid roslaunch XML syntax: mismatched tag: line 3, column 2报错

1.如果是line 1, column 0,说明文件没有保存成功,将launch文件关闭,保存后重新打开运行。比如我的代码就是下面的报错后,line 3, column 2,把第三行的launch加上/不报错。2.如果第一种解决方法解决不了,错误显示的不是 line xx, column xx,键入crtl+shift+b编译成功,但是roslaunch就是报出以下错误的解决办法。那就是格式问题,可能是少了/或者是< >三个中的一个。比如line 3, column 2。改成下面这样,就不会报错。

weixin_47869094的博客 2912

ROS-Launch的使用方式

目前还在学习ROS+无人机框架中,,,更多更新文章详见我的个人博客主页【

MGodmonkey的专属博客 4279

考完CAIE认证一年后,谈谈它对我的职业的真实影响(干货)

大门,让面试官愿意给你机会,但进门之后的发展,还得靠持续的学习和项目积累。说实话,当时的心态是“考都考了,总比闲着强”,对这张证书能带来什么实际价值,心里并没有底。这种广泛的生态认可,让这张证书的“流通性”变得很强——无论跳槽还是在原公司发展,它都是一个被市场验证过的能力证明。对我个人而言,虽然没跳槽,但在年度调薪和争取内部项目时,持证经历也成了一个有力的“加分项”。这种巨大的薪资差距,恰恰反映了市场对“能落地、懂技术”的深度人才的渴求。考完证后的这一年,我看到了两条清晰的职业发展路径在自己面前展开。

qq_16014487的博客 818

Linux运维人,该醒醒了,2019年要变天了

外界都说运维只是处于被动低效率手工救火的状态,企业对其重视程度不高,提起运维很多人能联想到的字眼就有“苦逼”、“辛苦”、“加班”、“背锅”。在大数据、人工智能、容器技术的强力加持下,运维这个传统的技术工种已经从“机械劳动”这样的刻板印象中蜕变出来,成为了任何一家技术公司所必须依赖和大力投入的核心技术能力。 现在,运维人员的发展前景也开始让很多程序员眼羡,作为Linux运维人员的你:这一年,你的L...

qq_43083284的博客 1万+

[ros基础] --- roslaunch使用详解

1 为什么需要launch文件 在节点少,程序小的情况下可以一个一个节点来启动,测试运行效果;但是当工程规模大,需要的节点多时就显得比较费劲,用.launch文件来启动可以将需要的节点同时启动,不用再一个一个进行。为工程搭建提高了效率,里面还有很多参数灵活使用会带来非常高效的调试。 roslaunch的概念: launch 文件是一个 XML 格式的文件,可以启动本地和远程的多个节点,还可以在参数服务器中设置参数。 NOTE: roslaunch 命令执行launch文件时,首先会判断是否启动了 rosco

M2嵌入式 1万+

Xilinx XDMA IP核配置实战:AXI Memory Mapped vs Stream选型指南(附PCIe调试技巧)

本文深入解析Xilinx XDMA IP核配置中AXI Memory Mapped与AXI Stream两种DMA接口的核心区别与选型策略。针对PCIe高速数据传输场景,详细对比了二者在数据特性、延迟、硬件资源及软件复杂度上的差异,为FPGA工程师在数据采集、实时处理等项目中做出高效设计决策提供实战指南,并附有关键的PCIe调试技巧。

qsc901234的博客 585

ROS学习笔记--深入理解roslaunch:ROS启动文件详解

在ROS(机器人操作系统)中,roslaunch是一个至关重要的工具,它能够帮助我们高效地启动ROS节点、参数服务器和其他必要的组件。本博客仅记录且作为笔记。提示:以下是本篇文章正文内容,下面案例可供参考在ROS中,一个复杂的机器人项目通常由多个节点(Node)组成,每个节点负责不同的任务,例如传感器数据处理、运动控制、用户界面等。在项目启动时,需要同时启动这些节点,并且要确保它们之间的通信和协调工作。这时,roslaunch派上用场。

zcw_jszs的博客 7988

pi/4QPSK调制解调原理

文章目录1. π/4\pi/4π/4QPSK 信号的调制原理2. 匹配滤波器与成形滤波器 1. π/4\pi/4π/4QPSK 信号的调制原理 减小相位突变量的QPSK由偏置键控QPSK(OK-QPSK)和 π/4\pi/4π/4偏置的QPSK( π/4\pi/4π/4QPSK)。由于 π/4\pi/4π/4QPSK是用差分相位编码产生的(因此也叫做 π/4\pi/4π/4DQPSK),能有效地进行差分解调和鉴频器解调,在一些不易提取相干载波的场合很有用。 在常规的QPSK中,输入数据经过串/并变换后,分成

gemengxia的博客 2万+

不止于使能:用汇川PLC功能块封装,实现伺服轴状态管理与安全逻辑

本文深入探讨了汇川PLC功能块封装在伺服轴控中的应用,详细介绍了如何通过高级封装技术实现伺服轴的状态管理与安全逻辑。文章涵盖了从基础使能到全生命周期监控的进化,多轴协同的实例化管理策略,以及安全逻辑的防御性编程技巧,为工业自动化领域的工程师提供了实用的解决方案和最佳实践。

weixin_28684825的博客 273

ROS入门(二):launch文件解析

如果为’log’,则stdout / stderr输出将发送到$ ROS_HOME / log中的日志文件,并且stderr将继续发送到屏幕。有时,节点1发布消息1给话题1(你可能需要该特定消息),而后,消息1进入了节点2,而节点2发布了消息2到话题2,消息2中包括了消息1的内容,消息2也被另一节点3接收。如果为true,则将当前文件中设置的所有args添加到为处理包含的文件而创建的子文件中。它启动一个单独的“talker”节点,该节点是“rospy_tutorials”软件包的一部分。

风吹落叶的博客 7974

Halcon 3D点云处理实战:从PLY文件读取到曲面匹配的完整流程(附避坑指南)

本文详细介绍了Halcon在3D点云处理中的完整流程,从PLY文件读取到曲面匹配,特别强调了3D算子的应用技巧和避坑指南。通过实战案例和参数优化建议,帮助开发者高效处理工业视觉检测中的复杂点云数据,提升匹配精度和性能。

weixin_42535720的博客 279

ROS Learning-032 (提高篇-010 Launch)Launch 深入研究 --- (启动文件编程)ROS 的 XML语法简介...

ROS 提高篇 之 Launch 深入研究 - 01 — 启动文件的编程 — ROS 的 XML语法简介 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubuntu 14.04.4 LTS ROS 版本:ROS Indigo 注意: 1 . ROS 提高篇这个专栏的教学有门槛。 2 . 如果你没有学习前面的教程...

weixin_30567225的博客 317

使用Simulink对基于GaN器件的高频电源进行建模与仿真,重点在于优化其效率

本文介绍了基于Simulink的GaN器件高频电源仿真建模方法。通过7个步骤详细讲解系统构建过程:从创建模型、设置电源、配置GaN开关网络,到添加磁性元件、负载和控制器设计,最后进行仿真分析。重点探讨了效率优化策略,包括开关频率选择、磁性元件优化、散热设计改进及控制策略调整。该教程为GaN器件在电力电子系统中的应用提供了完整的仿真流程指导,有助于设计人员验证方案并优化性能。

amy_mhd的博客 235

OpenClaw 运行时错误文档:Embedded Run Agent End with Stream Error(嵌入式运行代理结束流式错误)

OpenClaw运行时错误文档:EmbeddedRunAgentEndwithStreamError(OC-ERR-009) 该错误表示LLM提供商在流式传输过程中发生服务器端异常(HTTP 500),属于可恢复的中等严重性错误。典型表现为日志中出现包含"stream_error"和500状态码的错误信息。系统会自动进行错误分类(50%为服务过载,25%网络问题等),并通过内置机制尝试解决:包括模型切换、API密钥轮换和自动重试策略。用户可采取重试请求、切换模型或简化请求内容等操作,管理

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 554

ROS学习(八)launch启动文件的使用方法

通过launch文件快速启动节点

m0_56451176的博客 7030

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

日常笔记(2):无法找到launch文件,并报错

今天我把工程重新封装后,进行测试时,用已有的launch文件进行测试,出现错误(launch文件之前写好的,没有测),错误log如下: Invalid roslaunch XML syntax: mismatched tag: line 7, column 6 The traceback for the exception was written to the log file 嗯,...

qq_39734379的博客 3777

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

RLException: Invalid roslaunch XML syntax: mismatched tag: line 9, column 3The traceback for the ex

学习ROS入门教程时,在roslaunch启动时出现上述问题,最后解决了,但具体原因还不清楚。 见下为出现问题的launch文件: 见下为修改后的launch文件:(仅仅删除了第7行最后的“/”和第11行最后的“/”) 我的理解:对于一个<node>命令,即使在子级下面定义其他的参数(如:args/param/remap),要求<node>与</node>之间只允许出现一个代表结束此node内容的“/”,而在其中定义的其他参数(如:args/param/..

mu66mu的博客 7903

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

ROS入门之——浅谈launch

launch

沐棋的博客 4万+

ROS:启动管理工具launch

在服务拆分之后,就需要维护更多的细粒度服务,此时我们需要面对的第一个问题就是:如何让RPC客户端知道服务器部署的地址,也就是服务注册与发现的问题。 服务发现 举个例子,nginx是一个反向代理组件,那么nginx需要知道,应用服务器的地址是什么,这样才能够将流量透传到应用服务器上,这就是服务发现的过程。 那么nginx是怎么实现的呢?它把应用服务器的地址配置在了文件中。但是这样做有一些缺点: 首先在紧急扩容的时候,就需要修改客户端配置后,重启所有的客户端进程,操作时间比较长 其次,一旦某一个服务器出现故障

OceanStar的博客 2287

ros中的launch文件

ros中的launch文件

weixin_45868890的博客 6881

【ROS】roslaunch的使用

roslaunch的基本使用

丑小鸭 3782

第七篇:ROS的rosrun&roslaunch、rosparam联合使用【重点】

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、rosrun&roslaunch工具1.ROS功能包的介绍2.功能包自动检索3.rosrun&roslaunch的使用场景二、launch文件的功能三、2、launch文件的<>标签类型1.嵌套标签【用于启动其他模块的launch文件】2.变量标签3.标签4.是启动一个节点标签5.重映射标签四、launch文件的启动方式1.命令行的形式2.launc

qq_35635374的博客 6349

ROS学习第十八节——launch文件(详细介绍)

关于 launch 文件的使用已经不陌生了,之前就曾经介绍到:一个程序中可能需要启动多个节点,比如:ROS 内置的小乌龟案例,如果要控制乌龟运动,要启动多个窗口,分别启动 roscore、乌龟界面节点、键盘控制节点。如果每次都调用 rosrun 逐一启动,显然效率低下,如何优化?采用的优化策略便是使用roslaunch 命令集合 launch 文件启动管理节点,并且在后续教程中,也多次使用到了 launch 文件。概念。

qq_45685327的博客 1507

ROS学习笔记6:launch文件

本人ROS小白,利用寒假时间学习ROS,在此以笔记的方式记录自己每天的学习过程。争取写满20篇(6/20)。:严格按照下方学习链接的教程配置,基本一次成功。笔记绝大部分代码使用编写。:launch文件标签。

S13352784013的博客 1974
上一篇: SQL 数据库 学习 002 如何启动 SQL Server 软件
下一篇: SQL 数据库 学习 003 什么是数据库? 为什么需要数据库?是不是所有的软件都是用Sql Server?
AoboSir
博客等级 码龄10年 996粉丝 285原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值