如何使用ROSSMACH有限状态机正确传递(可变)对象

2024-06-01 06:10:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经为这个问题纠结了一段时间了。我的问题非常具体,所以请不要在ROS教程页面上发布带有“的链接!注意:“一段介绍如何传递可变对象的段落(除非您向我展示我遗漏的内容)。我想知道是否有人能够在SMACH状态下正确地来回传递可变对象,而不会遇到任何错误。在

我写了一个特别简单和无用的程序来解释我要做什么。我可以发布这个例子的代码(不幸的是,对于那些曾经使用过SMACH的人来说,这是一段很长的代码)。所以现在我将尽力解释它,并在示例的图像中包含一个[link]。我创建了两个python脚本。每个脚本包含一个类和该类的对象(使用一些基本方法)。我在每个脚本中创建一个发布者和订阅者,其中一个脚本发送消息(对话),而另一个脚本监听(听到)消息。最后,说话者将两个FSM标记为关闭。如果有人想要完整的代码示例,请让我知道。。。在

下面显示smach状态和转换的代码段:

# begin sm
with sm:
    smach.StateMachine.add('LOAD', loadFSM(), 
                           transitions={'LOADED':'SENDMSG'})
    smach.StateMachine.add('SENDMSG', startMSG(),
                           transitions={'SENT':'SENDMSG',
                                        'ENDING':'END'})
    smach.StateMachine.add('END', stopFSM(),
                           transitions={'DONE':'complete',
                                        'ERRED':'incomplete'})

下面显示smach状态(loadFSM)的代码段:

^{pr2}$

我收到的错误(使用Ubuntu14.04、RosIndigo和Python2.7,不太确定,但我相信同样的错误也会发生在dynamic中)只发生在状态转换期间,当然内省服务器不工作(不显示状态转换)。错误是:

1线程sm\u中出现异常troViewer:状态\u发布者:“

2无法执行转换回调:Traceback(最近的调用 最后):文件
“/opt/ros/indigo/lib/python2.7/dist-packages/smach/容器.py“,
175号线,呼叫过渡区(self.user数据, 自我激活状态(),*参数)“

我还需要补充的是,我的简单的有限状态机示例实际上可以成功地工作并完成,甚至我的项目的2个更大的fsm也完成了。然而,当有限状态机有许多状态时,就像我的项目一样,有时我的模拟失败了。我想从任何广泛使用SMACH的人那里知道,他们是否认为这些错误是原因,或者他们知道我没有正确地在状态之间传递对象。在

提前谢谢你

提兹


Tags: 对象代码脚本add消息示例状态错误
1条回答
网友
1楼 · 发布于 2024-06-01 06:10:48

我以前也有过类似的问题。如果我没记错,userdata只能处理基本类型(int、string、list、dict,…)而不能处理任意对象。 我通过将对象传递给状态类的构造函数来解决这个问题,而不是使用userdata,例如:

class myState(smach.State):
    def __init__(self, obj):
        smach.State.__init__(self, outcomes=['foo'], ...)
        self.obj = obj
    ...

然后初始化如下:

^{pr2}$

它并不是很好,因为它绕过了userdata的概念,但它是有效的。在

相关问题 更多 >