function sysCall_init() 
    -- 初始化函数,当脚本被加载时执行
    motorLeft = sim.getObjectHandle('Pioneer_p3dx_leftMotor') -- 获取左电机的句柄
    motorRight = sim.getObjectHandle('Pioneer_p3dx_rightMotor') -- 获取右电机的句柄
    floorSensorHandles = {-1, -1, -1} -- 地面传感器句柄数组
    floorSensorHandles[1] = sim.getObjectHandle('l') -- 获取左地面传感器的句柄
    floorSensorHandles[2] = sim.getObjectHandle('m') -- 获取中央地面传感器的句柄
    floorSensorHandles[3] = sim.getObjectHandle('r') -- 获取右地面传感器的句柄
    v0 = 1 -- 初始速度
end

function sysCall_cleanup() 
    -- 清理函数,当脚本被卸载时执行
end 

function sysCall_actuation() 
    -- 执行函数,每个仿真步骤都会执行一次
    sensorReading = {false, false, false} -- 地面传感器读取结果数组
    for i = 1, 3, 1 do -- 循环读取3个地面传感器的数据
        res, data = sim.readVisionSensor(floorSensorHandles[i]) -- 读取传感器数据
        if (res >= 0) then -- 如果读取成功
            sensorReading[i] = (data[11] < 0.3) -- 将传感器读取结果存入数组中
        end
    end
    
    vLeft = v0 -- 左电机速度初始化
    vRight = v0 -- 右电机速度初始化
    
    if sensorReading[1] then -- 如果左地面传感器检测到障碍物
        vLeft = 0.03 * v0 -- 左电机速度减慢
        vRight = 5 * v0 -- 右电机速度加快
    end
    if sensorReading[3] then -- 如果右地面传感器检测到障碍物
        vLeft = 5 * v0 -- 左电机速度加快
        vRight = 0.03 * v0 -- 右电机速度减慢
    end
    
    sim.setJointTargetVelocity(motorLeft, vLeft) -- 设置左电机目标速度
    sim.setJointTargetVelocity(motorRight, vRight) -- 设置右电机目标速度
end

代码分析:

  • sysCall_init(): 初始化函数,获取电机和传感器的句柄,设置初始速度。
  • sysCall_cleanup(): 清理函数,在脚本卸载时执行,这里没有实际操作。
  • sysCall_actuation(): 执行函数,每一步仿真都会执行。读取传感器数据,根据传感器信息调整电机速度,实现避障。

Braitenberg 算法:

该代码使用了一种简单的 Braitenberg 算法来实现避障。算法的核心思想是:

  • 传感器读取的信息直接影响电机速度,距离障碍物越近,电机速度越慢。
  • 左右传感器分别控制左右电机,实现左右避障。

注意:

本代码只是简单的示例,可以根据实际需求进行修改和扩展,例如添加更多传感器、更复杂的避障策略等。


原文地址: https://www.cveoy.top/t/topic/f2k7 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录