Webots是一款开源的多平台机器人仿真软件,为机器人的建模、编程和仿真提供了完整的开发环境(具体有关Webots的功能请咨询度娘),总之就是一个很牛逼的仿真软件。
软件可以在官网上免费安装:http://www.cyberbotics.com/
或者这个网盘里有最新版Webots的安装包:https://pan.baidu.com/s/1z8sv032KUfKygL3iQxP02g 提取码:1dyc
现在网络上Webots相关的中文资料较少,但是Webots官方提供了非常齐全的用户手册和参考指南(可以在官网上找到),但是是全英的,阅读起来可能会有点吃力,建议大家可以善用网页翻译功能。这里给大家官方参考文档的pdf:https://pan.baidu.com/s/1-_seuT8FSkb5m-iBLgLwUg 提取码:hmew
官方给的User Guaid里面有入门教程tutorial,B站上也有几个入门教程视频,大家可以跟着学习一下。
点击导航栏的向导→新项目目录,然后一直点击下一步最后完成就行了,注意文件名尽量不要用中文。
然后我们就有这四个节点:
点击上方的+号
选择电机PROTO nodes→objects→floors然后自己选一个地板,我用的是UnevenTerrain,然后左边就会出现出现这个节点,设置地板的大小为5 0 5。
至此,背景的添加就完成了
这个可以调整视图:
鼠标右键可以平移,滚轮可以缩放,左键可以旋转。
还是点击那个+号,点击BASE nodes→Robots
设置Robots的translation为0 0.1 0(修改坐标原点位置)
在机器人变量模型中的children属性中添加一个Shape节点(在Base nodes里),并设置该shape节点的 appearance 属性(修改外观)和 geometry属性,其中geometry属性设置为box
设置box的长宽高为0.1×0.05×0.2
就出现一个这样的立方体
点击children下面的Shape,更改名字为body
在Shape下面找到这两个结点,分别添加它的碰撞属性和物理参数
至此车身就构建完成了,记得随手保存,点击运行,车身就会掉下来落到地面(如果车身掉下去不见了,就是碰撞属性没有设置好),再点击复位。
在之前的children下再添加一个HingeJoint节点
在jointParameters节点和device节点下添加铰链属性和电机
在endPoints属性中添加一个solid节点, 在solid下的children属性中添加一个Shape节点,设置外观和几何属性(几何属性为圆柱体 Cylinder),高度为0.02,半径为0.04。设置完以后更改Shape的名字为wheel,然后同样方法设置碰撞属性和物理系数
然后设置endPoint Solid节点下的translation和rotation,修改轮子的坐标和旋转角
在device中更改电机的名字为wheel1
至此,我们一个轮子就建成了
复制这个HingeJoint节点,复制三次,再更改一下坐标,就可以得到另外三个车轮(车轮2是车轮1对面那个,车轮3是车轮1旁边那个)。四个轮子的坐标分别为(0.06 0 0.06)、(-0.06 0 0.06)、(0.06 0 -0.05)、(-0.06 0 -0.05)这里注意其他三个轮子device下的名字要分别修改成wheel2,wheel3和wheel4,为了程序能够识别电机并控制
最后我们需要设置四个轮子的转轴在四个轮子的圆心处,在第一个HingeJoint下的jointParameters下修改anchor的值,让他处于第一个轮子的圆心位置处
同样的方法修改第二个轮子的anchor值为-0.06 0 0.06,第三个为0.06 0 -0.05,第四个为-0.06 0 -0.05。ctrl+F5可以查看旋转轴,为黑线
至此,我们的四轮小车的模型就搭建完毕了(记得保存)。此时,我们点击运行按钮,小车应该能稳稳的停在地面上
点击向导→新机器人控制器,选择C语言,选择Webots,文件名自己定,我这里是go_forward,点击完成。此时,右边会出现一个代码编辑区
输出下面这个代码
/*
* File: control.c
* Date:
* Description:
* Author:
* Modifications:
*/
/*
* You may need to add include files like or
* , etc.
*/
#include
#include
/*
* You may want to add macros here.
*/
#define TIME_STEP 64
/*
* This is the main program.
* The arguments of the main function can be specified by the
* "controllerArgs" field of the Robot node
*/
int main(int argc, char **argv) {
/* necessary to initialize webots stuff */
wb_robot_init();
/*
* You should declare here WbDeviceTag variables for storing
* robot devices like this:
* WbDeviceTag my_sensor = wb_robot_get_device("my_sensor");
* WbDeviceTag my_actuator = wb_robot_get_device("my_actuator");
*/
WbDeviceTag motors[4];
char motors_names[4][8] = {"wheel1", "wheel2", "wheel3", "wheel4"};
for (int i = 0; i < 4; i++) {
motors[i] = wb_robot_get_device(motors_names[i]);
wb_motor_set_position(motors[i], INFINITY);
wb_motor_set_velocity(motors[i],0);
}
/* main loop
* Perform simulation steps of TIME_STEP milliseconds
* and leave the loop when the simulation is over
*/
while (wb_robot_step(TIME_STEP) != -1) {
/*
* Read the sensors :
* Enter here functions to read sensor data, like:
* double val = wb_distance_sensor_get_value(my_sensor);
*/
double left_speed = 2.0;
double right_speed = 2.0;
/* Process sensor data here */
wb_motor_set_velocity(motors[0],left_speed);
wb_motor_set_velocity(motors[1],right_speed);
wb_motor_set_velocity(motors[2],left_speed);
wb_motor_set_velocity(motors[3],right_speed);
/*
* Enter here functions to send actuator commands, like:
* wb_motor_set_position(my_actuator, 10.0);
*/
};
/* Enter your cleanup code here */
/* This is necessary to cleanup webots resources */
wb_robot_cleanup();
return 0;
}
点击右上角的
完成编译(代码亲测没有错误,如果出错可能是电机名称设置有误),如果有错误则修改到没有错误为止。编译完成后弹出窗口点击reload→discard
在左边Robot节点下我们找到controller,选择我们写好的go_forward文件
点击运行,就会看到我们的小车开始往前行走,修改代码中的left_speed和right_speed的值可以改变小车的行进速度,最大不能超过10。至此,我们第一个项目到此就圆满完成啦!
这次我们学习了四轮小车的模型搭建和简单的控制,下次我将给大家介绍距离传感器并且实现小车的避障。
由于我也是刚刚入门Webots的小白,可能有一些地方写的不太准确,欢迎大佬批评指正。如果大家有什么不懂的也可以在评论区写下或者私聊我!