一.Ros的基本组成:
- 节点管理器(ROS Master):
–控制中心,提供参数管理,用来把所有的节点都连接起来。
–每个节点运行的时候,都要先告诉管理器我要做什么事情,管理器再根据他的注册信息,去找与之通信的另外的节点,从而建立起它和其他节点的通信。 - 节点(Node):
–各个软件模块,相当于一个最小的执行单元。
–一个系统由多个节点构成的,比如拿我们的电脑来说,整个电脑可以称为是一个系统,他的输入设备有键盘和鼠标,那相对于整个电脑而言,我们的键盘可以称作是一个节点,鼠标也可以称作是一个节点,他们各自有各自的功能,却又共同组成电脑这个系统。
–每一个节点都有一个自己的名称,在整个系统中,该名称是惟一的,不可重复的,这样才能让管理器知道到底在运行那些节点。 - 话题(Topic):
–异步通信机制,在发布者(Publisher)和订阅者(Subscriber)之间传输消息(Message)。
–消息是比较严格的数据结构,包括数组,结构体等,也可以自定义类型接口。
–一般来说话题这种通讯模式只适合单向传输,只能从发布者向订阅者传输数据,想要订阅者发送消息给发布者,只能再设定一个话题让他们之间进行通信。
–消息是直接从发布者到订阅者的,中间不经过管理器,管理器的作用就是让发布者找到订阅者,然后进行消息的发布。 - 服务(Service):同步通信机制,在服务器(Server)和客户端(Client)之间进行请求(Request)和应答(Response),类似于TCP协议传输的模式。
- 参数通讯机制:类似全局变量,所有节点均可访问。
二.话题通信机制的建立(服务机制没有4,5)
- 发布者进行信息注册:发布者启动,通过一个端口自己的信息注册到管理器上边,包括话题名称,发布下消息数据结构等内容。管理器会把这些东西保存到一个注册的列表当中去。
- 订阅者进行信息注册:订阅者启动,也会把信息都注册到管理器上边,包括要订阅的话题,地址信息等等。
- 管理器根据信息进行匹配:去看节点间的注册信息是不是相对应,对应的话就让他们进行一个连接,并向订阅者发送发布者的地址。
- 订阅者发送连接请求:根据管理器发给自己的地址信息,订阅者向该地址发送连接请求。
- 发布者确认连接请求:根据订阅者发送的请求,发布者做出回应。
- 建立连接
- 发布者进行数据的发送
三.话题/服务区别
来源:古月居胡春旭老师的课件
话题 | 服务 | |
---|---|---|
同步性 | 异步 | 同步 |
通信模型 | 发布者/订阅者 | 服务器/客户端 |
底层协议 | ROSTCP/ROSUDP | ROSTCP/ROSUDP |
反馈机制 | 无反馈 | 有反馈 |
缓冲区 | 有 | 无 |
实时性 | 弱 | 强 |
节点关系 | 多对多 | 一对多 |
使用场景 | 数据传输 | 逻辑处理 |
四.ROS文件系统
来源:古月居胡春旭老师的课件
- 功能包清单:包含作者信息、许可信息、依赖选项等。
- 消息类型:ROS系统提供的消息格式,也可以自己定义.msg文件,自定义需要的消息类型。
- 服务类型:ROS系统提供的服务类型,也可以自己定义.srv文件,。
- 代码:存放源码的文件夹。
五.简单应用
1.打开终端快捷键
Ctrl+Alt+T
2.启动节点管理器
roscore
显示信息及其说明:
... logging to /home/liuhuan/.ros/log/4347833a-5bdd-11eb-ae31-fd3302cf1287/roslaunch-liuhuan-G5-5587-6228.log
Checking log directory for disk usage. This may take a while.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.
started roslaunch server http://liuhuan-G5-5587:39667/
ros_comm version 1.15.8
SUMMARY
========
PARAMETERS
* /rosdistro: noetic #当前ros系统的发布版本名称
* /rosversion: 1.15.8 #当前ros具体型号,主要指代的是通讯机制部分的版本号
NODES
auto-starting new master
process[master]: started with pid [6252]
ROS_MASTER_URI=http://liuhuan-G5-5587:11311/ #当前运行ros master所在的主机的资源地址
setting /run_id to 4347833a-5bdd-11eb-ae31-fd3302cf1287
process[rosout-1]: started with pid [6262]
started core service [/rosout]
^C[rosout-1] killing on exit
[master] killing on exit
shutting down processing monitor...
... shutting down processing monitor complete
done
3.清除ros master
Ctrl+C
4.查看ROS开头的命令
键入ros,再双击Tab
liuhuan@liuhuan-G5-5587:~$ ros
rosawesome roslaunch-logs
rosbag roslocate
rosboost-cfg rosls
roscat rosmake
roscd rosmaster
rosclean rosmsg
rosco rosmsg-proto
rosconsole rosmv
roscore rosnode
roscp rospack
roscreate-pkg rosparam
rosd rospd
rosdistro_build_cache rospython
rosdistro_freeze_source rosrun
rosdistro_migrate_to_rep_141 rosservice
rosdistro_migrate_to_rep_143 rossrv
rosdistro_reformat rosstack
rosed rostest
rosgraph rostopic
rosinstall rosunit
roslaunch rosversion
roslaunch-complete rosws
roslaunch-deps roswtf
5.查看命令后边可以跟的参数
键入命令,按下空格,双击Tab
liuhuan@liuhuan-G5-5587:~$ rosnode
cleanup info kill list machine ping
6.查看命令怎么用
键入命令,按下空格,–help
liuhuan@liuhuan-G5-5587:~$ rosnode --help
rosnode is a command-line tool for printing information about ROS Nodes.
Commands:
rosnode ping test connectivity to node
rosnode list list active nodes
rosnode info print information about node
rosnode machine list nodes running on a particular machine or list machines
rosnode kill kill a running node
rosnode cleanup purge registration information of unreachable nodes
Type rosnode <command> -h for more detailed usage, e.g. 'rosnode ping -h'
7. 小海龟例程
- 启动节点管理器
roscore
- 再打开另一个终端,启动小海龟仿真器(会有小海龟出现,但不能动)
rosrun turtlesim turtlesim_node
补充rosrun用法:rosrun package_name node_name |
---|
第一个参数:功能包的名称 |
第二个参数:该功能包下边节点的名称,也可以说是可执行文件的名称 |
- 再开一个终端,启动海龟控制节点(接下来就可以方向键进行小海龟的移动)
rosrun turtlesim turtle_teleop_key
8.小海龟例程相关指令
查看所有节点,再开一个终端,键入
rosnode list
显示信息及其注释
liuhuan@liuhuan-G5-5587:~$ rosnode list
/rosout #是必须会存在的节点,他的功能是订阅所有节点发布的日志信息,,相当于printf打印每个节点相关的信息。
/teleop_turtle #创建的键盘节点
/turtlesim #小海龟这个节点
自定义节点名称
格式:rosrun package_name node_name __name:=new_name |
---|
查看系统的计算图
rqt_graph
上边显示的就是主要的节点信息,可以看到主要节点就是键盘节点(teleop_turtle)向小海龟节点(turtlesim)发送位置信息(cmd_vel)。
这样可能会有一个疑问,为什么和rosnode list打印的不一样?
把上边debug前面对号去掉:
这样就可以看到rosout这个节点了,另外一个我暂时还不明白是什么。
查看某个节点的具体信息(以turtlesim为例)
rosnode info /turtlesim
显示信息及其注释:
liuhuan@liuhuan-G5-5587:~$ rosnode info /turtlesim
--------------------------------------------------------------------------------
Node [/turtlesim]
Publications: #这个小海龟节点发布的信息
* /rosout [rosgraph_msgs/Log]
* /turtle1/color_sensor [turtlesim/Color]
* /turtle1/pose [turtlesim/Pose]
Subscriptions: #小海龟节点订阅的信息
* /turtle1/cmd_vel [geometry_msgs/Twist]
Services:
* /clear
* /kill
* /reset
* /spawn
* /turtle1/set_pen
* /turtle1/teleport_absolute
* /turtle1/teleport_relative
* /turtlesim/get_loggers
* /turtlesim/set_logger_level
contacting node http://liuhuan-G5-5587:37773/ ...
Pid: 7941 #节点的ID号
Connections:
* topic: /rosout
* to: /rosout
* direction: outbound (42087 - 127.0.0.1:40126) [30]
* transport: TCPROS #发布话题的通信协议
* topic: /turtle1/cmd_vel
* to: /teleop_turtle (http://liuhuan-G5-5587:32989/)
* direction: inbound (44450 - liuhuan-G5-5587:55433) [32]
* transport: TCPROS
查看系统的话题
rostopic list
显示信息:
liuhuan@liuhuan-G5-5587:~$ rostopic list
/rosout
/rosout_agg
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose
liuhuan@liuhua
查看某话题的相关信息(以/turtle1/cmd_vel为例)
rostopic info /turtle1/cmd_vel
显示信息及其注释:
liuhuan@liuhuan-G5-5587:~$ rostopic info /turtle1/cmd_vel
Type: geometry_msgs/Twist #该话题的通信数据结构
Publishers: #话题的发布者
* /teleop_turtle (http://liuhuan-G5-5587:32989/)
Subscribers: #话题的订阅者
* /turtlesim (http://liuhuan-G5-5587:37773/)
查看话题的内容(以/turtle1/cmd_vel为例)
rostopic echo /turtle1/cmd_vel
显示信息及其注释(需要回到可以操作键盘的页面移动小海龟才能显示信息):
liuhuan@liuhuan-G5-5587:~$ rostopic echo /turtle1/cmd_vel
linear: #线速度
x: 2.0
y: 0.0
z: 0.0
angular: #角速度
x: 0.0
y: 0.0
z: 0.0
---
linear:
x: 2.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0
---
查看话题发送message类型
rostopic type /turtle1/cmd_vel
显示信息:
liuhuan@liuhuan-G5-5587:~$ rostopic type /turtle1/cmd_vel
geometry_msgs/Twist
查看message详细数据类型
rosmsg show geometry_msgs/Twist
显示信息:
liuhuan@liuhuan-G5-5587:~$ rosmsg show geometry_msgs/Twist
geometry_msgs/Vector3 linear
float64 x
float64 y
float64 z
geometry_msgs/Vector3 angular
float64 x
float64 y
float64 z
如何自定义的发布话题
#格式 rostopic pub 话题名 双击Tab 然后就会出来传输数据的具体值,填写后执行
以/turtle1/cmd_vel为例键入:
liuhuan@liuhuan-G5-5587:~$ rostopic pub /turtle1/cmd_vel geometry_msgs/Twist "linear:
x: 0.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0"
该格式只能发一次,想要固定频率的一直发:
#格式 rostopic pub -r 10 话题名 双击Tab 然后就会出来传输数据的具体值,填写后执行
-r:rate 后边是一秒发10次的意思
Ctrl+C来停止
查看话题发布频率
格式:rostopic hz topic_name |
---|
本文章是自己在学习胡春旭老师资料期间所做的学习笔记,特别感谢胡春旭老师的讲解。本问章中的很多内容还是跟着胡老师的资料内容是一样的,如果有侵权的地方会立即删除。如果上边错误的地方,还请大家多多指导,一起学习交流!