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

v-rep插件

v-rep官网插件汉化教程

官网教程

插件是什么

插件本质上就是动态库文件。

linux是libsimXXXX.so;

其中XXXX是插件的名称。 请至少使用4个字符,并且不要使用下划线,因为该插件会被忽略(但是,当插件本身加载一些其他库(例如simExtXXXX_de.dll等语言资源)时,您应该使用下划线。)

插件是怎么生成的

就是动态库的生成过程。

插件是怎么加载到项目的

lua脚本方式加载过程

1,在lua文件中使用loadPlugin()加载插件(动态库文件);

loadPlugin返回映射对象,这个对象包含了插件中实现的变量和函数,通过这个映射对象可以访问插件提供的全局变量和函数。

linux下的simBubble插件:

2,require()函数加载并执行.lua文件,返回映射对象。

通过返回的映射对象调用插件实现的函数,实现相关功能。

function sysCall_thread()sim = require('sim')simBubble = require('simBubble')local jointHandles = {sim.getObject('./leftMotor'), sim.getObject('./rightMotor')}local sensorHandle = sim.getObject('./sensingNose')local robHandle = simBubble.create(jointHandles, sensorHandle, {0.5, 0.25})if robHandle >= 0 thensimBubble.start(robHandle) -- start the robotlocal st = sim.getSimulationTime()sim.wait(20) -- run for 20 secondssimBubble.stop(robHandle)simBubble.destroy(robHandle)end
end

require()函数

在 Lua 中,`require` 函数用于加载和执行指定的 Lua 模块文件或 C 模块。在使用 `require` 函数加载模块时,如果该模块尚未被加载,则 Lua 将查找该模块,加载并执行它。如果模块已经被加载,则 `require` 函数将不执行任何操作,直接返回该模块的引用。`require` 函数的调用形式如下:```lua
require(module)
```其中 `module` 参数表示需要加载的模块名称。如果文本字符串 `module` 符合 Lua 路径规范,那么 `require` 函数会按照以下规则在路径中查找模块:1. 如果 `module` 是一个 Lua 文件,`require` 函数会按照系统环境变量 `LUA_PATH` 和 `LUA_CPATH` 中设置的路径查找该文件;
2. 如果 `module` 是一个 C 模块,`require` 函数会按照系统环境变量 `LUA_CPATH` 中设置的路径查找该模块;
3. 用户还可以通过设置 `package.path` 和 `package.cpath` 全局变量来扩展 Lua 文件和 C 模块的搜索路径。使用 `require` 函数将模块加载到程序中可以提高 Lua 程序的可维护性和代码重用性。在某些情况下,为了避免反复加载 Lua 模块,可以使用 `package.loaded` 全局变量来维护模块的加载状态,以提高程序的性能和效率。

插件中4个函数的实现:

create:

// --------------------------------------------------------------------------------------
// simBubble.create
// --------------------------------------------------------------------------------------
//定义create函数的参数列表和参数类型
const int inArgs_CREATE[]={3,sim_script_arg_int32|sim_script_arg_table,2,sim_script_arg_int32,0,sim_script_arg_float|sim_script_arg_table,2,
};
//create函数的回调函数实现。
/*
在初始化阶段,插件加载 CoppeliaSim 库(以便访问所有 CoppeliaSim 的 API 函数),然后注册 4 个自定义脚本函数。通过指定函数名称(不带前缀/命名空间)和回调地址来注册自定义脚本函数。当脚本调用指定的函数名称(比如creat)时,CoppeliaSim 会调用对应的回调地址,执行回调地址对应的函数,就执行了这个函数。在 V-REP 中,当用户调用某个 Lua 函数时,V-REP 会自动查找相应的 C++ 回调函数并将其作为参数传递给这个 Lua 函数。这个回调函数即是实现 Lua 函数功能的关键。具体来说,在这段代码中,变量 `inArgs_CREATE` 定义了一个名为 `simBubble.create` 的 Lua 函数的输入参数类型。当用户调用 `simBubble.create` 函数时,V-REP 自动将用户的实际参数传递给与之对应的 C++ 回调函数,即 `LUA_CREATE_CALLBACK` 函数。
*/
void LUA_CREATE_CALLBACK(SScriptCallBack* cb)
{CScriptFunctionData D;int handle=-1;if (D.readDataFromStack(cb->stackID,inArgs_CREATE,inArgs_CREATE[0],nullptr)){std::vector<CScriptFunctionDataItem>* inData=D.getInDataPtr();sBubbleRob bubbleRob;handle=nextBubbleRobHandle++;bubbleRob.handle=handle;bubbleRob.scriptHandle=cb->scriptID;bubbleRob.motorHandles[0]=inData->at(0).int32Data[0];bubbleRob.motorHandles[1]=inData->at(0).int32Data[1];bubbleRob.sensorHandle=inData->at(1).int32Data[0];bubbleRob.backRelativeVelocities[0]=inData->at(2).floatData[0];bubbleRob.backRelativeVelocities[1]=inData->at(2).floatData[1];bubbleRob.run=false;allBubbleRobs.push_back(bubbleRob);}D.pushOutData(CScriptFunctionDataItem(handle));D.writeDataToStack(cb->stackID);
}

其他同理。

c++方式加载过程--c++自定义实现插件加载

插件具备的入口API

1,必须具备的三个

SIM_DLLEXPORT int simInit(SSimInit*);
SIM_DLLEXPORT void simCleanup();
SIM_DLLEXPORT void simMsg(SSimMsg*);

作用

2,其他的

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • AWS Elastic Beanstalk通过单实例配置https
  • 【STM32 CubeMX】adxl345加速度传感器
  • 面试经典150题 -- 链表 (总结)
  • EasyCaptcha,开源图形验证码新标杆!
  • 软件测试进阶自动化测试流程
  • 人工智能_普通服务器CPU_安装清华开源人工智能AI大模型ChatGlm-6B_001---人工智能工作笔记0096
  • Write operation failed: computed value is readonly问题解决
  • 【小沐学GIS】基于C++QT绘制三维数字地球Earth(OpenGL)
  • VMware还原Windows11 ghost镜像
  • 【leetcode】贪心算法介绍
  • Linux系统安全——iptables相关总结
  • LeetCode_20_简单_有效的括号
  • 个人简历补充
  • 【C++笔记】第一阶段:C++基础入门
  • 算法-矩阵置零
  • 收藏网友的 源程序下载网
  • 4. 路由到控制器 - Laravel从零开始教程
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • IDEA 插件开发入门教程
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • JavaScript设计模式系列一:工厂模式
  • js ES6 求数组的交集,并集,还有差集
  • vue-router的history模式发布配置
  • 阿里云购买磁盘后挂载
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 看域名解析域名安全对SEO的影响
  • 学习JavaScript数据结构与算法 — 树
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 阿里云服务器购买完整流程
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​如何在iOS手机上查看应用日志
  • #Datawhale AI夏令营第4期#AIGC方向 文生图 Task2
  • #Linux(Source Insight安装及工程建立)
  • #pragma 指令
  • (2)从源码角度聊聊Jetpack Navigator的工作流程
  • (BAT向)Java岗常问高频面试汇总:MyBatis 微服务 Spring 分布式 MySQL等(1)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第6节 (嵌套的Finally代码块)
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (六)Flink 窗口计算
  • (游戏设计草稿) 《外卖员模拟器》 (3D 科幻 角色扮演 开放世界 AI VR)
  • (转)iOS字体
  • (转)甲方乙方——赵民谈找工作
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .net中生成excel后调整宽度
  • .NET中使用Redis (二)
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题
  • @RunWith注解作用
  • [ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧
  • [ACM独立出版] 2024年虚拟现实、图像和信号处理国际学术会议(VRISP 2024,8月2日-4)
  • [C#]winform使用onnxruntime部署LYT-Net轻量级低光图像增强算法
  • [C#]调用本地摄像头录制视频并保存