ROS学习笔记(一):一个简单的ros程序有哪些必不可少的元素

发表于   |   更新于

首先根据官方教程安装ros,依次创建workspace,创建package,然后就可以在package的src目录下写自己的ros程序啦
我这里用官方提供的talker.cpp举个栗子

ps: 英文注释是官方解释哦(^▽^)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include "ros/ros.h"
#include "std_msgs/String.h"

#include <sstream>
int main(int argc, char **argv)
{
/**
* The ros::init() function needs to see argc and argv so that it can perform
* any ROS arguments and name remapping that were provided at the command line. For programmatic
* remappings you can use a different version of init() which takes remappings
* directly, but for most command-line programs, passing argc and argv is the easiest
* way to do it. The third argument to init() is the name of the node.
*
* You must call one of the versions of ros::init() before using any other
* part of the ROS system.
*/
ros::init(argc, argv, "talker");
//在建立ros的第一个节点时一定要先调用初始化节点ros::init()
//节点名称要唯一


/**
* NodeHandle is the main access point to communications with the ROS system.
* The first NodeHandle constructed will fully initialize this node, and the last
* NodeHandle destructed will close down the node.
*/
ros::NodeHandle n;
//NodeHandle指定命名空间,n的命名空间是talker
//ros::NodeHandle n("my_namespace")命名空间是talker/my_namespace

/**
* The advertise() function is how you tell ROS that you want to
* publish on a given topic name. This invokes a call to the ROS
* master node, which keeps a registry of who is publishing and who
* is subscribing. After this advertise() call is made, the master
* node will notify anyone who is trying to subscribe to this topic name,
* and they will in turn negotiate a peer-to-peer connection with this
* node. advertise() returns a Publisher object which allows you to
* publish messages on that topic through a call to publish(). Once
* all copies of the returned Publisher object are destroyed, the topic
* will be automatically unadvertised.
*
* The second parameter to advertise() is the size of the message queue
* used for publishing messages. If messages are published more quickly
* than we can send them, the number here specifies how many messages to
* buffer up before throwing some away.
*/
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
//advertise()函数用来发布一个消息类型为std_msgs/String名字叫chatter的话题
//参数1000表示推送消息队列大小,防止消息推送的速度太快

ros::Rate loop_rate(10);
//定义一个循环的频率,这里是指定发布消息的频率为10Hz,每秒十次

/**
* A count of how many messages we have sent. This is used to create
* a unique string for each message.
*/
int count = 0;
//count 记录发布消息的总次数
while (ros::ok())
{
/**
* This is a message object. You stuff it with data, and then publish it.
*/
std_msgs::String msg;

std::stringstream ss;
ss << "hello world " << count;
msg.data = ss.str();

ROS_INFO("%s", msg.data.c_str());
//ros::ok() 返回false的几种情况,即循环结束:
//SIGINT收到(Ctrl-C)信号
//另一个同名节点启动,会先中止之前的同名节点
//ros::shutdown()被调用
//所有的ros::NodeHandles被销毁

//定义字符串流“hello world”并赋值给ss, 转为字符串类型的消息
//ROS_INFO()输出信息,相当于cout

/**
* The publish() function is how you send messages. The parameter
* is the message object. The type of this object must agree with the type
* given as a template parameter to the advertise<>() call, as was done
* in the constructor above.
*/
chatter_pub.publish(msg);
//发布消息

ros::spinOnce();
//程序中有订阅功能时必须加上这个函数,没有的话可以不加,一般都会加上

loop_rate.sleep();
//控制循环的频率

++count;
}

return 0;
}

参考:

https://www.jianshu.com/p/29b8303ea63a
https://www.ncnynl.com/archives/201701/1279.html 创客智造ros与c++入门教程


Comments: