HDAPI Overview

放一个链接:OpenHaptics_Developer_Edition_v3.5.0
安装好驱动后可以装这个,里面有HDAPI
链接: https://pan.baidu.com/s/1DfkWcHsVE57nB6sn7QnD5Q 提取码: cznh

最后说明下,楼主并不是机械等专门做力渲染出身的人,只是使用过力反馈设备完成简单的开发而已

本文目的: 分析 HDAPI demo,如何产生一个触碰平面的力

Haptic Device(触觉设备)API 包含两个主要的部分:设备以及调度程序。设备抽象化就可以让任何支持3维触觉的机器在 HDAPI 下使用。调度程序回调允许程序员输入在伺服循环线程内执行的命令。
HDAPI 典型用途:

  • 初始化设备
  • 初始化调度程序
  • 启动调度程序
  • 使用调度程序执行一些触觉命令
  • 完成时退出

开始

HDAPI 需要一个安装驱动的 3D 触觉设备,以及安装的 HDAPI
项目应该包含 HDAPI 的头文件以及 HDAPI 库文件以及实用工具(utility)的库文件

由于3维触觉设备不易表示出来,下面采用语言描述
ConsoleExamples 中的 FrictionlessPlane:
创建一个高度为0的平面,触觉设备从上或者从下碰到平面时产生推力,当触觉设备的力大于阈值时会发生穿透。

力的判定


如图(左侧),当触觉设备位置在平面法向量(绿色部分)上方,此时投影为正,表示没有发生穿透现象
接着设备朝着平面运动(图右侧),当投影为负时表示发生穿透。
现在用穿透的位移(点到平面的距离)当作弹簧形变,根据胡可定律产生力,力的方向和当前平面的法向量一致(所以产生排斥力)。
当力大于阈值时设置力为0,同时改变朝向(directionFlag)如下图

这样当设备朝着上方移动时(重复上述过程)仍然可以感受到平面,符合实际情况。

demo源码解析

int main(int argc, char* argv[])
{HDErrorInfo error;// 初始化默认的 haptic device.HHD hHD = hdInitDevice(HD_DEFAULT_DEVICE);if (HD_DEVICE_ERROR(error = hdGetError())){hduPrintError(stderr, &error, "Failed to initialize haptic device");fprintf(stderr, "\nPress any key to quit.\n");getch();return -1;}// 创建一个随动调度程序并施夹力hdEnable(HD_FORCE_OUTPUT);hdStartScheduler();if (HD_DEVICE_ERROR(error = hdGetError())){hduPrintError(stderr, &error, "Failed to start the scheduler");fprintf(stderr, "\nPress any key to quit.\n");getch();return -1;}// 安排一个无摩擦平面的回调, 会运行在servoloop 中,当刺破平面时施加力HDCallbackCode hPlaneCallback = hdScheduleAsynchronous(FrictionlessPlaneCallback, 0, HD_DEFAULT_SCHEDULER_PRIORITY);printf("Plane example.\n");printf("Move the device up and down to feel a plane along Y=0.\n");printf("Push hard against the plane to popthrough to the other side.\n");printf("Press any key to quit.\n\n");while (!_kbhit()){       if (!hdWaitForCompletion(hPlaneCallback, HD_WAIT_CHECK_STATUS)){fprintf(stderr, "\nThe main scheduler callback has exited\n");fprintf(stderr, "\nPress any key to quit.\n");getch();break;}}// 清理并关闭 haptic device, 清除所有的回调函数.hdStopScheduler();hdUnschedule(hPlaneCallback);hdDisableDevice(hHD);return 0;
}// 平面在y=0处,当穿破物体时提供一个排斥力
HDCallbackCode HDCALLBACK FrictionlessPlaneCallback(void *data)
{// 硬度,值越大平面越硬const double planeStiffness = 2.85;// 穿透平面时最大的力const double popthroughForceThreshold = 30.0;// 朝向:穿破平面时改变,1和-1表示面对平面的正面和背面// 这个例子中,1表示位于平面上方,-1表示位于平面下方static int directionFlag = 1;hdBeginFrame(hdGetCurrentDevice());// device 的位置.hduVector3Dd position;hdGetDoublev(HD_CURRENT_POSITION, position);// 如果用户穿透平面, 设置一个沿着平面法向量上排斥的力 // 当平面法向量+y但位置为负时,发生穿透if ((position[1] <= 0 && directionFlag > 0) || (position[1] > 0) && (directionFlag < 0)){double penetrationDistance = fabs(position[1]);hduVector3Dd forceDirection(0,directionFlag,0);// 胡克定律double k = planeStiffness;hduVector3Dd x = penetrationDistance*forceDirection;hduVector3Dd f = k*x;// 发生穿刺时力归0,更改朝向if (f.magnitude() > popthroughForceThreshold){f.set(0.0,0.0,0.0);directionFlag = -directionFlag;}hdSetDoublev(HD_CURRENT_FORCE, f);}hdEndFrame(hdGetCurrentDevice());// 发生错误时结束回调函数HDErrorInfo error;if (HD_DEVICE_ERROR(error = hdGetError())){hduPrintError(stderr, &error, "Error detected during main scheduler callback\n");if (hduIsSchedulerError(&error)){return HD_CALLBACK_DONE;  }}return HD_CALLBACK_CONTINUE;
}

效果


可以看到整个过程中间有明显的阻力,当继续施加力之后会直接穿透平面

bug

  • 速度太快时无法感受到力,此时会直接刺破平面,感觉是碰撞检测出了问题

01 力反馈 OpenHaptics ConsoleExamples-FrictionlessPlane相关推荐

  1. 使用Phantom omni力反馈设备控制机器人

    传统的工业机器人普遍采用电机 .齿轮减速器 .关节轴三者直接连接的传动机构,这种机构要求电机与减速器安装在机械臂关节附近,其缺点是对于多关节机械臂,下一级关节的电机与减速器等驱动装置成为上一级关节的额 ...

  2. 力反馈OpenHaptic安装 + 配合 SOFA Geomagic插件

      在Windows下安装力反馈设备并连接SOFA,版本如下: 平台 Windows10 Haptic OpenHaptics touch device 驱动 touch deveci driver ...

  3. 零起点学算法01——第一个程序Hello World!

    零起点学算法01--第一个程序Hello World! Description 题目很简单 输出"Hello World!"(不含引号),并换行. Input 没有输入 Outpu ...

  4. hdu5296 01字典树

    根据二进制建一棵01字典树,每个节点的答案等于左节点0的个数 * 右节点1的个数 * 2,遍历整棵树就能得到答案. AC代码: #include<cstdio> using namespa ...

  5. 20150411--Dede二次开发-01

    20150411--Dede二次开发-01 目录 一.目前市场流行的电子商城系统 1 二.ecshop的介绍 1 三.安装 2 四.echsop 的目录结构 5 五.分析ecshop里面程序的架构 5 ...

  6. (九)单片机串行口 内部结构的讲解 01

    1. 基本概念 常用于数据通信的传输方式有单工.半双工.全双工和多工方式. 单工方式:数据仅按一个固定方向传送.因而这种传输方式的用途有限,常用于串行口的打印数据传输与简单系统间的数据采集. 半双工方 ...

  7. Python 学习笔记01

    print:直接输出 type,求类型 数据类型:字符串,整型,浮点型,Bool型 note01.py # python learning note 01 print('Hello world!') ...

  8. ACM1881 01背包问题应用

    01背包问题动态规划应用 acm1881毕业bg 将必须离开的时间限制看作背包容量,先将他们由小到大排序,然后在排完序的数组中对每个实例都从它的时间限制开始(背包容量)到它的延长时间进行遍历: 1 # ...

  9. 什么是壳 - 脱壳篇01

    什么是壳 - 脱壳篇01 让编程改变世界 Change the world by program 壳 在自然界中,植物用壳来保护种子,动物用壳来保护身体,我们人类没有壳,但我们有衣服,房子也起到了壳的 ...

最新文章

  1. linux mysql添加用户名和密码错误,linux下为mysql设置用户名和密码
  2. 独家 | Deepnote测评:数据科学家的新IDE
  3. oracle中同义词的用法,Oracle中使用同义词介绍
  4. Spark Worker启动源码
  5. 链表——PowerShell版
  6. 机器学习(七)——tf.keras搭建神经网络固定模式
  7. Golang cgo编程 [] string 转 C语言 char**
  8. 干货 | 双目摄像头实现手势识别,完美还原人体运动手势
  9. HTML DOM节点的属性获取
  10. Minimize the Permutation CodeForces - 1256(贪心)
  11. Google Guava –与Monitor同步
  12. 蜕变!网易轻舟微服务这波操作,始于异构融合、源于中台!
  13. 宁静——一种心灵的奢望
  14. Sublime Text 4不显示未注册的方法
  15. yolo如何降低loss_YOLO训练中的问题与怀疑
  16. 2008年最新CCNA第二学期第十单元题目(2008-12-14 14:34:59)
  17. hltm连接css的link,CSS 链接(link)
  18. android 5 root super su,针对Supersu也root不了手机的root详细使用教程
  19. Python与Qt UI的图形界面编程(三)
  20. wps服务器无响应是什么原因,windows10系统运行wps无响应的解决方案

热门文章

  1. CIDR合并Java_CIDR
  2. 超发的货币在不断地稀释货币应该体现的价值
  3. 有谁把强势放错了位置,用错了力道
  4. insight数据库丁香园简介
  5. thickbox问题
  6. LVS负载均衡调度原理及配置方法
  7. Jenkins admin 密码忘记解决
  8. 阿里巴巴面试题汇总(java方向) 带答案
  9. 从房产中介到程序员--80后张江男
  10. Billu_b0x 靶机