QueryObject 离开函数作用域时出现段错误

如何解决QueryObject 离开函数作用域时出现段错误

以下代码段错误:

from pydrake.all import (
    Diagram,DiagramBuilder,AddMultibodyPlantSceneGraph,UnitInertia,SpatialInertia,MultibodyPlant,SceneGraph,QueryObject,)
import numpy as np


def get_query_object(
    diagram: Diagram,plant: MultibodyPlant,scene_graph: SceneGraph,q: np.ndarray,) -> QueryObject:
    context = diagram.CreateDefaultContext()
    plant_context = diagram.GetMutableSubsystemContext(plant,context)
    plant.SetPositions(plant_context,q)
    sg_context = diagram.GetMutableSubsystemContext(scene_graph,context)
    query_object = (
        scene_graph.get_query_output_port().EvalAbstract(sg_context).get_value()
    )
    return query_object


builder = DiagramBuilder()

plant,scene_graph = AddMultibodyPlantSceneGraph(builder,1e-4)
plant.AddRigidBody(
    "body",SpatialInertia(1,[0,0],UnitInertia(1,1,1)),)

plant.Finalize()
diagram = builder.Build()

q = np.zeros(7)

query_object = get_query_object(
    diagram=diagram,plant=plant,scene_graph=scene_graph,q=q,)
signed_distance_pair = query_object.ComputeSignedDistancePairwiseClosestPoints()

可以通过内联 get_query_object 的内容或在其中执行 ComputeSignedDistancePairwiseClosestPoints 来避免段错误,因此我认为问题在于使用已离开其创建范围的 QueryObject。 Drake 文档有一个关于 QueryObject 的警告,我认为这与此有关:

"输入端口返回的const引用被认为是'live'- 它链接到上下文、系统和缓存(充分利用所有 这些机制)。这个 const 引用不应该被持久化; 这样做会导致错误的查询结果。它更简单,更多 建议获取它以在有限范围内进行评估(例如, CalcTimeDerivatives()) 然后丢弃它。如果需要 QueryObject 对于 LeafSystem 中的许多独立功能,每个功能都应该重新评估 输入端口。底层缓存机制应该使成本 这个可以忽略不计。”

这是我的用例:我写了一堆使用几何查询的函数,比如非渗透约束和联系雅可比。所有这些都使用了很多样板来设置 QueryObject,所以我想我会把样板包装在一个 get_query_object 函数中,其他函数会调用它并然后运行他们需要的任何几何查询。这对我来说听起来是安全的,因为每个函数都在设置自己的 QueryObject 并且它不会退出该函数的范围,所以我们不应该遇到这个问题文档中描述。但它显然不起作用---那么推荐的工作流程是什么?

解决方法

您遇到的问题是 get_query_object 创建一个在返回时被抛出的上下文。在最高级别,您应该将 QueryObject 视为可以执行特定查询的 Context视图;它不存储任何数据。没有Context,你的QueryObject会死。

您的函数尝试做两件事:

  1. 为多体植物设置一些位置。
  2. 获取一个查询对象,以便计算有符号距离。

尽管您对查询对象现在已死的事实感到困惑,但您的另一个问题是您设置的主体位置也被上下文破坏了。

我建议进行以下更改:

  1. 创建上下文并将其存储在与图表、工厂和场景图类似的范围内。
  2. 获取与那个上下文相关联的查询对象,然后挂在它上面。只要上下文(即,它将总是成为该上下文数据的视图),它将是有效的和“活的”。或者,如文档所示,QueryObject 实例很便宜。您可以在需要时从上下文中获取一个。
  3. 创建一个方法,其唯一目的是在同一上下文中设置植物的身体位置。

这应该为您提供了您正在寻找的功能。

您粘贴的文档中的警告是指查询对象处于活动状态这一事实。如果您坚持使用该引用并且上下文中的数据发生变化,您将得到不同的答案。答案将始终反映相关上下文的当前状态。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res