ros 初始化和关闭 (ros::init(); ros::shutdown())
2017-08-08 11:32
274 查看
http://wiki.ros.org/roscpp/Overview/Initialization%20and%20Shutdown
在调用任何roscpp函数之前首先要调用ros::init()函数有一下两种形式:
ros::init(argc,argv,"my_node_name");
或者
ros::init(argc,argv,"my_node_name",ros::init_options::AnonymousName);
一般ros::init()的格式如下:
voidros::init(<commandlineorremappingarguments>,std::stringnode_name,uint32_toptions);
argc 和 argv ROS使用者两个参数来解析命令行的重映射参数,ROS也会修改他们,使得他们不再包含任何重映射参数,所以如果在处理命令行之前调用ros::init(),你就不用自己略过这些参数了。
node_name 在被重映射参数覆盖之前,这个名字会用来命名节点名。节点名字在ROS系统中必须唯一。如果有第二个同名的节点启动,则第一个会自动被关闭。有时你需要运行多个同样的节点,则可以通过下面描述的init_options::AnonymousName来解决。
options 这个可选的参数可以使你指定一些操作来改变roscpp的行为。 。。。略。。。
初始化选项
ros::init_options::NoSigintHandler
· 不安装 SIGINT 句柄.这种情况下你需要自己安装SIGINT句柄来保证节点在退出时候会正确的关闭 . SIGINT的默认操作是终结一个进行,所以如果你想自己处理 SIGTERM 你需要使用跟这个选项.
ros::init_options::AnonymousName
· 匿名节点名称,增加一个随机数在节点名的后面,使得节点名唯一。
ros::init_options::NoRosout
· 不向/rosout 话题广播 rosconsole
·
关闭节点
当调用ros::shutdown()函数来关闭节点是,会终结所有开放的订阅,发布,服务,调用。
默认的roscpp也会安装SIGINT句柄用来检测Ctrl-C,并自动为你关闭节点。
关闭节点测试
有两种方法来检查关闭的状态。最常见的是ros::ok().当ros::ok()返回false时节点已经关闭,通常这样使用
while(ros::ok())
{.......}
另外一种方法是使用ros::isShuttingDown()方法。这种方法会在调用而不是执行完ros::shutdown()时立即返回true,一般不鼓励使用这种方法,但在有些情况下很有用,例如要测试一个长久运行的服务回调节点是否被要求关闭并且回调是否需要退出,就需要使用ros::isShuttingDown(),ros::ok()在这里不起作用,因为回调在运行的时候节点不能关闭。
自定义SIGINT 处理
你可以安装自定义SIGINT处理,如下:
#include <ros/ros.h>
#include <signal.h>
void mySigintHandler(int sig)
{
// Do some custom action.
// For example, publish a stop message to some other nodes.
// All the default sigint handler does is call shutdown()
ros::shutdown();
}
int main(int argc, char** argv)
{
ros::init(argc, argv, "my_node_name", ros::init_options::NoSigintHandler);
ros::NodeHandle nh;
// Override the default ros sigint handler.
// This must be set after the first NodeHandle is created.
signal(SIGINT, mySigintHandler);
//...
ros::spin();
return 0;
}
在调用任何roscpp函数之前首先要调用ros::init()函数有一下两种形式:
ros::init(argc,argv,"my_node_name");
或者
ros::init(argc,argv,"my_node_name",ros::init_options::AnonymousName);
一般ros::init()的格式如下:
voidros::init(<commandlineorremappingarguments>,std::stringnode_name,uint32_toptions);
argc 和 argv ROS使用者两个参数来解析命令行的重映射参数,ROS也会修改他们,使得他们不再包含任何重映射参数,所以如果在处理命令行之前调用ros::init(),你就不用自己略过这些参数了。
node_name 在被重映射参数覆盖之前,这个名字会用来命名节点名。节点名字在ROS系统中必须唯一。如果有第二个同名的节点启动,则第一个会自动被关闭。有时你需要运行多个同样的节点,则可以通过下面描述的init_options::AnonymousName来解决。
options 这个可选的参数可以使你指定一些操作来改变roscpp的行为。 。。。略。。。
初始化选项
ros::init_options::NoSigintHandler
· 不安装 SIGINT 句柄.这种情况下你需要自己安装SIGINT句柄来保证节点在退出时候会正确的关闭 . SIGINT的默认操作是终结一个进行,所以如果你想自己处理 SIGTERM 你需要使用跟这个选项.
ros::init_options::AnonymousName
· 匿名节点名称,增加一个随机数在节点名的后面,使得节点名唯一。
ros::init_options::NoRosout
· 不向/rosout 话题广播 rosconsole
·
关闭节点
当调用ros::shutdown()函数来关闭节点是,会终结所有开放的订阅,发布,服务,调用。
默认的roscpp也会安装SIGINT句柄用来检测Ctrl-C,并自动为你关闭节点。
关闭节点测试
有两种方法来检查关闭的状态。最常见的是ros::ok().当ros::ok()返回false时节点已经关闭,通常这样使用
while(ros::ok())
{.......}
另外一种方法是使用ros::isShuttingDown()方法。这种方法会在调用而不是执行完ros::shutdown()时立即返回true,一般不鼓励使用这种方法,但在有些情况下很有用,例如要测试一个长久运行的服务回调节点是否被要求关闭并且回调是否需要退出,就需要使用ros::isShuttingDown(),ros::ok()在这里不起作用,因为回调在运行的时候节点不能关闭。
自定义SIGINT 处理
你可以安装自定义SIGINT处理,如下:
#include <ros/ros.h>
#include <signal.h>
void mySigintHandler(int sig)
{
// Do some custom action.
// For example, publish a stop message to some other nodes.
// All the default sigint handler does is call shutdown()
ros::shutdown();
}
int main(int argc, char** argv)
{
ros::init(argc, argv, "my_node_name", ros::init_options::NoSigintHandler);
ros::NodeHandle nh;
// Override the default ros sigint handler.
// This must be set after the first NodeHandle is created.
signal(SIGINT, mySigintHandler);
//...
ros::spin();
return 0;
}
相关文章推荐
- 【Linux命令详解】6、关闭和重启Linux系统―(shutdown、halt、reboot、poweoff和init)
- ROS源代码阅读(3):ROS程序的初始化——this_node::init()
- ROS源代码阅读(4):ROS程序的初始化——file_log::init()和param::init()
- (7)初始化和关闭roscpp节点
- ora-01033: 正在初始化或关闭 进程ID:0 oracle initialization or shutdown in progress
- ROS源代码阅读(5):ROS程序的初始化——对ros:init()的总结
- ros 初始化和关闭
- 浅析 Linux 初始化 init 系统,第 2 部分: UpStart
- spring的延迟初始化bean (default-lazy-init 与 lazy-init )
- spring中bean的作用域与懒加载及初始化方法和销毁方法以及spring容器的正常关闭
- shutdown和shutdownNow--多线程任务的关闭
- Linux中__init、__exit 、__devinit等初始化宏
- 使用ROS对Kinova 初始化时1015错误的解决方法
- Linux下使用shutdown.sh脚本关闭tomcat无法使得JVM关闭
- 创建一个数组, 实现函数init()初始化数组、 实现empty()清空数组、 实现reverse()函数完成数组元素的逆置。 要求:自己设计函数的参数,返回值。
- 系统初始化文件initsystem.php解析
- 编译时_RTC_Shutdown和_RTC_InitBase相关错误的解决方法
- 初始化请求blk_rq_init
- linux SD卡初始化---mmc_sd_init_card函数
- 浅析 Linux 初始化 init 系统,第 3 部分: Systemd