ROS系统API接口

参考链接

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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

loongembedded

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

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

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

打赏作者

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

抵扣说明:

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

余额充值