②Pybullet干涉检查指令getContactPoints与 getClosestPoints介绍

article/2025/6/29 7:35:55

1、指令格式说明

getContactPoints指令说明

该指令根据最近一次调用stepSimulation指令,返回接触点信息。它的输入参数信息如下所示;

该指令执行后在有干涉的情况下返回信息如下所示。没有干涉时,返回数据为空。

以下为使用示例,该示例为机器人有干涉情形。如果希望无干涉,可以将obstacle_shape的圆柱半径改为0.5。另外,该演示后面会关闭3D显示,如果不希望关闭,可以将程序最后的p.disconnect()注释。

import pybullet as p
import time
import numpy as np# 连接到PyBullet服务器,选择GUI模式
p.connect(p.GUI)# 加载机器人模型,例如KUKA IIWA
robotId = p.loadURDF("kuka_iiwa/model.urdf", useFixedBase=True)
print("robotId=",robotId)# 创建障碍物
obstacle_shape = p.createCollisionShape(p.GEOM_CYLINDER, radius=1, height=1)
obstacle_pose = [1.5, 0, 0.5]  # 设置障碍物位置
obstacleId = p.createMultiBody(baseMass=0, baseCollisionShapeIndex=obstacle_shape, basePosition=obstacle_pose)print("obstacleId=",obstacleId)# 设置机器人初始关节角度
jointAngles = [0, np.pi/4, 0, -np.pi/4, 0, np.pi/2, 0]
for i in range(len(jointAngles)):p.resetJointState(robotId, i, jointAngles[i])p.stepSimulation()jointAngles2 = [np.pi/2, np.pi/2, np.pi/2, 0, np.pi/4, 0, np.pi/4]# 步骤模拟
for i in range(1000):p.stepSimulation()# 控制机器人关节运动p.setJointMotorControlArray(robotId, range(7), p.POSITION_CONTROL, targetPositions=jointAngles2)# 检测碰撞contactPoints = p.getContactPoints(robotId, obstacleId)if len(contactPoints) > 0:print("检测到碰撞!")breakelse:print('机器人与障碍物未发生干涉')time.sleep(1. / 240.)  # 控制仿真速度print(contactPoints)
# 断开连接
p.disconnect()

运行上述程序后,contactPoints的返回数据如下所示:

((0, 0, 1, 4, -1, (0.7267713763928924, -0.06187698006452091, 0.6555865171411789), (0.5031878717065762, -0.07978455179650101, 0.655586517141584), (-0.9968078703881859, -0.07983777008515272, 1.8061582203282568e-12), -0.22429949775501498, 0.0, 0.0, (0.07983777008515272, -0.9968078703881859, 0.0), -0.0, (1.8003927291895255e-12, 1.4419964473197598e-13, 1.0)), (0, 0, 1, 5, -1, (0.7418498415436259, -0.007679285086848264, 0.6661223097072552), (0.5000514557764816, -0.010144251943691878, 0.6661223105795947), (-0.9999480421071588, -0.01019377682998052, 3.6075268435680132e-09), -0.2418109497545594, 0.0, 0.0, (0.010193776829980522, -0.999948042107159, 0.0), -0.0, (3.607339404074855e-09, 3.6774323551496385e-11, 1.0)), (0, 0, 1, 6, -1, (0.7249876472953181, 0.0006306772573657553, 0.5754345075215719), (0.5000003352373066, 0.0008172041516804874, 0.5754345075215048), (-0.9999996563339394, 0.0008290548853869341, -2.9811159043371856e-13), -0.22498738937854124, 0.0, -0.0, (-0.0008290548853869341, -0.9999996563339394, 0.0), -0.0, (-2.981114879828827e-13, 2.4715087043954326e-16, 1.0)))

getClosestPoints指令说明

该指令使用时,无需执行stepSimulation指令。而且允许计算两个分离物体距离最近的点。该指令执行时,不会返回法向力。该指令的输入参数信息如下所示:

该指令的返回数据和getContactPoints一样,只是法向力数据为一直为0.可以尝试将contactPoints的赋值指令修改为 p.getClosestPoints(robotId, obstacleId,0),然后收到的返回数据如下所示:

((0, 0, 1, 4, -1, (0.7064359177093062, -0.06189476625067741, 0.6599250401999935), (0.5030275849004288, -0.07775604200086254, 0.6599250404595945), (-0.9969735485606818, -0.07774151703126006, 1.2723929256255023e-09), -0.20402580700614925, 0.0, 0.0, (0.0, 0.0, 0.0), 0.0, (0.0, 0.0, 0.0)), (0, 0, 1, 5, -1, (0.7217830085456394, -0.00769630809706323, 0.6700708069495462), (0.50004892644242, -0.009891643921746119, 0.6700708069495462), (-0.9999509910834924, -0.009900274296266515, 0.0), -0.22174494958293942, 0.0, 0.0, (0.0, 0.0, 0.0), 0.0, (0.0, 0.0, 0.0)), (0, 0, 1, 6, -1, (0.7025878308696102, 0.0006184769025243883, 0.5798484113266819), (0.5000003073626638, 0.0007809571542291879, 0.5798484113266819), (-0.9999996783781319, 0.0008020247083084872, -1.7125663891067024e-16), -0.20258758866354515, 0.0, 0.0, (0.0, 0.0, 0.0), 0.0, (0.0, 0.0, 0.0)))

2、指令使用注意事项

①使用getContactPoints指令判断有无干涉前,必须执行stepSimulation指令,而getClosestPoints指令不需要。

如下所示getContactPoints指令运行前,需要执行stepSimulation指令。

import pybullet as p# 连接到 PyBullet 物理服务器
env = p.connect(p.GUI)
#env.setAdditionalSearchPath(pybullet.getDataPath())# 创建两个球体碰撞形状
collision_shape_id1 = p.createCollisionShape(p.GEOM_SPHERE, radius=0.5)
collision_shape_id2 = p.createCollisionShape(p.GEOM_SPHERE, radius=0.5)# 创建两个球体视觉形状
visual_shape_id1 = p.createVisualShape(p.GEOM_SPHERE, radius=0.5, rgbaColor=[0.8, 0.2, 0.2, 1])
visual_shape_id2 = p.createVisualShape(p.GEOM_SPHERE, radius=0.5, rgbaColor=[0.2, 0.8, 0.2, 1])# 创建两个球体刚体对象,初始位置分别为 (1, 2, 3) 和 (1.1, 2.2, 3.3)
sphere1 = p.createMultiBody(baseMass=1, baseCollisionShapeIndex=collision_shape_id1, baseVisualShapeIndex=visual_shape_id1, basePosition=[1, 2, 3])
#sphere1 = p.createMultiBody(baseMass=1, baseCollisionShapeIndex=collision_shape_id1, baseVisualShapeIndex=visual_shape_id1, basePosition=[1, 2, 3])
# 运行模拟
p.stepSimulation()sphere2 = p.createMultiBody(baseMass=0, baseCollisionShapeIndex=collision_shape_id2, baseVisualShapeIndex=visual_shape_id2, basePosition=[1.1, 2.2, 3.3])# 运行模拟,使用getContactPoints必须运行
p.stepSimulation()# 进行干涉检查
contact_points = p.getContactPoints(sphere1, sphere2)
#contact_points = p.getClosestPoints(sphere1, sphere2,0)
print('contact_points=',contact_points)# 如果存在接触点,则表示两个球体相互接触或重叠
if len(contact_points) > 0:print("两个球体相互接触或重叠")
else:print("两个球体没有相互接触或重叠")# 关闭 PyBullet 物理服务器
#p.disconnect()

②使用getContactPoints指令判断有无干涉时,检测对象的质量不能都为0。需要至少一个对象质量不为0。而getClosestPoints指令不需要。

具体测试测试程序可以参考上一个程序。

③当使用getClosestPoints进行干涉距离设置时,当实际间距距离大于设置值时,显示无干涉(即使实际干涉距离值为负时即有干涉,设置干涉距离为更小的负值也是一样),反之,当实际间距小于设置值时,即会显示干涉。

如设置值为0,实际间距为1e-17时,显示无干涉,而当设置值大于1e-17的任意值时,均会显示有干涉。而设置值为-1,实际已有干涉如-0.1时,显示仍然无干涉。

④当使用getClosestPoints时,当使用网格3D数据进行干涉检查时,当检测对象有孔洞或空腔,而另外一个检测对象位于其内侧时,默认会有干涉。需要将干涉检查对象的flags值设为1。

以上为getContactPoints与 getClosestPoints指令介绍及相关注意事项。


http://www.hkcw.cn/article/MmNXFkOKfy.shtml

相关文章

Vue-Leaflet地图组件开发(二)地图核心功能实现

第二篇:Vue-Leaflet地图核心功能实现 1. 地图视窗管理 1.1 视窗状态持久化方案 // 增强版视窗保存功能 const saveLocation async (options {}) > {try {const {saveToLocal true, // 默认保存到本地存储saveToServer false, // 是否保存到服务器notif…

DAY 37 超大力王爱学Python

知识点回顾: 过拟合的判断:测试集和训练集同步打印指标模型的保存和加载 仅保存权重保存权重和模型保存全部信息checkpoint,还包含训练状态 早停策略 作业:对信贷数据集训练后保存权重,加载权重后继续训练50轮&#xf…

ubuntu 添加应用到启动菜单

使用Alacarte菜单编辑器 Alacarte是一个简单易用的菜单编辑器,可以帮助用户添加、删除或编辑应用程序的启动菜单项。 安装Alacarte sudo apt-get install alacarte 执行alacarte alacarte 使用说明 选择新建项目进行添加 "Name"栏填自定义的名称&quo…

3,信号与槽机制

这里绘制好了QT控件,现在需要点击控件,出现相应的响应操作 目录 法一 通过图形界面编写: 1,鼠标选中控件 ,右击,点击转到槽 选择相应的触发操作, 在widget.cpp和widget.h,分别自动增加如下代码: 需要手动添加进程头文件 : 查找QProcess如何使用 保存修改,并…

贪心算法应用:最小反馈顶点集问题详解

贪心算法应用:最小反馈顶点集问题详解 1. 问题定义与背景 1.1 反馈顶点集定义 反馈顶点集(Feedback Vertex Set, FVS)是指在一个有向图中,删除该集合中的所有顶点后,图中将不再存在任何有向环。换句话说,反馈顶点集是破坏图中所…

【Doris基础】Apache Doris中的Version概念解析:深入理解数据版本管理机制

目录 引言 1 Version概念基础 1.1 什么是Version 1.2 Version的核心作用 1.3 Version相关核心概念 2 Version工作机制详解 2.1 Version在数据写入流程中的作用 2.2 Version在数据查询流程中的作用 2.3 Version的存储结构 3 Version的进阶特性 3.1 Version的合并与压…

vLLM实战部署embedding、reranker、senseVoice、qwen2.5、qwen3模型

概述 一个开源的支持高并发的高性能大模型推理引擎。在这篇博客有简单提到过。 学习资料:官方文档,官方中文文档,中文文档。 modelscope 通过vLLM(或其他平台、框架)部署模型前,需要先下载模型。国内一…

Java函数式编程(中)

三、Stream API (1)创建操作 构建Arrays.stream(数组)根据数组构建Collection.stream()根据集合构建Stream.of(对象1, 对象2, ...)根据对象构建 生成IntStream.range(a, b)根据范围生成(含a 不含b)IntStream.rangeClosed(a, b)…

16.FreeRTOS

目录 第1章 FreeRTOS 实时操作系统 1.1 认识实时操作系统 1.1.1 裸机的概念 1.1.2 操作系统的概念 1.2 操作系统的分类 1.3 常见的操作系统 1.4 认识实时操作系统 1.4.1 可剥夺型内核与不可剥夺型内核 1.4.2 嵌入式操作系统的作用 1.4.3 嵌入式操作系统的发展 1.4.4…

windows11安装scoop 20250602

详细的 Scoop 安装步骤: 使用国内镜像安装 Scoop 首先,打开 PowerShell(右键点击 win按钮,–>终端,Scoop官方不建议用管理员权限安装),然后执行以下命令: # 设置 Scoop 安装路径 $env:SCOO…

类和对象(一)

一、面向对象 (OOP是面向对象的语言的简称) Java是⼀⻔纯⾯向对象的语⾔,在⾯向对象的世界⾥,⼀切皆 为对象。⾯向对象是解决问题的⼀种思想,主要依靠对象之间的交互完成⼀件事情。 面向对象——>不关注过程&…

OpenCV4.4.0下载及初步配置(Win11)

目录 OpenCV4.4.0工具下载安装环境变量系统配置 OpenCV4.4.0 工具 系统:Windows 11 下载 OpenCV全版本百度网盘链接:: https://pan.baidu.com/s/15qTzucC6ela3bErdZ285oA?pwdjxuy 提取码: jxuy找到 opencv-4.0.0-vc14_vc15 下载得到 安装 运行op…

QGIS Python脚本开发(入门级)

随着人工智能技术的飞速发展,编程语言和脚本开发正变得前所未有的便捷。在GIS领域,QGIS作为一款卓越的开源地理信息系统软件,凭借其易于下载、界面简洁、功能强大等诸多优势,赢得了全球用户的青睐。更令人兴奋的是,QGI…

【算法】分支限界

一、基本思想 (分支限界, 分枝限界, 分支界限 文献不同说法但都是一样的) 分支限界法类似于回溯法,也是一种在问题的解空间树上搜索问题解的算法。 但一般情况下,分支限界法与回溯法的求解目标不同。回溯…

【springcloud】快速搭建一套分布式服务springcloudalibaba(四)

第四篇 基于nacos搭建分布式项目 分布式系统日志(skywalkinges) 项目所需 maven nacos java8 idea git mysql redis skywalking es 本文主要从客户下单时扣减库存的操作,将链路日志模拟出来,网关系统/用户系统/商品系统/订…

设计模式(行为型)-中介者模式

目录 定义 类图结构展示 角色职责详解 模式的优缺点分析 优点 缺点 适用场景 应用实例 与其他模式的结合与拓展 总结 定义 中介者模式的核心思想可以概括为:用一个中介对象来封装一系列的对象交互。这个中介者就像一个通信枢纽,使各对象不需要…

PMOS以及电源转换电路设计

PMOS的使用 5V_EN5V时&#xff0c;PMOS截止&#xff1b; 5V_EN0V时&#xff0c;PMOS导通&#xff1b; 电源转换电路 当Vout0V时&#xff0c;Vg0V, Vgs>Vth, PMOS导通&#xff0c;只有电池供电&#xff1b; 当Vout5V时&#xff0c;Vg4.9V, Vs4.8V?, Vgs<Vth, PMOS截止&am…

本地部署 DeepSeek R1(最新)【从下载、安装、使用和调用一条龙服务】

文章目录 一、安装 Ollama1.1 下载1.2 安装 二、下载 DeepSeek 模型三、使用 DeepSeek3.1 在命令行环境中使用3.2 在第三方软件中使用 一、安装 Ollama 1.1 下载 官方网址&#xff1a;Ollama 官网下载很慢&#xff0c;甚至出现了下载完显示 无法下载&#xff0c;需要授权 目…

数据治理的演变与AI趋势

知识星球&#xff1a;数据书局。打算通过知识星球将这些年积累的知识分享出来&#xff0c;让各位在数据治理、数据分析的路上少走弯路&#xff0c;另外星球也方便动态更新最近的资料&#xff0c;提供各位一起讨论数据的小圈子 1.数据治理的演变 1.1.摘要 数据治理是指组织管…

Fullstack 面试复习笔记:操作系统 / 网络 / HTTP / 设计模式梳理

Fullstack 面试复习笔记&#xff1a;操作系统 / 网络 / HTTP / 设计模式梳理 面试周期就是要根据JD调整准备内容&#xff08;挠头&#xff09;&#xff0c;最近会混合复习针对全栈这块的内容&#xff0c;目前是根据受伤的JD&#xff0c;优先选择一些基础的操作系统、Java、Nod…