调用roslaunch后自动终止所有节点

Automatically terminate all nodes after calling roslaunch

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

[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 脚本看起来像这样,顺便说一句:

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

脚本 setupgremsim.sh 获取另一个 catkin 工作区。

非常感谢!

尝试这样做

(1) 对于每次启动,您都放入一个单独的 shell 脚本。所以你有 N 个脚本 在每个脚本中,调用 xterm 中的启动文件。 xterm -e "roslaunch yourfacnylauncher"

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

完成后,xterm 应该会自行终止。

编辑。如果你知道它会挂起,你可以手动杀死它。例如下面

#!/bin/sh
source /opt/ros/kinetic/setup.bash
source ~/catkin_ws/devel/setup.bash

使用 systemd 或 rc.local 使用 lxtermal 或其他终端启动 ROScore 以避免意外终止。然后 运行 您认为会挂起或造成问题的部分。 Echo->必要时采取行动

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

愚蠢的 OUSTER LIDAR 不能像 Veloydne 那样自动配置,会挂​​在这里。其他代码不能 运行

killall xterm & sleep 1

让我们干掉它并继续 运行 其他发射

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" 

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

bash 脚本:

#!/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:

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 工作区并启动任意数量的启动文件。