如何入门webots机器人仿真神器 · 罗伯特祥 .
古月居 罗伯特祥 Webots建模指南2 - 机器人建模
我是. webots教程.
卡卡南安 Webots学习笔记—四轮小车的键盘控制
官方下载地址:https://github.com/cyberbotics/webots/releases
官方教程:https://cyberbotics.com/doc/guide/tutorials
webots 仿真 对于机械臂的支持不够好。
gezebo 建模:模型编辑器,编辑代码,加载urdf。仿真流程:场景建模->生成urdf并配置传感器->编写launch文件。关键就是 生成ufdf并配置传感器这一步。对于新手来说,很繁琐。模型库没有分类。物理引擎为ODE,Bullet,Simbody,DART物理引擎,默认为ODE。编写插件对使用者编程能力有要求。
webots: 建模通过节点实现。场景跟机器人保存在一个世界中,更符合人的思维习惯。对于多机器人的仿真,可以复制。不用配置launch。复杂模型可以通过三维建图之后导入,2020b之前,只能通过VRML97导入,2020b之后:支持多种3D格式(3ds,dae,fbx,stl,x3d,obj等)。仿真流程:场景/机器人/传感器建模–>编写控制器代码。三轴力矩传感器,建立三轴的旋转关节,关节工作在力矩为0的情况下。模型库有分类。物理引擎为改进的ODE。
但是下载下来很慢,我就用了古月居大佬的罗伯特祥的分享的链接,不过百度云下载太慢,我就把这个资源放到了 阿里云盘上,需要的可以自己下载。
webots 最新版本阿里云下载链接 提取码: yo74
内含 windows版本下的 2020a,2020b,2021a,2021b,2022a;和ubuntu amd64版本的2020a,2020b,2021a,2021b
docs:存放离线文档;include:控制器的头文件和库。lib:编程的库;projects:资源文件,模型文件资源库和例程。resources:软件的字体,图标语言之类的。
可以直接从窗口打开帮助文档。设置中文。
在preferences中,python command 可以直接填写到python可执行文件的绝对路径。
可以显示世界坐标系。
Alt+5:快速移动到指定模型;Shirt+滚轮:上下移动;Shirt+鼠标左键:平面移动;Shirt+鼠标右键:旋转物体。
1 向导->新建项目目录。四个可选项是:中心视角 添加背景 添加光源 添加长方形的地面。
2 使用流程:添加节点(crt+shirt+a)->Base nodes->Soild(直接添加shape没有物理属性)->在children选择添加->shape 形状。其中shape里:appearance PBRAppearance里主要是设置外观描述实体表面纹理,geometry Sphere用来具体指定实体形状:adius 表半径,subdivision表细分度设 数字越大球越圆,范围1-5。在appearance为球添加一个纹理图片,具体操作如下:appearance → texture → Base nodes → ImageTexture → url → 选择纹理图片路径,即可成功添加纹理。
3 物理属性里面Physics里面:density 密度,mass 重量,centerOfMass 质心位置,inertiaMatrix 惯性矩阵,damping 阻尼参数,因为在物体里,体积是固定的,所以 density和mass只能设置一个,另外一个必须指定参数为-1使其失效。boundingObject 表示碰撞边界,可以选择添加然后一步步添加,也可以 children下的Shape节点并复制,然后选中boundingObject直接粘贴实现。
4 如果有多个形状组成的文件,可以添加soild-> 在 chileren -> group的children ->Shape。之后在Group中添加Transform 接着在Transform的children中添加别的形状。
DEF-USE机制允许在一个地方定义一个节点,并在场景树在其他地方重复使用的定义。这对于避免在世界文件中重复相同的节点很有用。此外,它还允许用户同时修改多个对象。它是这样工作的:首先用DEF字符串标记节点。然后,可以使用USE关键字在其他地方重用此节点的副本。只能编辑DEF节点的字段,USE的字段从DEF节点继承,并且不能更改。此机制取决于world文件中节点的顺序。应在任何相应的USE节点之前定义DEF节点。
可以实现修改一个,使用该变量的地方会出现同时修改的作用。
重点就是 HingeJoint 节点
键盘操作的相关C语言函数
wb_keyboard_enable(TIME_STEP); :键盘使能
wb_keyboard_get_key():获得按下按键的int值
wb_keyboard_disable():键盘失能
在旋转关节HingeJoint中,HingeJointParameters用来设置关节的一些属性参数,device用来添加驱动电机、关节角度传感器以及刹车,endPoint用来对关节进行形状建模以及下一个串联关节的建模;
在设置HingeJoint的时候,注意要 jointParameters 的下的电机旋转轴axis和旋转中心 anchor 的参数。电机旋转轴axis是以父坐标系为参考系设置的。在程序运行结束后,一定要点击程序输入界面上面的齿轮,生成当前项目之后,程序才会生效。
还有就是 一定要设置 WorldInfo下的contactProperties节点,要不然差速的时候小车不会动。
#include <webots/robot.h>
#include <webots/motor.h>
#include <webots/keyboard.h>
#define TIME_STEP 64
int main(int argc, char **argv) {
wb_robot_init();
int i=0;
WbDeviceTag wheels[4];
wb_keyboard_enable(TIME_STEP);
char wheels_names[4][8]= {"motor1","motor2","motor3","motor4"};
for( i=0;i<4;i++){
wheels[i] = wb_robot_get_device(wheels_names[i]);
wb_motor_set_position(wheels[i],INFINITY);
}
double left_speed = 0.0;
double right_speed = 0.0;
while (wb_robot_step(TIME_STEP) != -1) {
wb_motor_set_velocity(wheels[0],left_speed);
wb_motor_set_velocity(wheels[1],right_speed);
wb_motor_set_velocity(wheels[2],left_speed);
wb_motor_set_velocity(wheels[3],right_speed);
int new_key = wb_keyboard_get_key();
while(new_key >0){
switch(new_key){
case 87: // w
left_speed = 6;
right_speed = 6;
break;
case 70: // f
left_speed = 0;
right_speed = 0;
break;
case 83: // s
left_speed = -6;
right_speed = -6;
break;
case 65: // a
left_speed = 1;
right_speed = 3;
break;
case 68: // d
left_speed = 3;
right_speed = 1;
break;
}
new_key = wb_keyboard_get_key();
}
};
wb_robot_cleanup();
return 0;
}
如果一切设置完成之后,发现轮子动,小车不动。一定要检查,车辆的物理属性有没有设置。一定要注意设置物理属性!!!
在项目下新建文件夹 protos 下新建 *.proto 文件
将原来的世界文件,以记事本形式打开
PROTO protoName [
protoFilelds // 对周边环境的定义
]
{
protoBody // 对机器人的代码
}