在学习ROS的过程中记录了一些笔记,整理成wiki的形式,方便日后查阅。

ROS Basics

ROS程序如何执行?

  • ROS程序通过launch files文件来执行,程序执行的命令为:roslaunch <package_name> <launch_file>,其中<package_name>指包含launch filepackage的名字,<launch_file>launch file的文件名。

什么是ROS package?

  • ROS使用package来对程序进行组织和管理,package内储存了一个ROS程序所包含的全部文件,包括cpp文件、python文件、配置文件、编译文件、启动文件以及参数文件等。
  • package文件夹中通常包含以下几个部分:
    1. launch文件夹:用于存储启动文件(.launch);
    2. src文件夹:用于存储源文件(.cpp .py);
    3. CMakeLists.txt文件:记录用于编译程序的cmake语句;
    4. 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文件夹中,通过以下命令创建packagecatkin_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,包含REQUESTRESPONSE两个部分。其中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 ActionsROS 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_serverROS Action Server的名字,cancel, feedback, goal, result and status为与该Server通信时的信息(Messages);

如何调用Action Server?

  • 和调用ROS TopicROS Service一样,调用Action Server意味着在客户端和服务端之间传递信息(Messages)。Action Message包含goal, result, feedback三个部分,其中goal中定义了服务端接收的信息,resultfeedback中定义了反馈的信息。
    • Action Messages定义在ROS package路径下的action/*.actin文件中;
  • 在调用Action Server时,首选需要连接到所希望调用的Action Server,然后创建goal信息并传递给服务端;
    • 向已启动的Action Server传递goal可通过两种方式来实现:
      • 直接调用ROS Topicrostopic 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?

  • RVizROS的3D可视化工具,能够获取仿真和真实环境中的机器人的行为和传感器信息,并进行可视化,通过rosrun rviz rviz进行调用;

Reference

ROS.org

The Construct