首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >调用roslaunch后自动销毁所有节点

调用roslaunch后自动销毁所有节点
EN

Stack Overflow用户
提问于 2019-05-15 08:49:04
回答 2查看 5.2K关注 0票数 1

我正在尝试从一个bash脚本一个接一个地运行几个roslaunch文件。但是,当节点完成执行时,它们会挂起,并显示以下消息:

代码语言:javascript
运行
复制
[grem_node-1] process has finished cleanly
log file: /home/user/.ros/log/956b5e54-75f5-11e9-94f8-a08cfdc04927/grem_node-1*.log

然后,我需要Ctrl-C来获取从启动文件启动的所有节点的killing on exit。是否有某种方法可以使节点在退出时自动终止自身?因为目前我需要在每次节点终止时执行Ctrl-C

顺便说一下,我的bash脚本如下所示:

代码语言:javascript
运行
复制
python /home/user/git/segmentation_plots/scripts/generate_grem_launch.py /home/user/Data2/Coco 0 /home/user/git/Async_CNN/config.txt
source ~/setupgremsim.sh
roslaunch grem_ros grem.launch config:=/home/user/git/Async_CNN/config.txt
source /home/user/catkin_ws/devel/setup.bash
roslaunch rpg_async_cnn_generator conf_coco.launch

script setupgremsim.sh提供了另一个catkin工作区。

非常感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-23 08:31:59

谢谢你的建议。我最终要做的是:我从单独的python脚本启动ROS节点,然后从bash脚本调用这些脚本。在python中,您可以使用shutdown终止子进程。因此,为了给其他有这个问题的人提供一个例子:

bash脚本:

代码语言:javascript
运行
复制
#!/bin/bash
for i in {0..100}
do
   echo "========================================================\n"
   echo "This is the $i th run\n"
   echo "========================================================\n"
   source /home/timo/catkin_ws/devel/setup.bash
   python planar_launch_generator.py
done

然后在planar_launch_generator.py内部

代码语言:javascript
运行
复制
import roslaunch
import rospy

process_generate_running = True

class ProcessListener(roslaunch.pmon.ProcessListener):
    global process_generate_running

    def process_died(self, name, exit_code):
        global process_generate_running
        process_generate_running = False
        rospy.logwarn("%s died with code %s", name, exit_code)


def init_launch(launchfile, process_listener):
    uuid = roslaunch.rlutil.get_or_generate_uuid(None, False)
    roslaunch.configure_logging(uuid)
    launch = roslaunch.parent.ROSLaunchParent(
        uuid,
        [launchfile],
        process_listeners=[process_listener],
    )
    return launch


rospy.init_node("async_cnn_generator")
launch_file = "/home/user/catkin_ws/src/async_cnn_generator/launch/conf_coco.launch"
launch = init_launch(launch_file, ProcessListener())
launch.start()

while process_generate_running:
        rospy.sleep(0.05)

launch.shutdown()

使用此方法,您可以获取任意数量的不同catkin工作区,并启动任意数量的启动文件。

票数 0
EN

Stack Overflow用户

发布于 2019-05-22 16:38:19

试着这样做

(1)每次启动都要放入一个单独的shell脚本。因此在每个脚本中有N个脚本,在xterm中调用启动文件。xterm -e "roslaunch启动您的yourfacnylauncher“

(2)准备一个主脚本,按照你想要的顺序调用所有N个子脚本,并延迟你想要的。

一旦完成,xterm就会自杀。

编辑。如果你知道它会被绞死,你可以手动杀死它。如下图

代码语言:javascript
运行
复制
#!/bin/sh
source /opt/ros/kinetic/setup.bash
source ~/catkin_ws/devel/setup.bash

使用systemd或rc.local启动ROScore,使用lxtermal或其他终端避免意外死亡。然后运行你认为会挂起或产生问题的部分。Echo->操作(如有必要

代码语言:javascript
运行
复制
xterm -geometry 80x36+0+0 -e "echo 'uav' | sudo -S dnsmasq -C /dev/null -kd -F 10.5.5.50,10.5.5.100 -i enp59s0 --bind-dynamic" & sleep 15

愚蠢的驱逐激光雷达不能自动配置像Veloydne,并将挂在这里。其他代码无法运行

代码语言:javascript
运行
复制
killall xterm & sleep 1

让我们干掉它,继续运行其他的启动

代码语言:javascript
运行
复制
xterm -e "roslaunch '/home/uav/catkin_ws/src/ouster_driver_1.12.0/ouster_ros/os1.launch' os1_hostname:=os1-991907000715.local os1_udp_dest:=10.5.5.1" 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56140413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档