- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我一直在为这个问题苦苦思索一段时间。我的问题非常具体,所以请不要发布带有“!Note:”段落的 ROS 教程页面链接,该段落显示如何传递可变对象(除非您给我看我错过的东西)。我想知道是否有人能够在 SMACH 状态下正确地来回传递可变对象,而不会遇到任何错误。
我写了一个特别简单但没用的程序来解释我想做什么。我可以发布这个例子的代码(不幸的是,对于那些以前使用过 SMACH 的人来说并不奇怪,这是一段很长的代码)。所以现在我会尽力解释它并包括一个[link ] 到我的例子的图像。我创建了两个 python 脚本。每个脚本都包含一个类和该类的对象(带有一些基本方法)。我在每个脚本中创建一个发布者和订阅者,其中一个脚本发送消息(谈话),而另一个脚本收听(听到)消息。最后,talker 将两个 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) 的代码片段:
class loadFSM(smach.State):
def __init__(self):
smach.State.__init__(self, outcomes=['LOADED'],
output_keys=['talker_obj'],
input_keys=['talker_obj'])
# Initialise our talker object
self.talker = Talk()
def execute(self, userdata):
rospy.loginfo("talker state: Loading fsm")
self.talker.init_publish()
self.talker.init_subscribe()
userdata.talker_obj = self.talker
return 'LOADED'
我收到的错误(使用 Ubuntu 14.04、ROS indigo 和 python 2.7,不太确定,但我相信同样的错误也发生在 kinetic 中)只发生在状态转换期间,当然内省(introspection)服务器不工作(不显示状态转换)。错误是;
<强>1。 “线程 sm_introViewer:status_publisher 中的异常:”
<强>2。 “无法执行转换回调:Traceback(最近的调用 最后): 文件
"/opt/ros/indigo/lib/python2.7/dist-packages/smach/container.py",
第 175 行,在 call_transition_cbs cb(self.userdata, self.get_active_states(), *args)”
我还需要补充一点,我的简单有限状态机示例实际运行并成功完成,甚至我项目的 2 个较大的 FSM 也已完成。但是,当 FSM 像我的项目一样有很多状态时,有时我的模拟会失败。我想从任何广泛使用 SMACH 的人那里了解他们是否认为这些错误是原因,或者他们是否知道我没有在状态之间正确传递对象这一事实。
提前致谢
提兹
最佳答案
我以前也遇到过类似的问题。如果我没记错的话,userdata
只能处理基本类型(int、string、list、dict ……),不能处理任意对象。我通过将对象传递给状态类的构造函数来解决它,而不是使用用户数据,例如:
class myState(smach.State):
def __init__(self, obj):
smach.State.__init__(self, outcomes=['foo'], ...)
self.obj = obj
...
然后初始化如下:
obj = SomeClass()
with sm:
smach.StateMachine.add('MY_STATE', myState(obj),
transitions={'foo':'bar'})
它不是很好,因为它规避了用户数据的概念,但它确实有效。
关于python - 如何使用 ROS-SMACH FSM 正确传递(可变)对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48121371/
我正在实现一个基于 ROS 的机器人系统。我有不同的节点,每秒发送多次数据。但是,我不需要那个。我只想在机器人处于新位置时发送它的状态。您建议使用哪种 ROS 技术? 最佳答案 根据您的要求,您可以使
我希望我的 ROS 包中的特定节点在 DEBUG 详细级别显示输出,而其他节点在 INFO 级别显示。我知道 rosconsole configuration file ,并且能够为包设置详细程度:
我正在使用 ros indigo。当我做映射然后通过以下方式保存它: map_server map_server -f 'location' 它给了我一个警告... Using deprecated
我正在使用 ros indigo。当我做映射然后通过以下方式保存它: map_server map_server -f 'location' 它给了我一个警告... Using deprecated
我有一个用 Python 编写的 ROS 节点,它捕获消息并将它们写入磁盘(例如使用 pickle)。我想稍后在 ROS 之外的另一个 Python 脚本中使用这些文件,但我需要导入消息类。 这可能吗
ROS 和网络新手。在这里需要一些帮助来理解我应该采取的最佳方法。我正在尝试将 Ros 消息从 ROS PC 发送到另一台非 ROS PC。我研究了几种方法可以做到这一点。 在非 ROS 机器上安装
我可以在ROS的catkin工作区中编译安装ROS包。如何将 catkin 工作区中的包导出到 .deb 文件,以便我可以在其他机器上安装和使用它? 我的 ROS 版本是 ROS Indigo,操作系
我一直在尝试安装 ROS 旋律。我需要它来运行一些启动文件。目前,当我通过运行以下命令检查 ros 版本(在运行 Ubuntu 20.04 的树莓派 4 上)时: rosversion -d 它输出:
我正在尝试使用以下公式将 Twist 转换为左右轮的速度: float speed_wish_right = (cmd_vel.angle*WHEEL_DIST)/2 + cmd_vel.speed;
我已经在 Ubuntu 18.04 上安装了带有 ROS melodic 的 Gazebo 9。我不断遇到以下问题: 启动 Gazebo 向世界添加一些对象 文件 -> 另存为... 程序卡住,保存窗
我使用什么程序来使用 ROS 框架进行编程,我可以使用 Visual Studio 吗? 我是 ROS 的新手,任何教程或教程程序将不胜感激。 谢谢。 最佳答案 用于 ROS 开发的最常见 IDE 是
我的问题是如何将一个值从一个订阅者的回调函数传递给另一个订阅者。 这有意义吗? import rospy from sensor_msgs.msg import LaserScan, Int32 fr
我正在关注有关如何创建 ROS 自定义消息的“WS Newman”教程。编译时出现以下错误“消息/服务'example_msg/Num'的依赖关系已更改。请重新运行cmake” Num.msg 有 H
我想在catkin工作区之外创建一个ROS发布者节点。可以创建吗? 最佳答案 当然可以。像对待任何其他 cpp 库或 python 包一样对待 ROS。 在Python中,你必须保持PYTHONPAT
PointCloud2的内容在ROS中是什么意思? fields.offset? fields.datatype? fields.count? point_step? row_step? 它的 d
PointCloud2的内容在ROS中是什么意思? fields.offset? fields.datatype? fields.count? point_step? row_step? 它的 d
我实现了一个依赖于其他包的ros包。 这些包依赖于更多的包等等...... 在我的包中构建和运行节点时,如何找出实际使用了哪些包? (除了手动查看所有 package.xml 文件,因为有多种情况,其
我正在做一个关于 ROS 的类(class)项目,并且被困在相当简单的任务上。 我的机器人模型有一个激光扫描仪,我在凉亭中使用我的机器人模型生成了一个包文件 我被要求像在 SLAM 中一样生成占用网格
在做 roslaunch .launch 时我希望在该文件中启动的所有节点仅在它们尚未运行时启动。我该怎么做呢?如果不可能,是否至少可以为每个节点单独执行此操作?如果有人有想法,那么如果您将该代码添
有没有办法获得从Realsense获得的点云中的点到深度图中的像素的映射?点云是从深度图中获得的,但是没有有效深度数据的像素被排除在外。 Realsense API 仅提供将点映射到 RGB 像素的例
我是一名优秀的程序员,十分优秀!