如何让Webots支持C#语言开发的控制器

        Webots支持C、C++、Java、Python、Matlab这五种语言开发控制器,没有直接支持C#,但有个同事已经用C#写了大量的机器人控制代码,想在不把C#代码改写成C++的情况下,直接用webots仿真,那就得想想办法。(不过,让ChatGPT帮忙把一种语言的代码转成另外一种语言的代码,还是挺方便的,准确率很高。)

        在Webots的安装路径下,找到lib\controller文件夹,里面有Controller.dll和Controller.lib文件,对于C#,我们只需要Controller.dll文件(C和C++的开发就需要Controller.lib文件),把这个dll文件复制到C#程序编译输出exe的文件夹里,通常是bin\x64\Debug\net8.0,(注意是跟输出的exe文件放在同一文件夹里,而不是跟C#的源代码放在同一文件夹里。既不需要,也不能在VS解决方案中添加对Controller.dll的引用,尝试添加它会报错。Controller.dll是64位的,所以C#程序也要编译成64位的。)
        Controller.dll实现了(或者说导出了)Webots\include\controller\c\webots文件夹中所有的头文件中声明的全部函数(共932个),比如最常用wb_robot_init(), wb_robot_step(),wb_motor_set_position(), wb_motor_set_velocity(), wb_motor_get_target_position(),肯定都有的。而cpp的函数其实都是在调用c的函数,看看\Webots\src\controller\cpp里面的cpp文件就明白了。如果你装了VS 2022,可以打开开始菜单中Visual Studio 2022文件夹里的随便点开一个 xxx Command Prompt for VS 2022, 输入

dumpbin /exports "E:\Program Files\Webots\lib\controller\Controller.dll"

就能看到所有的导出函数了。

        为了能使用Controller.dll,在C#的cs文件中,

using System.Runtime.InteropServices;

再去robot.h, motor.h等头文件中找你需要的函数的定义,然后在一个C#的class里面加入大量类似下面的语句

[DllImport("Controller.dll")]
public static extern void wb_robot_init();

看.h文件中的函数定义,一定会遇到WbDeviceTag,可以在Webots\include\controller\c\webots\types.h中找到对WbDeviceTag的定义:

typedef unsigned short WbDeviceTag;

对应到C#中就是ushort类型。遇到const char *,就换成string. 把需要用到的函数都经过上面的声明后,就能和在C语言中一样使用这些函数了。示例C#代码如下:

using System.Runtime.InteropServices;public class Program
{[DllImport("Controller.dll")]public static extern void wb_robot_init();[DllImport("Controller.dll")]public static extern void wb_robot_cleanup();[DllImport("Controller.dll")]public static extern void wb_robot_step(int duration);[DllImport("Controller.dll")]public static extern void wb_motor_set_position(ushort tag, double position);[DllImport("Controller.dll")]public static extern void wb_motor_set_velocity(ushort tag, double velocity);[DllImport("Controller.dll")]public static extern void wb_motor_get_target_position(ushort tag);[DllImport("Controller.dll")]public static extern ushort wb_robot_get_device(string name);public static void GetAllMotor(ref ushort[] motor){       motor[10] = wb_robot_get_device("TA_joint_01");motor[9] = wb_robot_get_device("TA_joint_02");motor[8] = wb_robot_get_device("TA_joint_03");motor[7] = wb_robot_get_device("TA_joint_04");motor[6] = wb_robot_get_device("TA_joint_05");}public static void Main(){   wb_robot_init();ushort[] motor = new ushort[11];GetAllMotor(ref motor);wb_motor_set_position(motor[10], Math.PI/2); wb_motor_set_position(motor[8], 3);   // 单位是弧度 wb_robot_step(500);wb_robot_cleanup();Console.ReadKey();}
}

启动C#程序后会看到如下报错,暂未发现有什么不良影响,还是能正常操作webots中的机器人。

Error: 找不到指定的模块。
 (dynamic library)
Error: failed to load E:/Program Files/Webots/resources/projects/plugins/robot_windows/generic/generic.dll library.

generic.dll的路径是正确的,然而即使把generic.dll跟Controller.dll放在一起,也无法解决这个报错。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/793638.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

字节新作:图像生成质量超越DiT

🌟每日更新最新高质量论文,关注我,时刻关注最新大模型进展。🌟 📌 元数据概览: 标题:Visual Autoregressive Modeling: Scalable Image Generation via Next-Scale Prediction作者&#xff1a…

Java 内存占用过高应该如何优化

优化Java程序的内存占用是提高程序性能和稳定性的重要任务之一。内存占用过高可能导致系统性能下降、内存泄漏、频繁的垃圾回收等问题,影响程序的运行效率和用户体验。因此,对于Java程序内存占用过高的情况,需要采取一系列措施进行优化。 1.…

算法设计与分析实验报告java实现(排序算法、三壶谜题、交替放置的碟子、带锁的门)

一、 实验目的 1.加深学生对算法设计方法的基本思想、基本步骤、基本方法的理解与掌握; 2.提高学生利用课堂所学知识解决实际问题的能力; 3.提高学生综合应用所学知识解决实际问题的能力。 二、实验任务 1、排序算法…

【随笔】Git 高级篇 -- 相对引用2(十三)

💌 所属专栏:【Git】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢迎大…

面向对象9

面向对象9 一.内部类 1、什么是内部类? 将一个类A定义在另一个类B里面,里面的那个类A就称为内部类(InnerClass),类B则称为外部类(OuterClass)。 2、为什么需要内部类? 具体来说…

操作系统八股|用户态和内核态

文章目录 内核态(Kernel Mode)用户态(User Mode)用户态和内核态之间的切换为什么要切换如何切换系统调用硬件中断异常处理 为了使操作系统内核提供⼀个⽆懈可击的进程抽象,处理器必须提供⼀种机制, 限制⼀个应⽤可以执⾏的指令以及他可以⽤来访问的地址…

4.4C++

1 #include <iostream> #include <cmath> using namespace std; class A{ private:int a;// 判断一个数是否为质数bool isP(int num) {if (num<2) return false;for (int i2;i<sqrt(num);i) {if (num % i 0) {return false;}}return true;} public:// 构造…

open-cd框架调试记录

源于论文Changer: Feature Interaction Is What You Need forChange Detection 源码位置&#xff1a;open-cd/README.md at main likyoo/open-cd (github.com) 同样是基于MMSegmentation框架的代码&#xff0c;不符合本人编程习惯所以一直也没有研究这东西&#xff0c;近期打…

Linux进程概念(二):进程的基本概念与进程的创建

目录 进程的基本概念 进程控制块-PCB 学前补充 预备知识 创建&#xff08;子&#xff09;进程 创建&#xff08;子&#xff09;进程的原因 理解fork有两个返回值 进程的基本概念 基本概念&#xff1a;程序的一个执行实例&#xff0c;正在执行的程序等 内核层面&#x…

R语言数据分析基础(四)- 引用其他文件中的函数

在R语言中&#xff0c;要引用其他文件中的函数&#xff0c;可以使用source()或load()函数。source()函数用于执行一个R脚本文件&#xff0c;而load()函数用于加载一个包含函数定义的R包。 使用source()函数引用其他文件中的函数&#xff1a; # 假设有一个名为my_functions.R的…

(源码+讲解+部署)基于Spring Boot和Vue的考研教育系统的设计与实现

前言 &#x1f497;博主介绍&#xff1a;✌专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅&#x1f447;&#x1f3fb; 2024年Java精品实战案例《128套》 &#x1f345;文末获取源码联系&#x1f345; &#x1f31f…

使用generator实现async函数

我们先来看一下async函数是怎么使用的 const getData (sec) > new Promise((resolve) > {setTimeout(() > resolve(sec * 2), sec * 1000);})// aim to get this asycnFun by generator async function asyncFun() {const data1 await getData(1);const data2 awa…

打造专业运营团队,武汉星起航引领全球跨境电商未来趋势

近年来&#xff0c;随着全球经济的不断发展&#xff0c;跨境电商作为国际贸易的一种新模式&#xff0c;已然成为推动全球经济增长的新引擎。在这个浩荡的潮流中&#xff0c;武汉星起航以亚马逊自营店铺为依托&#xff0c;凭借丰富的实战运营经验和专业的团队&#xff0c;正积极…

富格林:正规防卫虚假操作现象

富格林悉知&#xff0c;随着经济的快速增长&#xff0c;如今投资现货黄金的人也越来越多了。但是对于新手投资者来说&#xff0c;想要正确抵御虚假操作避免被骗现象就得掌握一定的正规技巧。而且在现货黄金市场中&#xff0c;掌握正规的交易技巧是获得稳定盈利的重要步骤之一。…

Spring Boot 介绍

1、SpringBoot 介绍 用通俗的话讲&#xff0c;SpringBoot 在Spring生态基础上发展而来&#xff0c;它的发现不是取代Spring&#xff0c;是为了让人们更容易使用Spring。 2、相关依赖关系 Spring IOC/AOP > Spring > Spring Boot > Spring Cloud 3、 SpringBoot工作原…

四信AI智能视频边缘分析盒+传感云平台,开启食品安全智慧监管新模式

方案背景 民以食为天&#xff0c;食品是人类生存必备的物质之一&#xff0c;食品生产安全关乎每个人的生命健康与社会可持续发展。在食品生产过程中&#xff0c;如何实现安全、健康生产是监管机构首要考虑因素&#xff0c;也是当今社会必须共同关注与努力的方向。 监管机构必…

Shell学习 - 2.24 Shell let命令:对整数进行数学运算

let 命令和双小括号 (( )) 的用法是类似的&#xff0c;它们都是用来对整数进行运算&#xff0c;读者已经学习了《Shell (())》&#xff0c;再学习 let 命令就相当简单了。 注意&#xff1a;和双小括号 (( )) 一样&#xff0c;let 命令也只能进行整数运算&#xff0c;不能对小数…

理想大模型实习面试题6道(答案解析)

节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学&#xff0c;针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 最大的感…

springboot如何给上传的图片加水印,java工具类分享

我写了一个摄影网站&#xff0c;但是不太希望其他用户窃取别人的图片&#xff0c;需要业务中有一个加水印的功能 /*** 图片文件上传*/Autowiredprivate StringRedisTemplate redisTemplate;PostMapping(value "/imageUpload", name "图片文件上传")publi…

离线 Linux 开发环境搭建

背景 无法连接外面的内网开发 通常需要打通如下&#xff1a; 虚拟机和网络模式VSCode 插件安装虚拟机软件安装 虚拟机和网络模式 虚拟机可以使用 Windows 自带的 Hyper-V 通常受限网络&#xff0c;网络模式更为复杂 Hyper-V 虚拟机有很多网络模式&#xff1a; 网络开机…