Webots常见传感器的使用(Python版)

1. GPS

from controller import Robot
from controller import GPS

robot = Robot()
timeStep = getBasicTimeStep()
gps = robot.getGPS("gps_name")
gps.enable(timeStep)
gps.disable()

# 获取当前GPS测量值,3D向量(3个浮点数列表),绝对位置
gps.getValues()

# 获取速度,单位m/s
gps.getSpeed()

  • WorldInfo节点中的gpsCoordinateSystem用于设置数据是在webots笛卡尔坐标系中表示此位置,还是使用经纬度表示此位置
  • WorldInfo节点中的gpsReference用于定义GPS的参考点

2. Camera

from controller import Robot
from controller import Camera

robot = Robot()
timeStep = getBasicTimeStep()
camera = robot.getCamera("Camera_name")
camera.enable(timeStep)
camera.disable()

camera.setFocalDistance(0.01) #设置焦距
camera.getWidth() #获取图像宽度
camera.getHeight() #获取图像高度

# 获取图像
cameraData = camera.getImage()
# 得到像素的灰度分量(5,10)及三通道值
gray = camera.imageGetGray(cameraData, camera.getWidth(), 5, 10)
r = camera.imageGetRed(cameraData,camera.getWidth(),5,10)
g = camera.imageGetGreen(cameraData,camera.getWidth(),5,10)
b = camera.imageGetBlue(cameraData,camera.getWidth(),5,10)

image = camera.getImageArray()
# 显示每个像素的组成部分
for x in range(0,camera.getWidth()):
  for y in range(0,camera.getHeight()):
    red   = image[x][y][0]
    green = image[x][y][1]
    blue  = image[x][y][2]
    gray  = (red + green + blue) / 3
    print 'r='+str(red)+' g='+str(green)+' b='+str(blue)

焦点设置,参考Focus节点

3. Accelerometer

加速度计单位:m/s^2

from controller import Robot
from controller import Accelerometer

robot = Robot()
timeStep = getBasicTimeStep()
acc = robot.getAccelerometer("Accelerometer_name")
acc.enable(timeStep)
acc.disable()
acc.getValues() #返回3D向量(python中返回三个浮点数列表)

注意,会受重力加速度影响,为了获取只由运动引起的加速度,必须减去这个偏移量。

4. Gyro

陀螺仪单位:rad/s

from controller import Robot
from controller import Gyro

robot = Robot()
timeStep = getBasicTimeStep()
gyro = robot.getGyro("Gyro_name")
gyro.enable(timeStep)
gyro.disable()
gyro.getValues()

5. InertialUnit

惯性测量单元用于测量RPY,如果测量加速度读或角速度需要使用Accelerometer和Gyro节点,InertialUnit的X轴必须同机器人前向相同,Z轴指向机器人右侧,Y轴指向机器人正上方,

在这里插入图片描述

from controller import Robot
from controller import InertialUnit

robot = Robot()
timeStep = getBasicTimeStep()
Inertial = robot.getInertialUnit("InertialUnit_name")
Inertial.enable(timeStep)
Inertial.disable()
Inertial.getRollPitchYaw() #获取RPY数据

注意:在万向节锁定情况下,即,当俯仰角为-π/ 2或π/ 2时,横滚和横摆设置为NaN

6. DistanceSensor

距离传感器,包括激光传感器、红外线传感器、声纳/超声波传感器,默认为通用距离传感器,可以指定以上三种类型,值的单位可通过查表自己通过映射关系设置,默认单位为m,但其返回值不是m的单位

from controller import Robot
from controller import DistanceSensor

robot = Robot()
timeStep = getBasicTimeStep()
dist = robot.getDistanceSensor("DistanceSensor_name")
dist.enable(timeStep)
dist.disable()
dist.getValue()

7. Compass

模拟数字罗盘(磁传感器),向量指向虚拟北方,虚拟北方由WorldInfo中的northDirection指定

from controller import Robot
from controller import Compass

robot = Robot()
timeStep = getBasicTimeStep()
Compass = robot.getCompass("Compass_name")
Compass.enable(timeStep)
Compass.disable()
Compass.getValues()

8. Lidar

激光雷达,单位m,参数较多,详细参照手册

from controller import Robot
from controller import LidarPoint
from controller import Lidar

robot = Robot()
timeStep = getBasicTimeStep()
Lidar = robot.getLidar("Lidar_name")
Lidar.enable(timeStep) #启动更新
Lidar.disable()

Lidar.enablePointCloud() #启动激光雷达点云更新
Lidar.disablePointCloud() #
Lidar.isPointCloudEnabled() #判断是否已经启动点云更新,是则返回true

Lidar.getRangeImage() # 读取激光雷达捕获的最后一个范围图像的内容,一维列表
Lidar.getRangeImageArray() #与上同,但返回的是二维列表

Lidar.getPointCloud() #获取点数组
Lidar.getNumberOfPoints() #获取总数

9. PositionSensor

单位为rad或m

from controller import Robot
from controller import PositionSensor

robot = Robot()
timeStep = getBasicTimeStep()
pos = robot.getPositionSensor("PositionSensor_name")
pos.enable(timeStep)
pos.disable()
pos.getValue()

10. Radar

用于模拟雷达传感器,用来测量其他固体距离、角度和相对速度

from controller import Robot
from controller import Radar

robot = Robot()
timeStep = getBasicTimeStep()
Radar = robot.getRadar("Radar_name")
Radar.enable(timeStep)
Radar.disable()
Radar.getNumberOfTargets() #获取当前目标数目

# 其他

11. RangeFinder

测距仪,深度相机那种

from controller import Robot
from controller import RangeFinder

robot = Robot()
timeStep = getBasicTimeStep()
RangeFinder = robot.getRangeFinder("RangeFinder_name")
RangeFinder.enable(timeStep)
RangeFinder.disable()
RangeFinder.getWidth()
RangeFinder.getHeight()

imageData = getRangeImage()
imageArray = getRangeImageArray()
RangeFinder.rangeImageGetDepth(imageData,RangeFinder.getWidth(),5,10)

12.TouchSensor

from controller import Robot
from controller import TouchSensor

robot = Robot()
timeStep = getBasicTimeStep()
TouchSensor = robot.getTouchSensor("TouchSensor_name")
TouchSensor.enable(timeStep)
TouchSensor.disable()
TouchSensor.getValues() #仅适用于force-3d的情况

注意,噪声和分辨率需要研究lookupTableresolution

13.Supervisor

这不是一个实体节点,也不是一个传感器,暂时把它归类到传感器中,我个人称其为“上帝节点”,它可以代替某些传感器,本质来说,它们是一种东西,唯一不同的是,这个“上帝”可以直接对环境进行操作。


参考文献:

评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值