Убить Росбаг грациозно с помощью kill - PullRequest
0 голосов
/ 02 июня 2018

Я бы хотел изящно убить экземпляр rosbag через терминал.В этом случае изящно означает, что файл rosbag не имеет суффикса .active после kill.

, поэтому я делаю следующее из терминала, чтобы отправить рекомендованный SIGINT вrosbag:

$ rosbag record /some/topic &
$ RPID=$!
$ # do some stuff 
$ kill -2 $RPID

К сожалению, сумка остается активной , и может случиться так, что не все было сохранено на диске.Однако, если я поместил rosbag в файл запуска, он, похоже, сработает:

$ roslaunch rosbag_record.launch &
$ LPID=$!
$ # do some stuff 
$ kill -2 $LPID

Теперь rosbag остается без изменений и хранится без суффикса active .

Теперь интересный вопрос, что я делаю не так в первом случае.Я думал, что если убить файл запуска, и в этом случае убить roscore , то получится ros::shutdown(), который вызовет SIGINT во всех процессах.Но ручной способ использования kill, похоже, ведет себя иначе.

Ответы [ 2 ]

0 голосов
/ 21 августа 2019

Как упомянуто в ссылке в ответе @ Tik0, вы можете добавить ловушку в bash, чтобы поймать SIGINT (Ctrl + C) и вызвать rosnode kill оттуда, например ::

#!/bin/bash
trap "rosnode kill /bagger" SIGINT
rosbag record /my_topic __name:=bagger &
roslaunch mypackage launch.launch
0 голосов
/ 05 июня 2018

Собственная обработка сигналов не поддерживается должным образом, и всегда лучше использовать предполагаемые способы запуска и закрытия готовых узлов ROS, чтобы API мог отслеживать.Чтобы завершить узел изящно, мы предполагаем, что был запущен узел rosbag с именем my_bag:

rosbag record -o /file/name /topic __name:=my_bag

Затем узел может быть изящно убит с помощью команды rosnode kill и имени узла:

rosnode kill /my_bag

Ссылка для справки

...