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(
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
#include
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;
}