ROS2_Foxy学习3——核心概念

     A series of core ROS 2 concepts that make up what is referred to as the “ROS (2) graph”.
  这部分将介绍组成ROS2图的各个核心概念,包括节点、话题、服务、参数、动作。Graph展示了机器人系统内部各部分配合运行的过程。

1 node 节点

  一个完整的机器人系统,或者图,由许多的节点组成。每个节点都负责一个模块的功能。节点之间互相配合使得系统实现某些更为高级的功能。

    例如,一个基于ROS的轮式移动机器人,节点 /sensor 负责采集周围环境信息,节点 /controler 负责判断障碍物信息,节点 /motion 负责改变车轮的转速和转向,三者配合实现避障的功能,其中三者之间的数据交互可以通过topic、service等实现。

# 节点启动
	$ ros2 run <package_name> <executable_name>
	$ ros2 run turtlesim turtlesim_node
# 列出所有节点
	$ ros2 node list
# 节点信息:查看包括订阅和发布的话题、服务、动作等
	$ ros2 node info <node_name>

2 parameter 参数

 每个节点有自己的参数/配置,参数可以动态调整。

# 列出每个节点的参数
	$ ros2 param list

# 获取某个参数的类型和值
	$ ros2 param get <node_name> <parameter_name>
	# 例如
		$ ros2 param get /turtlesim background_g
	# return
		Integer value is: 86
	
# 设置某个参数的值
	$ ros2 param set <node_name> <parameter_name> <value>
	# 例如
		$ ros2 param set /turtlesim background_r 150
	# return
		Set parameter successful

# 保存参数到yaml文件
	$ ros2 param dump <node_name>
	# 例如
		$ ros2 param dump /turtlesim
	# return
		Saving to:  ./turtlesim.yaml

# 加载保存的yaml文件
	$ ros2 run <package_name> <executable_name> --ros-args --params-file <file_name>
	# 例如
		$ ros2 run turtlesim turtlesim_node --ros-args --params-file ./turtlesim.yaml

3 topic 话题

在这里插入图片描述

3.1 topic 话题

  topic是节点之间数据交互的一种方式,发送数据的节点采用publish的方式将数据发布到topic,而接收数据的节点采用subscribe的方式从topic订阅数据,可以看下这个官方的gif

# 列出所有话题
	$ ros2 topic list
	$ ros2 topic list -t	# 带topic类型

# 查看话题数据
	$ ros2 topic echo <topic_name>

# 查看话题的类型、发布者和订阅者数量
	$ ros2 topic info <topic_name>
	# 例如
		$ ros2 topic info /turtle1/cmd_vel
	# return
		Type: geometry_msgs/msg/Twist
		Publisher count: 1
		Subscription count: 1

# 查看数据发布频率
	$ ros2 topic hz /turtle1/pose

These attributes, particularly the type, are how nodes know they’re talking about the same information as it moves over topics.

  roscli相关的节点是命令行程序创建的。

3.2 topic 消息类型 msg
  Nodes send data over topics using messages. Publishers and subscribers must send and receive the same type of message to communicate.

# 查看topic类型
	$ ros2 interface show <type>.msg
	# 例如
		$ ros2 interface show geometry_msgs/msg/Twist
	# return
		# This expresses velocity in free space broken into its linear and angular parts.

    	Vector3  linear
    	Vector3  angular

3.3 终端发布数据到话题 pub

$ ros2 topic pub <topic_name> <msg_type> '<args>'
	# 例如
	$ ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}"
	# --once 代表 只发送一次数据即退出
	# --rate 1 代表 以1Hz的频率发送数据

4 service 服务

在这里插入图片描述

4.1 service 服务
  节点之间数据交互的另一种方式是service。话题通过发布与订阅进行(publisher-subscriber model),服务通过请求与应答进行(call-and-response model),只有请求才会应答。

  service包括客户端(service client)和服务器(service server),对于同一个service可以有多个client,但只能有一个server。

# 列出所有服务
	$ ros2 service list
	$ ros2 service list -t	# 带service类型

4.2 service 消息类型 srv

  service的消息不同于topic的消息,前者的消息包括两部分请求消息和应答消息。

# 查看service消息类型
	$ ros2 service type <service_name>
	# 例如
		$ ros2 service type /clear
	# return,Empty 表示 请求和应答都没有数据
		std_srvs/srv/Empty
		
# 查看service消息类型结构
	$ ros2 interface show <type_name>.srv
	# 例如
		$ ros2 interface show turtlesim/srv/Spawn.srv
	# return,--- 将请求数据和应答数据分开
		float32 x
		float32 y
		float32 theta
		string name # Optional.  A unique name will be created and returned if this is empty
		---
		string name
		
# 根据service消息类型找服务
	$ ros2 service find <type_name>

4.3 终端请求服务 call

$ ros2 service call <service_name> <service_type> <arguments>
	# 例如
		$ ros2 service call /clear std_srvs/srv/Empty
	# return
		waiting for service to become available...
		requester: making request: std_srvs.srv.Empty_Request()
	
		response:
		std_srvs.srv.Empty_Response()
	
	# 例如
		$ ros2 service call /spawn turtlesim/srv/Spawn "{x: 2, y: 2, theta: 0.2, name: ''}"
	# return
		waiting for service to become available...
		requester: making request: turtlesim.srv.Spawn_Request(x=2.0, y=2.0, theta=0.2, name='')
	
		response:
		turtlesim.srv.Spawn_Response(name='turtle2')

5 action 动作

在这里插入图片描述

5.1 action 动作

  action是节点间长时间通信的的一种方式,基于topic和service,组成如上图
  首先,action client发出目标服务请求,action server告知action client收到目标请求;然后,action client发出结果服务请求,action server返回反馈流和结果。
  action是可抢占的,也就是可以中途停止,或更换目标。

# 列出所有的action
	$ ros2 action list
	$ ros2 action list -t # 带action类型

# 查看action信息
	$ ros2 action info <action_name>
	# 例如
		$ ros2 action info /turtle1/rotate_absolute
	# return
		Action: /turtle1/rotate_absolute
		Action clients: 1
		    /teleop_turtle
		Action servers: 1
		    /turtlesim

5.2 action 消息类型 action

# 查看action类型
	$ ros2 interface show <type_name>.action
	# 例如
		$ ros2 interface show turtlesim/action/RotateAbsolute.action
	# return
		# 请求
		float32 theta
		---
		# 结果
		float32 delta
		---
		# 反馈
		float32 remaining

5.3 终端发送动作请求 send_goal

	$ ros2 action send_goal <action_name> <action_type> <values>
	# 例如
		$ ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 1.57}"
	# return
		Waiting for an action server to become available...
		Sending goal:
		   theta: 1.57
		
		Goal accepted with ID: f8db8f44410849eaa93d3feb747dd444
		
		Result:
		  delta: -1.568000316619873
		
		Goal finished with status: SUCCEEDED
		
	# 带反馈 --feedback
	$ ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: -1.57}" --feedback

每个动作目标都有一个对应ID。

6 rqt_graph  运行rqt_graph,也可以从rqt打开。

在这里插入图片描述

7 小节

  节点是一个完整机器人系统的基础组成部分,每个节点有自己的参数,这些参数可以动态配置。节点间的通信方式包括topic(publisher-subscriber model)、service(call-and-response model)和action(topic-service model),topic适合于描述实时状态的数据交流,service适合于固定数据请求或指令的发布,action适合于发布指令(需要花费一段时间才能完成的指令,for long running tasks)、获取反馈等情形。

  rqt_graph提供了一个可视化界面,能够清晰地描述系统工作过程中各部分的依赖关系。