在学习ROS的过程中记录了一些笔记,整理成wiki的形式,方便日后查阅。
ROS Basics
ROS程序如何执行?
- ROS程序通过
launch files
文件来执行,程序执行的命令为:roslaunch <package_name> <launch_file>
,其中<package_name>
指包含launch file
的package
的名字,<launch_file>
为launch file
的文件名。
什么是ROS package
?
- ROS使用
package
来对程序进行组织和管理,package
内储存了一个ROS程序所包含的全部文件,包括cpp文件、python文件、配置文件、编译文件、启动文件以及参数文件等。 package
文件夹中通常包含以下几个部分:launch
文件夹:用于存储启动文件(.launch);src
文件夹:用于存储源文件(.cpp .py);CMakeLists.txt
文件:记录用于编译程序的cmake
语句;package.xml
文件:记录了package
信息和依赖;
- 进入
package
文件夹的命令:roscd <package_name>
什么是启动文件launch files
?
- 启动文件中的内容包含在
<launch>
标签内,定义了需要执行的node
。 - 在
node
标签中,包含以下内容:pkg="package_name"
# 需要执行的程序所在的package
type="python_file_name.py"
# 需要执行的源文件名name="node_name"
# 用来启动源文件的ROS node
output="type_of_output"
# 程序的输出形式- 其中,
pkg-type-name
是依次包含的层级关系
如何创建一个ROS package
?
- 在工作路径下的
src
文件夹中,通过以下命令创建package
:catkin_create_pkg <package_name> <package_dependecies>
(eg.catkin_create_pkg my_package rospy
) ROS package
刷新命令:rospack profile
- 显示当前全部的
ROS package
命令:rospack list
什么是ROS Nodes
?
ROS Node
是ROS中用来执行各个功能的进程,彼此间可以互相进行通信(A node is a process that performs computation)- 查看当前正在运行的
ROS Nodes
命令:rosnode list
- 查看某个
ROS Node
的信息:rosnode info <node_name>
如何编译ROS package
?
- 在工作路径中执行命令:
catkin_make
- 编译完成后,执行
source devel/setup.bash
以使编译结果生效; - 当只需要编译特定
package
时,执行以下命令:catkin_make --only-pkg-with-deps <package_name>
- 当需要完整地重新编译时,需删除
build/
文件夹后再进行编译;
什么是Parameter Server
?
Parameter Server
是用来储存ROS参数的字典(dictionary),包括配置参数等。用于ROS Nodes
在执行期间使用。- 获取可用参数的命令:
rosparam list
- 获取某个参数值的命令:
rosparam get <parameter_name>
- 设置某个参数值的命令:
rosparam set <parameter_name> <value>
什么是Roscore
?
Roscore
是ROS系统的主进程,在运行其他ROS程序前必须启动该进程。启动命令为roscore
RO中两个重要的Environment Variables
ROS_MASTER_URI
包含ROS核心进程执行的设备,默认情况下是本机(localhost
);ROS_PACKAGE_PATH
包含存储ROS package
的路径;
Topics - Services - Actions
ROS Topics
, Services
, Actions
间有什么区别?
Topics
用来提供全局、全时间上的功能,比如传感器信息的发布等;Services
用来提供在需要时执行的功能,在Services
执行过程中无法处理其他任务,需等到执行完成,比如人脸识别系统等;Actions
是异步版的Services
,在Actions
执行过程中,可同时处理其他任务,比如控制机器人的移动等;
ROS Topics: Publishers, Subscribers & Messages
什么是ROS Topics
?
ROS Topics
就像是一条各端都是ROS Nodes
的管道。一些ROS Nodes
使用它来向其他Nodes
发布信息,一些ROS Nodes
使用它来接收信息,从而实现ROS Nodes
间的通信。- 获取当前可用的
ROS Topics
命令:rostopic list
- 获取某个
ROS Topic
的信息命令:rostopic info TOPIC_NAME
- 使用
ROS Topic
发布信息的命令:rostopic pub <topic_name> <message_type> <value>
- 接收
ROS Topic
正在发布的信息的命令:rostopic echo <topic_name>
- 关于
ROS Topic
的更多命令:rostopic -h
- 例如:Topic
/counter
的信息如下:表示该Topic输出信息的类型为std_msgs/Int32
,用来发布信息的ROS Node
为/topic_publisher
,以及接受信息的ROS Nodes
Type: std_msgs/Int32
Publishers:
* /topic_publisher (http://ip-172-31-16-133:47971/)
Subscribers: None
什么是Topics Messages
?
ROS Topics
通过Topic Messages
处理信息;Topic Messages
定义在ROS Package
路径下mags/*.msg
文件中;- 查看当前所有可用
Topic Messages
的命令:rosmsg list
- 获取某个
Topic Message
信息的命令:rosmsg show <message>
ROS Services: Clients, Servers & Messages
什么是ROS Services
?
ROS Services
以“请求/回复(Request / reply)”的形式执行功能,服务端(Server
)和客户端(Client
)之间传递的信息即为。- 获取当前可用
ROS Services
列表的命令:rosservice list
- 获取某
Service
的详细信息:rosservice info /name_of_your_service
- 对于
Service
信息。其中包含了提供该服务的ROS node
信息、传递的Message
类型,以及所需要的参数。
- 对于
- 获取某
Service Message
的详细信息:rossrv show trajectory_by_name_srv/TrajByName
Service Message
定义在ROS package
路径下的srv/*.srv
文件中;- 对于
Service Message
,包含REQUEST
和RESPONSE
两个部分。其中REQUEST
定义了调用服务ROS Servise
时需要传递的信息类型,RESPONSE
定义了该服务所反馈的信息类型;
$ rosservice info /execute_trajectory
Node: /iri_wam_reproduce_trajectory
URI: rosrpc://ip-172-31-17-169:35175
Type: iri_wam_reproduce_trajectory/ExecTraj
Args: file
$ rossrv show trajectory_by_name_srv/TrajByName
string traj_name
---
bool success
string status_message
ROS Actions: Client, Servers & Messages
什么是ROS Actions
?
ROS Actions
是对ROS Node
中功能的异步调用。包括实现特定功能的服务端Server
以及调用该功能的客户端Client
;ROS Actions
以ROS topic
的形式存在,可以通过命令rostopic list
进行查看;一个ROS Action Server
提供了5个ROS topics
,包括/ardrone_action_server/cancel
,/ardrone_action_server/feedback
,/ardrone_action_server/goal
,/ardrone_action_server/result
,/ardrone_action_server/status.
- 其中,
ardrone_action_server
为ROS Action Server
的名字,cancel, feedback, goal, result and status
为与该Server
通信时的信息(Messages
);
- 其中,
如何调用Action Server
?
- 和调用
ROS Topic
和ROS Service
一样,调用Action Server
意味着在客户端和服务端之间传递信息(Messages
)。Action Message
包含goal
,result
,feedback
三个部分,其中goal
中定义了服务端接收的信息,result
和feedback
中定义了反馈的信息。Action Messages
定义在ROS package
路径下的action/*.actin
文件中;
- 在调用
Action Server
时,首选需要连接到所希望调用的Action Server
,然后创建goal
信息并传递给服务端;- 向已启动的
Action Server
传递goal
可通过两种方式来实现:- 直接调用
ROS Topic
,rostopic pub /[name_of_action_server]/goal /[type_of_the_message_used_by_the_topic] [TAB][TAB]
- 编写Python脚本
- 直接调用
- 向已启动的
#goal
package_where_message_is/message_type goal_var_name
---
#result
package_where_message_is/message_type result_var_name
---
#feedback
package_where_message_is/message_type feedback_var_name
什么是axclient
?
axclient
是由actionlib package
提供的GUI工具,能够可视化地与Action Server
进行交互,传递goal
并获取反馈。使用rosrun actionlib_tools axclient.py /<name_of_action_server>
命令进行调用。
Debugging Tools
ROS Log
中包含哪些log类型?
DEBUG
,INFO
,WARNING
,ERROR
,TATAL
五种类型,在python
脚本中,可通过rospy.logXXX(msg, args)
进行记录;
什么是rqt_console
?
rqt_console
是用来查看、过滤、高亮显示ROS Log
的GUI工具,通过rqt_console
命令进行调用;
什么是rqt_plot
?
rqt_plot
是用来对程序运行中所产生的数据进行可视化的GUI工具,通过rqt_plot
命令进行调用;
什么是rqt_graph
?
rqt_graph
是用来可视化ROS topics
间连接关系的GUI工具,通过rqt_graph
命令进行调用;
什么是rosbag
?
rosbag
是对ROS
的运行过程进行记录、查看和回放的GUI工具,通过rosbag [arg]
命令进行调用;
什么是RViz
?
RViz
是ROS
的3D可视化工具,能够获取仿真和真实环境中的机器人的行为和传感器信息,并进行可视化,通过rosrun rviz rviz
进行调用;