当前位置: 首页 > news >正文

windows下使用FCL(Flexible-collision-library)

windows下使用FCL(The Flexible-collision-library)

   FCL做为一款开源的碰撞检测库,支持多种基础的几何体,及支持C++和python,在windows和linux平台均可以使用。是一款计算高效的碰撞检测工具。在机械臂规划控制框架moveit中做为基础的碰撞检测算法。
FCL支持的几何体类型:

  • box (长方体)
  • sphere(球)
  • ellipsoid(椭球)
  • capsule(胶囊体)
  • cone(锥体)
  • cylinder(圆柱)
  • convex(凸包)
  • half-space(半空间)
  • plane(平面)
  • mesh(面片)
  • octree (八叉树)

FCL库(The Flexible Collision Library)主要的功能有:
1、碰撞检测:检测两个模型是否重叠,以及(可选)所有重叠的三角形。
2、距离计算:计算一对模型之间的最小距离,即最近的一对点之间的距离。
3、公差验证:确定两个模型是否比公差距离更近或更远。
4、连续碰撞检测:检测两个运动模型在运动过程中是否重叠,以及可选的接触时间。
5、接触信息:对于碰撞检测和连续碰撞检测,可以选择返回接触信息(包括接触法线和接触点)。

源码下载及编译

FCL 源码github
  在windows环境下,使用VS studio直接编译FCL存在问题,需要将CMake设置成Release版本以及屏蔽掉测试程序。具体操作如下:

  1. 使用VS studio打开FCO源码工程,如图1所示。

图1
2. 通过改CMakeList.txt文件,屏蔽测试程序,如图2所示。

图2
3. 点击“项目”,再点击“fcl的CMake配置”,将编译设置成Release版本,如图3所示。

图3
4. 点击“生成”,再点击“全部重新生成”对FCL源码进行编译。

FCL碰撞测试demo

  测试程序如下所示:

//main.cpp
#include "fcl/math/constants.h"
#include "fcl/narrowphase/collision.h"
#include "fcl/narrowphase/collision_object.h"
#include "fcl/narrowphase/distance.h"/*** @brief 两个相互碰撞的Box碰撞检测测试*/
void test1() {std::shared_ptr<fcl::CollisionGeometry<double>> box1(new fcl::Box<double>(3, 3, 3));std::shared_ptr<fcl::CollisionGeometry<double>> box2(new fcl::Box<double>(1, 1, 1));fcl::Transform3d tf1 = fcl::Transform3d::Identity();fcl::CollisionObjectd obj1(box1, tf1);fcl::Transform3d tf2 = fcl::Transform3d::Identity();fcl::CollisionObjectd obj2(box2, tf2);fcl::CollisionRequestd request;fcl::CollisionResultd result;request.gjk_solver_type =fcl::GJKSolverType::GST_INDEP;  // specify solver type with the default// type is GST_LIBCCDfcl::collide(&obj1, &obj2, request, result);std::cout << "test1 collide result:" << result.isCollision() << std::endl;
}/*** @brief 两个无碰撞的Box碰撞检测测试*/
void test2() {std::shared_ptr<fcl::CollisionGeometry<double>> box1(new fcl::Box<double>(3, 3, 3));std::shared_ptr<fcl::CollisionGeometry<double>> box2(new fcl::Box<double>(1, 1, 1));fcl::Transform3d tf1 = fcl::Transform3d::Identity();fcl::CollisionObjectd obj1(box1, tf1);fcl::Transform3d tf2 = fcl::Transform3d::Identity();tf2.translation() = fcl::Vector3d{3, 0, 0};fcl::CollisionObjectd obj2(box2, tf2);fcl::CollisionRequestd request;fcl::CollisionResultd result;fcl::collide(&obj1, &obj2, request, result);std::cout << "test2 collide result:" << result.isCollision() << std::endl;
}/*** @brief 两个无碰撞的Box碰撞检测测试,并计算最短距离*/
void test3() {std::shared_ptr<fcl::CollisionGeometry<double>> box1(new fcl::Box<double>(3, 3, 3));std::shared_ptr<fcl::CollisionGeometry<double>> box2(new fcl::Box<double>(1, 1, 1));fcl::Transform3d tf1 = fcl::Transform3d::Identity();fcl::CollisionObjectd obj1(box1, tf1);fcl::Transform3d tf2 = fcl::Transform3d::Identity();tf2.translation() = fcl::Vector3d{3, 0, 0};fcl::CollisionObjectd obj2(box2, tf2);fcl::CollisionRequestd request;fcl::CollisionResultd result;// fcl::collide(&obj1,&obj2,request,result);std::cout << "test3 collide result:" << result.isCollision() << std::endl;fcl::DistanceRequestd dist_request(true);dist_request.distance_tolerance = 1e-4;fcl::DistanceResultd dist_result;fcl::distance(&obj1, &obj2, dist_request, dist_result);std::cout << "test3 collide distance:" << dist_result.min_distance<< std::endl;std::cout << "test3 collide point 0:" << dist_result.nearest_points[0]<< std::endl;std::cout << "test3 collide point 1:" << dist_result.nearest_points[1]<< std::endl;
}/*** @brief 加载STL模型*/
bool loadSTLFile(const std::string& filename,std::vector<fcl::Triangle>& triangles) {std::ifstream file(filename, std::ios::in | std::ios::binary);if (!file) {std::cerr << "Failed to open STL file: " << filename << std::endl;return false;}file.seekg(0, std::ios::end);  /// 定位到流末尾的位置,0偏移std::streampos length = file.tellg();  /// 记录当前指针位置file.seekg(0, std::ios::beg);  /// 定位到流开头的位置,0偏移std::vector<char> buffer(length);file.read(&buffer[0], length);file.close();if (length < 84) {std::cerr << "Invalid STL file: " << filename << std::endl;return false;}unsigned int num_triangles = *(unsigned int*)&buffer[80];triangles.resize(num_triangles);unsigned int offset = 84;for (unsigned int i = 0; i < num_triangles; ++i) {for (unsigned int j = 0; j < 3; ++j) {// 3顶点构成三角形float* vertex = (float*)&buffer[offset + j * 12];triangles[i][j] = (vertex[0], vertex[1], vertex[2]);}offset += 50;}return true;
}/*** @brief 在STL文件格式中,文件头部分包含80个字节的文件头信息和4个字节的三角形数量信息,因此文件总长度至少为84个字节。
因此,在loadSTLFile函数中我们首先检查文件长度是否小于84个字节,如果是则认为文件格式非法。
在STL文件中,每个三角形由12个浮点数和2个无用字节组成,因此每个三角形占用50个字节。
因此,在loadSTLFile函数中,我们通过一个循环遍历每个三角形,并从文件中读取对应的12个浮点数,最后将三角形的3个顶点存储在一个fcl::Triangle类型的变量中。
每次读取完一个三角形后,需要将读取指针向前移动50个字节,即offset += 50。由于文件头部分占用了前84个字节,因此,在开始循环前需要将读取指针初始化为offset= 84,从而跳过文件头部分,开始读取三角形信息。*/
void test4() {std::vector<fcl::Triangle> triangles;  /// 创建三角片序列/// 加载模型if (!loadSTLFile("C:/test0.STL", triangles)) {std::cout << "Error:loadSTLFile failed!" << std::endl;return;}/// 创建mesh,并添加三角片到mesh///std::shared_ptr<fcl::BVHModel<fcl::OBBRSSd>> mesh_geometry(new fcl::BVHModel<fcl::OBBRSSd>());mesh_geometry->beginModel();for (const auto& triangle : triangles) {Eigen::Vector3d p1(triangle[0]), p2(triangle[1]), p3(triangle[2]);mesh_geometry->addTriangle(p1, p2, p3);}mesh_geometry->endModel();/// 建立碰撞对象-stl ,并添加CollisionGeometry,坐标位置(0,0,0)fcl::CollisionObjectd obj(mesh_geometry);/// 建立碰撞对象-box ,坐标位置(0,0,20)std::shared_ptr<fcl::Boxd> box1 = std::make_shared<fcl::Boxd>(2.0, 2.0, 2.0);fcl::CollisionObjectd obj1(box1);obj1.setTranslation(Eigen::Vector3d(0, 0, 0));fcl::CollisionRequestd request;fcl::CollisionResultd result;/// 进行碰撞检测fcl::collide(&obj, &obj1, request, result);/// 输出碰撞结果if (result.isCollision()) {std::cout << "Collision detected!" << std::endl;} else {std::cout << "No collision detected." << std::endl;}/// 距离检测fcl::DistanceRequestd requestd;fcl::DistanceResultd resultd;fcl::distance(&obj, &obj1, requestd, resultd);std::cout << "min_distance:" << resultd.min_distance << std::endl;
}int main(int argc, char** argv) {std::cout << "FCL test" << std::endl;test1();test2();test3();test4();std::cout << "end test" << std::endl;return 0;
}

CMakeList.txt文件如下所示:

cmake_minimum_required(VERSION 3.14)
find_package(Eigen3 REQUIRED)
find_package(FCL REQUIRED)
add_executable(use_fcl main.cpp)
target_link_libraries(use_fcl fcl Eigen3::Eigen)
target_include_directories(use_fcl PUBLIC ${EIGEN3_INCLUDE_DIRS} ${FCL_INCLUDE_DIRS})

相关文章:

windows下使用FCL(Flexible-collision-library)

windows下使用FCL&#xff08;The Flexible-collision-library&#xff09; FCL做为一款开源的碰撞检测库&#xff0c;支持多种基础的几何体&#xff0c;及支持C和python&#xff0c;在windows和linux平台均可以使用。是一款计算高效的碰撞检测工具。在机械臂规划控制框架movei…...

Godot4实现游戏的多语言版本

要在Godot 4中实现多语言版本的游戏&#xff0c;您需要按照以下几个步骤来设置和管理游戏文本以及可能的其他资源&#xff0c;如图像或声音。以下是根据官方文档和详细教程整理的简明指南&#xff1a; 准备翻译文件&#xff1a; Godot支持使用.csv文件或.po文件进行国际化​​…...

6张图让你了解openRA 下载及编译

下面的3张图是免费赠送的用vs解决方案编译的方法...

华为防火墙 配置 SSLVPN

需求&#xff1a; 公司域环境&#xff0c;大陆客户端居家办公室需要连到公司域&#xff0c;这里可以在上海防火墙上面开通SSLVPN&#xff0c;员工就可以透过SSLVPN连通上海公司的内网&#xff0c;但是由于公司域控有2个站点&#xff0c;一个在上海&#xff0c;一个在台北&…...

Android Studio(数据存储)

数据存储方式 方式特点文件存储openFileInput()和openFileOutput()进行存写SharedPreferences以XML格式进行存储SQLite运算快、占用资源少、支持基本的sql语法ContentProvider可用于应用之间的数据交互网络存储通过网络提供的存储空间来存储/获取数据信息 文件存储 主要语法…...

人,要懂得享受孤独

喜欢在如水的月光下&#xff0c;望一轮洁白的皓月&#xff0c; 喜欢在清寂的夜晚&#xff0c;看那星光流转倏忽间的变幻&#xff0c;牵动心中万千情怀。 独享这份清幽&#xff0c;遐想那月中寻桂子的浪漫。 这个世界太喧闹&#xff0c;偶尔&#xff0c;需要关一关窗&#xff0c…...

Spring Boot + EasyUI Datebox和Datetimebox样例

使用EasyUI的Datebox和Datetimebox组件&#xff0c;并对其进行适当的改造&#xff0c;比如更改日期格式、设置默认值或者将当前时间设置为默认值。 一、运行结果 二、实现代码 1.代码框架 2.实现代码 SpringBootMainApplication.java: package com.xj.main;import org.spri…...

web前端JS基础------制作一个获取验证码

1&#xff0c;需要一个定时器&#xff0c;和一个button&#xff0c;通过点击事件启动获取验证码 2&#xff0c;参考代码如下 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><…...

MyBatis面经

MyBatis常见面试题 &#xff01;&#xff01;本文主要是博主总结看着玩的&#xff0c;不具有很高的参考价值&#xff0c;慎重 1、MyBatis是什么&#xff1f;MyBatis工作原理&#xff1f;MyBatis的使用场景有哪些&#xff1f; MyBatis是一款优秀的持久层框架&#xff0c;它是…...

SpringBoot基础(六)-- 辅助功能之一 -- 内嵌tomcat

目录 1. 内嵌Tomcat定义位置 2. 内嵌Tomcat运行原理 3. 更换内嵌Tomcat 在前面,我们做的SpringBoot入门案例(SpringBoot基础(一)-- 使用idea(2022版)创建一个Springboot项目(联网开发))勾选了Spirng-web的功能&#...

K8s:部署 CNI 网络组件+k8s 多master集群部署+负载均衡及Dashboard k8s仪表盘图像化展示管理

目录 1 部署 CNI 网络组件 1.1 部署 flannel 1.2 部署 Calico 1.3 部署 CoreDNS 2 负载均衡部署 3 部署 Dashboard 1 部署 CNI 网络组件 1.1 部署 flannel K8S 中 Pod 网络通信&#xff1a; ●Pod 内容器与容器之间的通信 在同一个 Pod 内的容器&#xff08;Pod 内的容…...

「直播回放」使用 PLC + OPC + TDengine,快速搭建烟草生产监测系统

在烟草工业场景里&#xff0c;多数设备的自动控制都是通过 PLC 可编程逻辑控制器来实现的&#xff0c;PLC 再将采集的数据汇聚至 OPC 服务器。传统的 PI System、实时数据库、组态软件等与 OPC 相连&#xff0c;提供分析、可视化、报警等功能&#xff0c;这类系统存在一些问题&…...

私域流量搭建与运营,技巧全攻略!

2023年是比拼运营深度和服务效率的一年&#xff0c;用户对于体验的期望值将持续增长&#xff0c;企业需提供无缝的客户体验&#xff0c;以推动增长、保障收入、确保客户忠诚度。在疫情新常态下&#xff0c;企业已构建起APP、小程序等一系列线上触点矩阵&#xff0c;而各个触点之…...

AWS SAP-C02教程0--课程概述

SAP是亚马逊云的解决方案架构师专业级认证&#xff0c;关于本课程&#xff0c;我会简述已下3点&#xff1a; 在本课程中按照自己的分类讲述考试相关的AWS产品&#xff0c;特别会注明每个产品在考试中可能出现的考点会对一些解决方案做对比&#xff0c;通过一些对比给出不同场景…...

RFC使用与WebService

RFC连接 CSDN RFC中引用类型组 http://t.csdnimg.cn/wQWAYhttp://t.csdnimg.cn/wQWAY 远程目标系统维护SM59 这里的类型指的是目标系统的系统类型(目标系统即rfc函数存在的系统). 类型2&#xff08;R/2连接&#xff09;&#xff0c;只需给出主机名&#xff0c;所有通信信息…...

打造全球化电商平台,多语言商城系统助您开拓海外市场

全球化进程的加速&#xff0c;越来越多的企业开始将目光投向海外市场。然而&#xff0c;语言和文化差异成为了企业面临的一大挑战。为了帮助企业顺利拓展海外业务&#xff0c;多语言商城系统应运而生。作为一种功能强大的电子商务平台&#xff0c;多语言商城系统具备以下关键功…...

【滑动窗口】篮里到底能装 “几个水果” 呢?

Problem: 904. 水果成篮 文章目录 题目分析算法原理分析暴力枚举 哈希表滑动窗口优化数组再度优化 复杂度Code 题目分析 首先我们来分析一下本题的思路 首先我们通过题目的描述来理解一下其要表达的含义&#xff0c;题目给到我们一个fruit数组&#xff0c;里面存放的是每棵树上…...

newstarctf2022week2

Word-For-You(2 Gen) 和week1 的界面一样不过当时我写题的时候出了个小插曲 连接 MySQL 失败: Access denied for user rootlocalhost 这句话印在了背景&#xff0c;后来再进就没了&#xff0c;我猜测是报错注入 想办法传参 可以看到一个name2,试着传参 发现有回显三个字段…...

集群调度-01

目录 1、调度约束 2、Pod 是 Kubernetes 的基础单元&#xff0c;Pod 启动典型创建过程如下 2.1 工作机制 **** 2.2 调度过程 *** 2.3 Predicate 有一系列的常见的算法可以使用&#xff1a; ** 2.4 指定调度节点 1、调度约束 Kubernetes 是通过 List-Watch **…...

【软件工程】金管局计算机岗位——软件测试的分类(⭐⭐⭐⭐)

软件工程 软件测试的分类从是否关心软件内部结构和具体实现的角度划&#xff08;⭐⭐⭐⭐&#xff09;从是否执行代码角度划分&#xff08;⭐⭐&#xff09;从软件开发的过程按阶段划分&#xff08;⭐⭐⭐⭐&#xff09; 软件测试的分类 考点导读&#xff1a; 软件测试是软件工…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

synchronized 学习

学习源&#xff1a; https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖&#xff0c;也要考虑性能问题&#xff08;场景&#xff09; 2.常见面试问题&#xff1a; sync出…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合

在汽车智能化的汹涌浪潮中&#xff0c;车辆不再仅仅是传统的交通工具&#xff0c;而是逐步演变为高度智能的移动终端。这一转变的核心支撑&#xff0c;来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒&#xff08;T-Box&#xff09;方案&#xff1a;NXP S32K146 与…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

jmeter聚合报告中参数详解

sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample&#xff08;样本数&#xff09; 表示测试中发送的请求数量&#xff0c;即测试执行了多少次请求。 单位&#xff0c;以个或者次数表示。 示例&#xff1a;…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器

拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件&#xff1a; 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...