ROS系统API接口

本文详细介绍了ROS中节点的初始化过程,包括使用ros::init()和NodeHandle创建节点,以及如何创建发布者和订阅者进行话题通信。此外,还讨论了ros::Rate和spin/sleep方法在控制循环频率和消息发布的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考链接

ros API官网链接
在这里插入图片描述
【ROS教程】ROS常用API讲解

一、 节点

ros官网API roscpp

1. 节点初始化

  • API名称:ros::init()
    ROS程序调用的第一个函数,用于对ROS程序的初始化。
  • API常用形式:
    ros::init()函数最常见的使用方式为
ros::init(argc, argv, "my_node_name");
ros::init(argc, argv, "my_node_name", ros::init_options::AnonymousName);

第一个参数:终端输入参数的个数,例如输入"rosrun ** ** 100 200",则argc为3.
第二个参数:以数组的形式保存终端输入的命令,例如输入"rosrun ** ** 100 200",则argv[0]为当前所执行的文件,argv[0]为100,argv[1]为200。
第三个参数:节点发布时的名字
第四个参数:原则上不能重复启动相同的节点,但如果必须就加上第四个参数,从此参数,这样在创建ROS节点时,会在用户自定义的节点名称后缀随机数,从而避免重名问题;如果不是必须则不用写

2. 节点句柄

  • 句柄定义
    ros::NodeHandle nh
    通过 nh 对象创建了一个节点句柄。这个节点句柄用于与 ROS 系统进行通信,包括发布和订阅主题、调用服务、获取参数等。节点句柄(NodeHandle)是一个用于与ROS系统进行通信的对象。ROS是一个用于构建机器人软件的框架,它使用节点(Nodes)来执行各种任务,如传感器数据的读取、执行器控制、路径规划等
//确定了节点命名空间是my_node_name
ros::init(argc, argv, "my_node_name");
//这是一种比较常用的用法,句柄nh的命名空间为节点命名空间<my_node_name>
ros::NodeHandle nh;
//这是另一种用法,该句柄的命名空间是<my_node_name>/my_handle
ros::NodeHandle nh("my_handle");
//这是另一种用法,可以指定一个父句柄nh1和追加的命名空间,该句柄的命名空间是<my_node_name>/my_handle/my_sub_handle,这将nh2放到<my_node_name>/my_handle/my_sub_handle
ros::NodeHandle nh2(nh1,"my_sub_handle");

//也可以指定全局名称的方式,但不推荐,因为这样会使得节点无法被放入别的命名空间。只是有时在代码中使用全局名字有用。
ros::NodeHandle nh("/my_global_namespace");

  • 句柄应用
    通过节点句柄,节点可以创建发布者(Publisher)和订阅者(Subscriber),用于在ROS系统中发布和接收消息。
//创建发布者
ros::Publisher pub = nh.advertise<sensor_msgs::LaserScan>("laser_scan", 10);

二、话题通信

1. 创建发布者对象

ros wiki advertise链接

第二个参数是 message 队列的大小
advertise( ) 函数是你告诉ROS系统你想在给定的话题名上发布特定类型的消息,在调用advertise( ) 之后,master节点将通知任务试图订阅这个话题名称的节点。advertise( ) 返回一个Publisher对象,后面通过调用对象的publish()函数,你就可以在这个topic上发布消息了。当所有Publisher对象被摧毁,所有的topic也会被关闭

/*实例化发布者对象
泛型<>: 发布的消息类型
参数1: 要发布到的话题
参数2:消息队列中最大保存的消息数,超出此阀值时,先进的先销毁(时间早的先销毁)
*/
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);

2. 创建订阅者对象和处理接收的消息

  • 创建订阅者对象的
    ros wiki官网API链接
  • 消息处理
    接收到订阅的消息后,会进入消息回调函数,该函数的输入参数是针对的消息的指针;会发现这是在ros里面的固定格式调用,下面示例中的std_msgs::String是消息的结构
/*subscriber的回调函数,当接收到 topic_name 话题的时候就会被调用。
参数是所接收的消息的常数指标(const kg_nampe::msg_name::ConstPtr& msg).
消息是以 boost shared_ptr 指针的形式传输,这就意味着你可以存储它而又不需要复制数据。
之后使用msg->field_name即可存取message的资料
*/

void receive_msgs(const std_msgs::String::ConstPtr& msg)
{
    ROS_INFO("receive msg:%s",msg->data.c_str());
}
int main(int argc, char *argv[])
{
    //初始化节点,参数3 "topic_listener"是节点名称,是一个标识符,需要保证运行后,在ros网络拓扑中唯一
    ros::init(argc,argv,"topic_listener");
    //创建一个节点句柄对象
    ros::NodeHandle nh;
    /*实例化订阅者对象pub
    泛型<>: 订阅的消息类型
    参数1: 要订阅话题,为topic_name
    参数2:消息队列中最大保存的消息数,超出此阀值时,先进的先销毁(时间早的先销毁,自动舍弃时间戳最早的消息。)
    */
    ros::Subscriber sub = nh.subscribe<std_msgs::String>("topic_name",1000,receive_msgs);
    

    /*
    当处理到ros::spin()时,会一直去话题订阅缓冲区中查看有没有回调函数,如果有则去处理回调函数,
    如果没有则继续查看并且等待,所以处理到了ros::spin()就不会执行除了回调函数以外别的东西了,
    节点此时只会等待并且处理回调函数
    */
    ros::spin();
    /*当处理到ros::spinonce()时,会去话题订阅缓冲区中查看有没有回调函数,如果有则去处理回调函数,
    如果没有则继续往下执行,这里就有不同了,spinonce不会一直卡在回调函数那里,他只是查看一下缓冲区
    中有没有回调函数,而不是在等待回调函数的到来
    */
    //ros::spinOnce();
    ROS_INFO("topic listener");

}

三、时间

1. ros::Rate rate()和rate.sleep()的使用和理解

这两个函数是用来控制发布频率的,控制的是循环的频率,不是消息和服务的发布频率,通过控制循环频率从而可以控制发布频率

//定义运行频率,这里是1hz,也就是1s一次的频率
ros::Rate loop_sleep(1);
//休眠
loop_sleep.sleep()                        

往往ros::Rate loop_sleep(1)是写在循环外面的,而loop_sleep.sleep()是在循环内的,来控制话题发布的频率。

这个频率是指运行上一次loop.sleep()到下一次loop.sleep()之间保持的时间,通常情况下,代码运行速度比设定的频率要快,所以如果运行到下一次loop.sleep()后未达到1s,则会开始休眠,等到1s后再执行下一句程序。

五、回旋函数

函数链接
ros中关于ros::Rate 和ros::spin()等的理解

1. spin

当处理到ros::spin()时,会一直去话题订阅缓冲区中查看有没有回调函数,如果有则去处理回调函数,如果没有则继续查看并且等待,所以处理到了ros::spin()就不会执行除了回调函数以外别的东西了,节点此时只会等待并且处理回调函数

Enter simple event loop.
This method enters a loop, processing callbacks. This method should only be used if the NodeHandle API is being used.

This method is mostly useful when your node does all of its work in subscription callbacks. It will not process any callbacks that have been assigned to custom queues.

Parameters
spinner	a spinner to use to call callbacks. Two default implementations are available, SingleThreadedSpinner and MultiThreadedSpinner
Definition at line 577 of file init.cpp.

2. spinOnce

当处理到ros::spinonce()时,会去话题订阅缓冲区中查看有没有回调函数,如果有则去处理回调函数,如果没有则继续往下执行,这里就有不同了,spinonce不会一直卡在回调函数那里,他只是查看一下缓冲区中有没有回调函数,而不是在等待回调函数的到来

Process a single round of callbacks.

This method is useful if you have your own loop running and would like to process any callbacks that are available. This is equivalent to calling callAvailable() on the global CallbackQueue. It will not process any callbacks that have been assigned to custom queues.

Definition at line 582 of file init.cpp.
ROS 2中,API文档和使用方法主要通过官方提供的工具和包进行支持。以下是一些常见的用法示例和相关说明: ### API文档的获取 ROS 2提供了丰富的API文档资源,这些文档可以通过官方网站或本地安装的ROS 2环境访问。通常情况下,开发者可以使用`ros2 pkg`命令来查看特定包的文档信息。例如,要查看某个包的信息,可以运行以下命令: ```bash ros2 pkg info <package_name> ``` 此外,也可以使用`ros2 node`和`ros2 service`等命令查询节点和服务的接口信息。 ### 使用方法与示例 1. **运行带有参数文件的节点** ROS 2允许通过参数文件配置节点的行为。例如,下面的命令展示了如何运行一个名为`parameter_blackboard`的节点,并从指定的YAML文件加载参数[^1]: ```bash ros2 run demo_nodes_cpp parameter_blackboard --ros-args --params-file demo_params.yaml ``` 2. **服务调用** 如果客户端未运行,仍然可以通过命令行直接调用服务。例如,以下命令调用了名为`/add_two_ints_srv`的服务,并传递了两个整数作为输入参数[^5]: ```bash ros2 service call /add_two_ints_srv example_interfaces/srv/AddTwoInts "{a: 5,b: 10}" ``` 3. **安全设置** 对于需要安全控制的应用场景,ROS 2提供了一些基础教程来帮助开发者设置安全性。虽然目前关于具体实现的文档还在不断完善中,但已经有一些基本的安全配置指南可供参考[^4]。 ### 文档与社区支持 ROS 2的官方文档是一个非常重要的学习资源,其中包含了详细的教程、概念解释以及API参考手册。如果遇到问题,还可以在GitHub仓库(如`ros2/ros2_documentation`)中提交Issue以寻求帮助[^4]。此外,ROS Industrial等相关社区也定期举办培训活动,介绍ROS 2的新特性和应用案例,这对初学者和进阶者都非常有帮助[^2]。 ### 示例代码 为了更好地理解ROS 2中的消息交互机制,可以参考一些实际的消息定义。例如,针对通用经纬度控制器(ULC),ROS 2提供了专门的消息类型,这些消息定义可以帮助开发者更方便地与其他系统集成[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

loongembedded

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值