ROS入门基础概念

一.Ros的基本组成:

  1. 节点管理器(ROS Master):
    –控制中心,提供参数管理,用来把所有的节点都连接起来。
    –每个节点运行的时候,都要先告诉管理器我要做什么事情,管理器再根据他的注册信息,去找与之通信的另外的节点,从而建立起它和其他节点的通信。
  2. 节点(Node):
    –各个软件模块,相当于一个最小的执行单元。
    –一个系统由多个节点构成的,比如拿我们的电脑来说,整个电脑可以称为是一个系统,他的输入设备有键盘和鼠标,那相对于整个电脑而言,我们的键盘可以称作是一个节点,鼠标也可以称作是一个节点,他们各自有各自的功能,却又共同组成电脑这个系统。
    –每一个节点都有一个自己的名称,在整个系统中,该名称是惟一的,不可重复的,这样才能让管理器知道到底在运行那些节点。
  3. 话题(Topic):
    –异步通信机制,在发布者(Publisher)和订阅者(Subscriber)之间传输消息(Message)。
    –消息是比较严格的数据结构,包括数组,结构体等,也可以自定义类型接口。
    –一般来说话题这种通讯模式只适合单向传输,只能从发布者向订阅者传输数据,想要订阅者发送消息给发布者,只能再设定一个话题让他们之间进行通信。
    –消息是直接从发布者到订阅者的,中间不经过管理器,管理器的作用就是让发布者找到订阅者,然后进行消息的发布。
  4. 服务(Service):同步通信机制,在服务器(Server)和客户端(Client)之间进行请求(Request)和应答(Response),类似于TCP协议传输的模式。
  5. 参数通讯机制:类似全局变量,所有节点均可访问。

二.话题通信机制的建立(服务机制没有4,5)

  1. 发布者进行信息注册:发布者启动,通过一个端口自己的信息注册到管理器上边,包括话题名称,发布下消息数据结构等内容。管理器会把这些东西保存到一个注册的列表当中去。
  2. 订阅者进行信息注册:订阅者启动,也会把信息都注册到管理器上边,包括要订阅的话题,地址信息等等。
  3. 管理器根据信息进行匹配:去看节点间的注册信息是不是相对应,对应的话就让他们进行一个连接,并向订阅者发送发布者的地址。
  4. 订阅者发送连接请求:根据管理器发给自己的地址信息,订阅者向该地址发送连接请求。
  5. 发布者确认连接请求:根据订阅者发送的请求,发布者做出回应。
  6. 建立连接
  7. 发布者进行数据的发送

三.话题/服务区别

来源:古月居胡春旭老师的课件

话题 服务
同步性 异步 同步
通信模型 发布者/订阅者 服务器/客户端
底层协议 ROSTCP/ROSUDP ROSTCP/ROSUDP
反馈机制 无反馈 有反馈
缓冲区
实时性
节点关系 多对多 一对多
使用场景 数据传输 逻辑处理

四.ROS文件系统

来源:古月居胡春旭老师的课件

文件系统
元功能包
功能包
功能包清单
消息类型
服务类型
代码
其他
  1. 功能包清单:包含作者信息、许可信息、依赖选项等。
  2. 消息类型:ROS系统提供的消息格式,也可以自己定义.msg文件,自定义需要的消息类型。
  3. 服务类型:ROS系统提供的服务类型,也可以自己定义.srv文件,。
  4. 代码:存放源码的文件夹。

五.简单应用

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

本文章是自己在学习胡春旭老师资料期间所做的学习笔记,特别感谢胡春旭老师的讲解。本问章中的很多内容还是跟着胡老师的资料内容是一样的,如果有侵权的地方会立即删除。如果上边错误的地方,还请大家多多指导,一起学习交流!

猜你喜欢

转载自blog.csdn.net/weixin_50303783/article/details/112917994