(!) Please ask about problems and questions regarding this tutorial on answers.ros.org. Don't forget to include in your question the link to this page, the versions of your OS & ROS, and also add appropriate tags.

查看状态机(ROS)

Description: 本教程向你展示如何使用smach查看器,这是一种简单的工具,可以监视状态机并对状态之间的数据流进行内省。

Tutorial Level: BEGINNER

这就是你要调试运行的SMACH状态机的原因:

smach_viewer.png

SMACH查看器显示了你(子)状态机中的所有状态的图形表示、状态之间可能的转换、当前的活动状态和用户数据的当前值。SMACH查看器甚至允许你设置状态机的初始状态。本教程教你如何开始使用SMACH查看器。

创建内省服务器

SMACH容器可以提供一个调试接口(通过ROS),它允许开发人员对状态机进行充分的内省。SMACH查看器可以使用这个调试接口来可视化和与你的状态机交互。要将此调试接口添加到状态机,请在代码中添加以下行:

   1 # First you create a state machine sm
   2 # .....
   3 # Creating of state machine sm finished
   4 
   5 # Create and start the introspection server
   6 sis = smach_ros.IntrospectionServer('server_name', sm, '/SM_ROOT')
   7 sis.start()
   8 
   9 # Execute the state machine
  10 outcome = sm.execute()
  11 
  12 # Wait for ctrl-c to stop the application
  13 rospy.spin()
  14 sis.stop()
  • server_name: 这个名称用于为ROS内省主题创建一个名称空间。只要这个名称在你的系统中是唯一的,你就可以命名它。这个名称在smach查看器中没有显示。

  • SM_ROOT: 你的状态机将以这个名字出现在smach查看器中。所以你可以选择任何你喜欢的名字。如果你在不同的可执行文件有子状态机,你可以让他们通过选择这个名字以一个巧妙的方法显示为层次状态机:如果顶级状态机被称为'SM_TOP',你可以调用子状态机'SM_TOP/SM_SUB',查看器就会意识到到子状态机作为顶级状态机的一部分。

对于内省服务器的更多信息,查看API文档.

如果有任何新内容出现,smach查看器将自动遍历"sm"的子容器,并向其中每个容器添加ros挂钩。因此,你只需要将一个内省服务器连接到顶层状态机,而不是将其连接到子状态机。在实例化了内省服务器之后,它将为发布一组话题,这些话题的名称是由在构造函数上给它的服务器名追加的。在本例中,有三个话题将被发布:

  • /server_name/smach/container_structure

  • /server_name/smach/container_status

  • /server_name/smach/container_init

前两个通过"server_name"话题,发布了关于SMACH容器服务结构和状态,其中包括频率和事件信息。第三个是通过ROS设置SMACH树的配置的话题。

"SM_ROOT"参数仅用于可视化,并强制嵌套不同的服务器。

运行SMACH查看器

在你的ROS系统中运行一个或多个内省服务器后,你可以使用以下方法启动smach查看器:

  rosrun smach_viewer smach_viewer.py

查看器将自动连接到所有运行的内省服务器。

Wiki: cn/smach/Tutorials/Smach Viewer (last edited 2018-03-10 06:14:08 by Playfish)