Webots常用的执行器(Python版)

发布于:2024-04-14 ⋅ 阅读:(127) ⋅ 点赞:(0)

1. RotationalMotor

# -*- coding: utf-8 -*-
"""motor_controller controller."""

from controller import Robot

# 实例化机器人
robot = Robot()

# 获取基本仿真步长
timestep = int(robot.getBasicTimeStep())

# 关联设备
motor = robot.getMotor('my_Rmotor')

# 设置电机运行模式为速度模式
motor.setPosition(float('inf'))
motor.setVelocity(1)

# Main loop:
while robot.step(timestep) != -1:
    pass

2. LinearMotor

# -*- coding: utf-8 -*-
"""linear motor controller."""

from controller import Robot
import math


robot = Robot()
timestep = int(robot.getBasicTimeStep())

motor = robot.getMotor('my_lMotor')
#motor.setPosition(float('inf'))
#motor.setVelocity(0)

# Main loop:
count = 0
while robot.step(timestep) != -1:
    #motor.setVelocity(1)
    motor.setPosition(math.sin(count)*0.5)
    count += 0.1

3. Brake

  • setDampingConstant(dampingConstant)函数设置关节的阻尼常数(单位Ns/m或者Nms),如果JointParameters设置了阻尼常数,那么所产生的的dampingConstant系数是JointParameters中的dampingConstant与使用该函数所设置的dampingConstant的和。即:
    实际作用的 d a m p i n g C o n s t a n t = J o i n t 中的 d a m p i n g C o n s t a n t + F u n c t i o n 设置的 d a m p i n g C o n s t a n t 实际作用的dampingConstant = Joint中的dampingConstant + Function设置的dampingConstant 实际作用的dampingConstant=Joint中的dampingConstant+Function设置的dampingConstant
# -*- coding: utf-8 -*-
"""brake controller."""

from controller import Robot
from controller import Motor
from controller import Brake

robot = Robot()

timestep = int(robot.getBasicTimeStep())

motor = robot.getMotor('my_Rmotor')
#motor.enableTorqueFeedback(timestep)
brake = robot.getBrake('my_brake')

motor.setTorque(0)

# Main loop:
count = 0
while robot.step(timestep) != -1:
    count += 1
    print(count)
    #print("motor torque"+str(motor.getTorqueFeedback()))
    motor.setTorque(0.5)
    if count > 50:
        brake.setDampingConstant(1)
    if count >300:
        count = 0
        brake.setDampingConstant(0)

4. Propeller

在这里插入图片描述

  • 合成推力计算: T = t 1 ∗ ∣ o m e g a ∣ ∗ o m e g a − t 2 ∗ ∣ o m e g a ∣ ∗ V T = t1 * |omega| * omega - t2 * |omega| * V T=t1omegaomegat2omegaV
    其中thrustConstants中定义的两个常数为式中的t1和t2,omega为电机角速度,V是推力中心沿轴心线速度的分量。推力施加在centerOfThruse中指定的点上
  • 合成力矩计算: Q = q 1 ∗ ∣ o m e g a ∣ ∗ o m e g a − q 2 ∗ ∣ o m e g a ∣ ∗ V Q = q1 * |omega| * omega - q2 * |omega| * V Q=q1omegaomegaq2omegaV
    其中q1和q2为torqueConstants中定义的常数

以上公式计算来自:Thor I. Fossen的"Guidance and Control of Ocean Vehicles"和Raymond W. Prouty的"Helicopter Performance, Stability, and Control"

几个重要节点:

  • shaftAxis:定义沿其施加合力和扭矩的轴
  • centerOfThrust:定义推力的施加点
  • thrustConstants:定义推力计算公式中的两个常数,正旋与反旋只需将此字段中的数值设置为相反数。即正旋时,此字段数值为正,那么反旋则为此数值的负值即可
  • torqueConstants:定义转矩计算公式中的两个常数

thrustConstantstorqueConstants中的常数,在现实中,其数值由螺旋桨的倾角和方向决定

  • fastHelixThreshold:从slowHelix切换到fastHelix阀值,默认为24π rad/s
  • device:旋转电机放置的设备节点
  • fastHelixslowHelix:如果不为NULL,那么必须使用Solid节点设置这些属性;如果 ∣ o m e g a ∣ > f a s t H e l i x T h r e s h o l d |omega|>fastHelixThreshold omega>fastHelixThreshold,那么只有在fastHelix中定义的Solid是可见的,反之则只有在slowHelix中定义的Solid是可见的。

5. Pen

比较重要,通常用于显示机器人的移动轨迹,笔的绘制方向与节点-y向重合
几个重要节点:

  • inkColor:定义笔迹颜色,可通过函数定义/修改
  • inkDensity:定义颜色密度,在[0,1]之间
  • leadSize:定义笔迹宽度
  • maxDistance:定义笔与绘制表明之间最大距离,该值≤0表示绘制距离无限
  • write:使能笔的书写功能,可由函数控制
  • WorldInfo节点的inkEvaporation控制墨水消失的速度

遗憾的是,貌似只能在对象上绘制

6. LED

LED虽然在实际控制中没什么作用,但是通过LED的灯光显示我们可以传递一些信息,尤其是在实际机器人当中。

  • ① 颜色设置在LED节点下的color设置

  • LED.set(2)时,打开第二种颜色

    注意,设置的值不能超过color中设置的颜色种类

  • gradual节点定义LED节点的类型。若gradual=TRUEcolor列表为空,则为RGB LED,set()函数此时接收的值为十六进制RGB颜色值(即R8G8B8),例如红色为0xff0000gradual=FALSE,包含只有一种颜色,则为单色LED;包含多种颜色,则为多色LED;

"""LED_controller controller."""

from controller import Robot

robot = Robot()
timestep = int(robot.getBasicTimeStep())

LED = robot.getLED('my_led')

# Main loop:
count = 0
while robot.step(timestep) != -1:
    count += 1
    print(count)
    print("LED状态:" + str(LED.get()))
    if count > 20:
        LED.set(1)# 打开LED,强度255
    if count > 40:
        LED.set(0)# 关闭LED,强度0
        count = 0
# Main loop:
count = 0
while robot.step(timestep) != -1:
    count += 1
    print(count)
    print("LED状态:" + str(LED.get()))
    if count > 20:
        LED.set(0xff0000)
    if count > 40:
        LED.set(0x00ff00)
    if count > 60:
        LED.set(0)
        count = 0

如果gradual=TRUE,而color值又非空,那么通过十六进制设置灯光颜色时,LED会发处一个光团,且颜色为color列表的第一种
在这里插入图片描述


参考文献:


网站公告

今日签到

点亮在社区的每一天
去签到