我正在尝试从一个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
script setupgremsim.sh
提供了另一个catkin工作区。
非常感谢!
发布于 2019-05-23 08:31:59
谢谢你的建议。我最终要做的是:我从单独的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工作区,并启动任意数量的启动文件。
发布于 2019-05-22 16:38:19
试着这样做
(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启动ROScore,使用lxtermal或其他终端避免意外死亡。然后运行你认为会挂起或产生问题的部分。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
愚蠢的驱逐激光雷达不能自动配置像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"
https://stackoverflow.com/questions/56140413
复制相似问题