调用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 工作区并启动任意数量的启动文件。
我正在尝试从 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 工作区并启动任意数量的启动文件。