[Webots仿真]在Webots中创建一个两轮差速机器人

最近在折腾 webots 上的机器人仿真,发现想找到一个完整的中文教程真的很难。

本篇笔记创建了一个两轮的差速机器人,从零开始创建,到最后通过编写控制器对机器人进行控制。

本篇笔记参考 Youtube 上的一个 Youtuber Kajal Gada,并做了一点修改。

本篇笔记最终将完成一个如下的机器人模型。

1、创建新项目

打开 Webots 软件,在菜单栏点击 向导 ,选择 新项目目录

此时会弹出一个 创建 Webots 项目目录 的窗口。

点击 下一步 ,在目录选择里输入你的项目名称,然后 下一步,输入新世界的名称,记得要勾选 Add a rectangle arena,才能获得一个矩形的竞技场,点击 下一步完成

完成以上操作后,窗口上显示这样的界面。

2、添加一个机器人节点

3、创建机器人本体

1、添加Transform

鼠标右键点击节点列表 Robot "robot" ,在弹出的菜单窗口选择 新增

在弹出的 添加节点 窗口中选择 Base nodes ,展开菜单后拉到最底下,选择 Transform ,点击 添加

返回节点列表,单击刚才添加的 Transform,在下面的窗口 DEF 输入框中输入 Body ,定义该 Transform 的名称。

添加完成后节点列表如下图所示。

2、添加机器人本体外形

选中 Transform 节点的子节点 children ,右键,在弹出的菜单中选择 新增

在弹出的 添加节点 窗口中选择 Base nodes ,展开菜单后,选择 Shape ,点击 添加

1、添加外形参数

展开 Shape ,右键选择 geometry ,选择 新增

在弹出的窗口中,展开 Base nodes ,选择 Cylinder ,点击 添加

然后设置参数。其中,高度为 0.08, 半径为 0.045。

2、添加纹理

展开 Shape ,右键选择 appearance ,选择 新增

在弹出的窗口中,展开 Base nodes ,选择 PBRAppearance ,点击 添加

然后设置参数。

我设置的参数和最终机器人本体的结果如下图所示。

要注意的一点是,机器人外形刚创建时,其本体是有一半位于地板以下的,需要修改 translation 中的 z 轴的参数。这里机器人身高 0.08,所以设置参数为 0.04。

3、添加机器人边界对象

设置边界对象赋予机器人本体的碰撞性,使其成为一个有边界的实体。

返回节点列表,在 Robot "robot" 节点下,右键选择 boundingObject ,在弹出的窗口中,展开 USE ,选择刚才创建的 Body ,点击添加。

4、添加物理属性

返回节点列表,在 Robot "robot" 节点下,右键选择 physics ,在弹出的窗口中选择 Physics,点击添加。

至此,机器人本体创建完成。

接下来为机器人添加轮子。

4、创建机器人的轮子

轮子的部分包含了电机(motor),铰链(HingeJoint)。其中,本体连接铰链,铰链连接电机,电机连接轮子。

1、添加铰链

返回到节点列表。

在机器人的节点下,右键选择 children ,在弹出的菜单中选择 新增

弹出 添加节点窗口 ,展开 Base nodes ,添加 HingeJoint

定义该铰链为右轮。

选中刚才添加的铰链节点,在下边的 DEF 文本框中输入定义的名称,我这里使用 Wheel_Right

2、添加铰链连接参数节点

接下来需要添加铰链的连接参数。

返回机器人的节点列表。

展开刚才添加的铰链,右键 jointParameters ,在弹出的添加节点窗口中,选择 Base nodes 下的 HingeJointParameters ,选中添加。

3、添加电机

接下来为铰链添加电机。

展开铰链节点,右键选择 device ,选择 新增 ,在弹出的窗口中,选择 RotationalMotor ,添加。

Base nodes 下还有两个其他选项,分别是刹车片(Brake),位置传感器(PositionSensor)。

还得为轮子命名。这里命名很重要,后面对轮子电机的控制是根据获取这个名字的device。

展开 device 下的 RotationalMotor ,点击 name ,在下面的文本框中输入电机的名称。这里使用 motor_1

4、添加轮子本体

轮子安装在铰链的末端。因此,在铰链的展开菜单中, endPoint 就是轮子的节点。

右键 endPoint ,在弹出的窗口中选择 Solid ,然后添加。

展开 Solid ,在 children 中添加 Shape

展开添加的 Shape,有两个参数,一个是纹理参数(appearance),一个是几何参数(geometry)。

修改 ShapeDEF 名称为 Wheel

1、添加几何参数

右键 geometry,新增一个圆柱(Cylinder)。

轮子的参数设置如下。

铰链旋转轴:
	x = -1  (绕X轴旋转)
	y = 0
	z = 0
	
铰链位置:
	x = 0.045
	y = 0
	z = 0.0225
	
轮子圆心位置:
	x = 0.045
	y = 0
	z = 0.0225
	
轮子朝向:
	x = 0
	y = -1
	z = 0
	angle = 1.57  (转90°)

有几个参数需要注意:

  1. 铰链的参数
    1. axis 铰链的旋转轴,绕 x 轴,绕 y 轴,或者绕 z 轴;
    2. anchor 铰链的位置,也是轮子的旋转中心;
  2. 轮子本体的参数
    1. translation 轮子圆心的位置,与铰链的 anchor 必须完成一致,否则轮子就不是绕圆心旋转了;
    2. rotation 轮子旋转轴以及调整轮子的方向;

参数的设置取决于你的坐标系朝向。

点击菜单栏上的查看,可选显示,可以打开坐标系统显示。

可选显示里的 Show Joint Axes 可以查看铰链的方向。

2、添加边界对象和物理元素

选择 endPoint Solid ,右键 boundingObject,在弹出的窗口中,添加我们刚才创建的 Wheel(Shape)

然后再添加其物理属性。

到这边,一边的轮子就已经创建好了。

而左边的轮子只需要复制一下就OK了。

左轮的参数如下:

铰链旋转轴:
	x = -1  (绕X轴旋转)
	y = 0
	z = 0
	
铰链位置:
	x = 0.045
	y = 0
	z = 0.0225
	
轮子圆心位置:
	x = 0.045
	y = 0
	z = 0.0225
	
轮子朝向:
	x = 0
	y = -1
	z = 0
	angle = 1.57  (转90°)

记得还得修改电机的名称为 motor_2

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OSkkIXhn-1650182054583)(https://s2.loli.net/2022/04/17/X4aHjuhfsev8QtA.png)]

其实到这时候机器人已经可以使用了,只是很难知道哪个是正前方。

于是,我们就可以个机器人创造个正前方 – 给机器人添加眼睛和鼻子。

5、添加个眼睛

先加个眼睛。

返回机器人节点,在子节点处右键新增一个 Solid,并定义其为 Eye_Right

展开 Eye_Right Solid,在子节点处新增一个 Shape。设置其物理属性为 Box

右眼的参数设置如下。

复制出一个左眼的 Solid,并修改名字为 Eye_Left Solid

6、再加个鼻子

直接复制一个眼睛的节点,然后修改参数就行了。参数如下:

7、创建万向“轮”

为了轮子打了个引号呢?

因为这是个假轮子,不会转的。

加个假轮子垫着,以免机器跑起来会后仰。

简单起见,从眼睛的节点中复制处一份新的节点,改名字为 Dot_Front

重置几何参数,并添加一个球,设置半径为 0.0025。

修改位置:

x = 0
y = 0.04
z = 0

可以看见,在机器底部的前方有一个半球。

这时候还没有设置边界对象和物理属性,还是会掉入地板下。

右键点击 Dot_Front 的boundingObject ,新增一个 Sphere,并修改其半径跟Shape的半径一致即可。

从前万向轮节点中复制出后万向轮的节点,修改位置即可:

x = 0
y = -0.04
z = 0

好了,到此机器人已经创建完成了。

我们还需要写个简单的控制器验证一下能不能跑起来。

8、简单的测试

点击 向导 ,选择 新机器人控制器 ,控制语言选择 C 语言,编译器用 webots 自带的编译器。

在机器人节点下找到 controller, 选择刚才创建的控制器。

现在开始编写控制器。

代码如下:

/*
 * File:          my_controller.c
 * Date:
 * Description:
 * Author:
 * Modifications:
 */

/*
 * You may need to add include files like <webots/distance_sensor.h> or
 * <webots/motor.h>, etc.
 */
#include <webots/robot.h>

/*
 * You may want to add macros here.
 */
#define TIME_STEP     64
#define MAX_SPEED     (6.28f)	// 设置的最大速度

/*
 * 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 left_motor  = wb_robot_get_device("motor_2");	// 参数是铰链电机的名称
   WbDeviceTag right_motor = wb_robot_get_device("motor_1");	// 参数是铰链电机的名称
   
   wb_motor_set_position(left_motor,  INFINITY);				// 必要初始化,否则无法启动
   wb_motor_set_position(right_motor, INFINITY);				// 必要初始化,否则无法启动
   
   wb_motor_set_velocity(left_motor,  0.0f);
   wb_motor_set_velocity(right_motor, 0.0f);

  /* 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);
     */

    /* Process sensor data here */

    /*
     * Enter here functions to send actuator commands, like:
     * wb_motor_set_position(my_actuator, 10.0);
     */
     
     wb_motor_set_velocity(left_motor,  MAX_SPEED);  // 设置速度 rad/s
     wb_motor_set_velocity(right_motor, MAX_SPEED);  // 设置速度 rad/s
  };

  /* Enter your cleanup code here */

  /* This is necessary to cleanup webots resources */
  wb_robot_cleanup();

  return 0;
}

然后点击编辑器上方的齿轮,生成当前项目。

点击运行仿真,可以看到机器人跑了起来。

至此,机器人创建完成。

下一篇,我们将在机器人上添加一些传感器,并试着获取传感器的值。

如果你需要,点赞评论收藏告诉我,我将继续更新,包括通过 ROS 控制 Webots 上的机器人。

参考:How to design a 2 wheel differential drive robot in Webots? // Webots tutorial 2 // Kajal Gada - YouTube

  • 7
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值