更多课程 选择中心

C/C++培训
达内IT学院

400-996-5531

【ROS与C++入门教程】初始化和关闭roscpp节点

  • 发布: TOP智能机器人课堂
  • 来源: TOP智能机器人课堂
  • 时间:2017-11-28 11:54

说明

介绍roscpp节点的初始化和关闭

初始化

需要两步来初始化节点:

初始化节点:调用ros::init()函数来初始化节点,提供命令行参数给ROS,允许命名节点并提供不同的可选参数。

开始节点:调用ros::NodeHandle来启用节点

初始化节点

查阅 ros::init() API

在调用roscpp其他函数之前,必需先调用ros::init()。

两个常用的用法:

ros::init(argc, argv, “my_node_name”);

或者

ros::init(argc, argv, “my_node_name”, ros::init_options::AnonymousName);

一般情况下,符合如下形式:

void ros::init(<command line or remapping arguments>, std::string ode_name, uint32_t options);

函数分析:

argc 和 argv,参数列表,ROS使用这些来解析来自命令行的映射参数

node_name,节点名,在ROS系统里必需是唯一的。如果有同名的节点启动,就会先自动关闭前面的,如果想启动多个相同节点,使用init_options::AnonymousName参数。

options,这是一个可选的参数,可以指定某些选项,改变roscpp的行为。所以多个选项可以指定。选项在初始化选项部分中描述。

其他形式的 ros::init(),不使用argc/argv,而是使用复杂的映射参数,例如: std::map<std::string, std::string> 和std::vector<std::pair<std::string, std::string> >.

初始化节点简单的读取命令行参数和环境找出这样的节点名称、命名空间和重映射。

初始化没有连接到master主机,这需要在初始化后,再利用ros::master::check()或其他函数来检查主机状态。

初始化选项

查阅ros::init_options code API

ros::init_options::NoSigintHandler

不要安装SIGINT处理器。在这种情况下,你应该安装自己SIGINT处理器,确保节点得到正确关闭时退出。

注意,SIGINT的默认动作是终止进程,所以如果你想做你自己的SIGTERM处理,你也要使用这个选项。

ros::init_options::AnonymousName

匿名节点名称。将随机数添加到节点名称的结尾,使其成为唯一的。

ros::init_options::NoRosout

不要广播rosconsole输出到/rosout话题。

访问命令行参数

正如上面提到的,调用ros::init()带有argc和argv参数,将从命令行清除ROS的参数。

如果你需要解析命令行之前调用ros::init(),你可以调用(新的ROS 0.10)ros::removeROSArgs()函数。

开始节点

最常用的方法开始节点:

ros::NodeHandle nh;

当第一个ros::NodeHandle创建时候,会调用ros::start()

最后一个ros::NodeHandle销毁时,会调用 ros::shutdown()

如果想自己管理节点的生命期,需要开始时调用ros::start(),在关闭程序前调用ros::shutdown()。

关闭节点

你可以在任何时间调用ros::shutdown()功能关闭节点。

将关闭所有打开的订阅、发布、服务调用和服务服务器。

测试关闭

有两种方法检查关闭状态

最常用的方法是ros::ok(),如:

while (ros::ok()){ …}

一旦ros::ok() 返回false,节点就已经关闭。

另外一种方法: ros::isShuttingDown(),当ros::shutdown() 调用,就会返回true。

一般不鼓励使用,不过在一些高级用法中还是有用的。

例如在持续运行的服务节点的回调函数,当节点请求关闭的时候,回调函数应该立即关闭。这时候ros::isShuttingDown()就要用到,而 ros::ok() 就不能工作,因为主要回调函数在运行中,节点就不能关闭。

自定义信号处理器

你可以安装一个自定义的信号处理器,能跟ROS完美结合:

示例代码:

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

本文内容转载自网络,本着分享与传播的原则,版权归原作者所有,如有侵权请联系我们进行删除!

预约申请免费试听课

填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:C语言基础:运算符和表达式
下一篇:C++ Boost库的安装

超全的C语言标识符知识

C指针——指针类型转换

C指针——指针和结构类型的关系

C指针——数组和指针的关系

Copyright © 2023 Tedu.cn All Rights Reserved 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有

选择城市和中心
黑龙江省

吉林省

河北省

湖南省

贵州省

云南省

广西省

海南省