文章目录

  • hello world
  • 读数传感器
  • Using Actuators使用执行器
  • “step”和“wb_robot_step”函数
  • 一起使用传感器和执行器
    • 传感器和执行器的完整示例。
  • 使用控制器参数
  • 控制器终止
  • 控制台输出
  • InertialUnit

hello world

from controller import Robotrobot = Robot()while robot.step(32) != -1:print("Hello World!")

在这个“Hello World!”中 例如,while循环的退出条件是函数的返回值wb_robot_step。-1当 Webots 终止控制器时,这个函数确实会返回(参见控制器终止)。

读数传感器

示例会不断更新并打印DistanceSensor返回的值:

from controller import Robot, DistanceSensorTIME_STEP = 32robot = Robot()sensor = robot.getDevice("my_distance_sensor")
sensor.enable(TIME_STEP)while robot.step(TIME_STEP) != -1:value = sensor.getValue()print("Sensor value is: ", value)
GPS.getValues()
Accelerometer.getValues()
Gyro.getValues()
values = gps.getValues()# OK, to read the values they should never be explicitly deleted by the controller code
print("MY_ROBOT is at position: %g %g %g" % (values[0], values[1], values[2]))

在使用设备之前,需要获取相应的设备标签(WbDeviceTag sensor);这是使用getDevice函数完成的。这WbDeviceTag是一种不透明类型,用于在控制器代码中标识设备。请注意,传递给此函数的字符串,在此示例中为“my_distance_sensor”,指的是机器人描述中指定的设备名称(“.wbt”或“.proto”文件)。如果机器人没有指定名称的设备,则此函数返回 0。

每个传感器必须先启用才能使用。如果未启用传感器,它将返回未定义的值。启用传感器是通过使用相应的wb_enable函数来实现的,其中星号 ( *) 代表传感器类型。每个wb_enable函数都允许以毫秒为单位指定更新延迟。更新延迟指定传感器数据的两次更新之间的所需间隔。

Using Actuators使用执行器

与传感器不同的是,执行器不需要明确启用。
示例显示了如何使旋转电机以 2 Hz 正弦信号振荡。

为了控制运动,通常将运动分解为与控制步骤相对应的离散步骤。和以前一样,这里使用了无限循环:在每次迭代中,根据正弦方程计算一个新的目标位置。该motor.setPosition函数存储相应旋转电机的新位置请求。请注意,该motor.setPosition功能会存储新位置,但不会立即启动电机。有效的驱动从下一行开始,在对robot.step函数的调用中。该robot.step函数将驱动命令发送到RotationalMotor但它不等待RotationalMotor完成运动(即到达指定的目标位置);它只是在指定的毫秒数内模拟电机的运动。

from controller import Robot, Motor
from math import pi, sinTIME_STEP = 32robot = Robot()
motor = robot.getDevice("my_motor")F = 2.0   # frequency 2 Hz
t = 0.0   # elapsed simulation timewhile robot.step(TIME_STEP) != -1:position = sin(t * 2.0 * pi * F)motor.setPosition(position)t += TIME_STEP / 1000.0

“step”和“wb_robot_step”函数

Webots 使用两个不同的时间步长:
模拟步骤(在场景树中指定WorldInfo.basicTimeStep:)
控制步骤(指定wb_robot_step为每个机器人的函数参数)

模拟步长是指定的值WorldInfo.basicTimeStep(以毫秒为单位)。它表示模拟一个步骤的持续时间,即每个模拟对象的位置、速度、碰撞等两次计算之间的时间间隔。如果模拟使用物理(相对于运动学),那么模拟步骤还指定需要应用于模拟刚体的力和扭矩的两次计算之间的间隔。
控制步骤是控制循环迭代的持续时间。它对应于传递给wb_robot_step函数的参数。该wb_robot_step函数将控制器时间提前指定的持续时间。它还根据控制器时间将传感器和执行器数据与模拟器同步。

==每个控制器都需要wb_robot_step定期调用该函数。==如果控制器不调用该wb_robot_step函数,则传感器和执行器将不会更新,模拟器将阻塞(仅在同步模式下)。因为需要定期调用,所以wb_robot_step函数调用通常放在控制器的主循环中。

模拟步骤的执行是原子操作:它不能被中断。因此,传感器测量或电机驱动只能在两个模拟步骤之间进行。因此,每个wb_robot_step函数调用指定的控制步骤必须是模拟步骤的倍数。因此,例如,如果模拟步长为 16 毫秒,则传递给wb_robot_step函数的控制步长参数可以是 16、32、64、128 等。

一起使用传感器和执行器

wb_robot_step每个控制器进程在函数调用期间与 Webots 进程交换传感器和执行器数据。例如,该wb_motor_set_position函数不会立即将数据发送给 Webot。相反,它将数据存储在本地,并在wb_robot_step调用函数时有效地发送数据。
下面两个例子,第一次调用wb_motor_set_position函数指定的值将被第二次调用覆盖:*

my_leg.setPosition(0.34) # BAD: ignored
my_leg.setPosition(0.56)
robot.step(40) # BAD: we don't test the return value of this function

由于在两个传感器读数之间没有调用该wb_robot_step函数,因此传感器返回的值在此期间不会发生变化。

while robot.step(40) != -1:d1 = sensor.getValue()d2 = sensor.getValue()if d2 > d1: # WRONG: d2 will always equal d1 hereavoidCollision()

通常推荐的方法是在主控制循环中调用单个wb_robot_step函数,并使用它同时更新所有传感器和执行器,如下所示:

while robot.step(40) != -1:readSensors()actuateMotors()

传感器和执行器的完整示例。

这里使用的机器人正在使用差速转向。它使用两个接近传感器 ( DistanceSensor ) 来检测障碍物。

from controller import Robot, Motor, DistanceSensorTIME_STEP = 32robot = Robot()left_sensor = robot.getDevice("left_sensor")
right_sensor = robot.getDevice("right_sensor")
left_sensor.enable(TIME_STEP)
right_sensor.enable(TIME_STEP)left_motor = robot.getDevice("left_motor")
right_motor = robot.getDevice("right_motor")
left_motor.setPosition(float('inf'))
right_motor.setPosition(float('inf'))
left_motor.setVelocity(0.0)
right_motor.setVelocity(0.0)while robot.step(TIME_STEP) != -1:# read sensorsleft_dist = left_sensor.getValue()right_dist = right_sensor.getValue()# compute behavior (user functions)left = compute_left_speed(left_dist, right_dist)right = compute_right_speed(left_dist, right_dist)# actuate wheel motorsleft_motor.setVelocity(left)right_motor.setVelocity(right)

使用控制器参数

在“.wbt”文件中,可以指定在控制器启动时传递给控制器​​的参数。它们在机器人controllerArgs节点的字段中指定,并作为函数的参数传递。

from controller import Robot
import sysrobot = Robot()for i in range(0, len(sys.argv)):print("argv[%i]=%s" % (i, sys.argv[i]))

如果控制器的名称是"demo",那么这个示例控制器代码:

argv[0]=demo
argv[1]=one
argv[2]=two
argv[3]=three

控制器终止

通常一个控制器进程在无限循环中运行,直到它被 Webbots 在以下事件之一中终止:

微博退出,
模拟被重置,
世界重新加载,
加载新的模拟,
控制器名称已更改(由场景树 GUI 中的用户或主管进程)。

控制器不能阻止自己的终止。当上述事件之一发生时,该wb_robot_step函数返回 -1。从这一点开始,Webots 将不再与控制器通信。因此,控制器执行的新打印语句stdout或stderr将不再出现在 Webots 控制台中。一秒钟后(实时),如果控制器没有自行终止,Webots 将杀死它(SIGKILL)。这给控制器留下了有限的时间来保存重要数据、关闭文件等,然后才真正被 Webbots 杀死。这是一个示例,显示了如何在即将终止之前保存数据:

from controller import Robot, DistanceSensorTIME_STEP = 32robot = Robot()sensor = robot.getDevice("my_distance_sensor")
sensor.enable(TIME_STEP)while robot.step(TIME_STEP) != -1:value = sensor.getValue()print("Sensor value is: ", value)# Webots triggered termination detected!
# Past this point, new print statements will no longer be displayed in the Webots consolesaveExperimentData()  # this shouldn't last longer than one second

在某些情况下,由控制器决定终止模拟。例如,在搜索和优化算法的情况下:搜索可能会在找到解决方案时或在固定数量的迭代(或世代)之后终止。

在这种情况下,控制器应该只保存实验结果并通过从main函数返回或调用exit函数退出。这将终止控制器进程并在当前模拟步骤中冻结模拟。物理模拟和参与模拟的每个机器人都将停止。

import sys# freeze the whole simulation
if finished:saveExperimentData()sys.exit(0)

控制台输出

InertialUnit

from controller import InertialUnitclass InertialUnit (Device):def enable(self, samplingPeriod):def disable(self):def getSamplingPeriod(self):def getRollPitchYaw(self):def getQuaternion(self):def getNoise(self):# ...

该函数返回InertialUnitwb_inertial_unit_get_roll_pitch_yaw的当前滚动、俯仰和偏航角。这些值作为 3 个组件的数组返回,因此只有索引 0、1 和 2 对访问返回的数组有效。请注意,索引 0、1 和 2 分别返回滚动角、俯仰角和偏航角。
滚动角表示单元围绕其 x 轴的旋转角度,区间为 [-π,π] 。当InertialUnit水平时,即当其 y 轴与重力方向相反时(WorldInfo定义坐标系) ,滚动角为零。

俯仰角表示单元绕z轴旋转的角度,区间为[-π/2,π/2] 。当InertialUnit水平时,即当其 y 轴与重力方向相反时,俯仰角为零。如果InertialUnit以标准方向放置在机器人上,则俯仰角在机器人下降时为负,在机器人上升时为正。

偏航角表示单位方向,在区间 [-π,π] 中,相对于WorldInfo。coordinateSystem. 当InertialUnit的 x 轴与北方向对齐时,偏航角为零,当设备向东时,偏航角为 π/2,当设备朝向西时,偏航角为 -π/2。偏航角可以用作指南针。

webots-Controller Programming相关推荐

  1. View Controller Programming Guide for iOS---(七)---Resizing the View Controller’s Views

    Resizing the View Controller's Views A view controller owns its own view and manages the view's cont ...

  2. 0306--iOS之阅读View Controller Programming Guide for iOS---(三)Presentations and Trasitions

    Presenting a View Controller                                                 --显示vc There are two wa ...

  3. webots学习笔记

    webots 笔记 第一天 Controller Programming 开始 #include <webots/xyz.h> 头文件表示Webots的一个节点. 代码也可以包含C语言的标 ...

  4. 打造轻量化的View Controller

    2019独角兽企业重金招聘Python工程师标准>>> 本文由破船译自objc 小引 很早以前就看到了这篇文章,该文是Lighter View Controllers中比较重要的一篇 ...

  5. View Programming Guide for iOS官方文档翻译一

    版权声明:本文为博主原创文章,转载请声明出处,谢谢! 本文档的官方英文原版地址 关于窗口和视图 在iOS中,您可以使用窗口(windows)和视图(views)在屏幕上显示APP的内容. 窗口(Win ...

  6. Spring Controller – Spring MVC控制器

    Spring Controller annotation is a specialization of @Component annotation. Spring Controller annotat ...

  7. 【机器人仿真Webots教程】-控制器编程指南

    Webots controller编程指南 文章目录 Webots controller编程指南 1. controller程序设计流程 1.1 controller与场景树节点 1.2 进程角度分析 ...

  8. Webots编程语言设置

    控制器启动 .wbt文件包含每个机器人需要启动的控制器的名称.控制器名称是平台和语言无关的字段:例如,当在.wbt文件中将控制器名称指定为" xyz_controller"时,则不 ...

  9. 在Windows环境下Webots与Ros的联合仿真

    系统环境:Win11专业版 21H2   WSL2+Ubuntu18.04+ROS melodic 软件版本:WebotsR2020a rev1 前言 工作原因需要在Windows环境下进行开发,而代 ...

  10. 官方文档链接(Core Graphics、View Controller、UICollectionView、UITableView、第三方库)

    Core Graphics Quartz 2D Programming Guide Core Graphics (Framework) Drawing(UIKit).Images and PDF(UI ...

最新文章

  1. 2021年机器学习什么风向?谷歌大神Quoc Le:把注意力放在MLP上
  2. 邱键2008年最幸运的选手
  3. Linux-编辑器vim与nano的使用
  4. 十二、爬了CSDN,我发现了这些
  5. [转]SSH反向连接及Autossh
  6. java例子:九九乘法表
  7. Mybatis—多表查询
  8. 我的第一个REST客户端程序!
  9. 阿里云消息队列Kafka商业化:支持消息无缝迁移到云上
  10. 虚拟化系列-VMware vSphere 5.1 虚拟机管理
  11. Ext JS 5的声明式事件监听
  12. 浪潮“151计划”:信息安全 没有“偏远地区”
  13. php面向对象代码_PHP 面向对象实现代码
  14. 2022年危险化学品经营单位安全管理人员报名考试及危险化学品经营单位安全管理人员复审模拟考试
  15. 计算机二级答题技巧口诀,计算机二级考试复习技巧:考场答题经验分享
  16. 神经网络(二)—— 神经元、Logistic回归模型
  17. 2020年创业风口:社交电商
  18. 光流传感器 定位精度_光流定位原理是什么??
  19. 傅里叶Fourier变换fft-python-scipy-幅值-辐角-相位(二)
  20. 翻转课堂在语文教学中的案例

热门文章

  1. C语言——字符串函数(必收藏)
  2. 在此页上的 ActiveX 控件和本页上的其它部份的交互可能不安全
  3. arm协处理器(CDP,LDC,STC,MCR,MRC)
  4. 水利行业相关规范的资料查阅网站
  5. .net core 视图文件乱码问题
  6. Word控件Spire.Doc 转换教程(十三):在word文档和HTML中嵌入图像支持
  7. node.js案例:抽出特定的文件
  8. 关于glDrawElements的使用
  9. C/C++实现球球大作战(高仿版),全源码分享带你轻松完成
  10. ARM基础教程 | ARM 和 x86 的区别