2019 Spring 40623217 Personal Website

human and computer << Previous Next >> Object setting step

computer and computer

file download address : https://drive.google.com/file/d/1W2DXekXXTdaQqccRKhFuXDd1bJ4poh4D/view?usp=sharing

process explanation

以上圖所示:

sim.getOjectHandle ('  ') 是指處理物件的相關。

以上方所有圖示:

下方程式為 goal keeper 的部分

position_PR=sim.getObjectPosition(right_pole_r1,-1)
position_S=sim.getObjectPosition(Sphere_handle,-1)
X = position_S[1] - position_PR[1]
Y = position_S[2] - position_PR[2] 
if 1 then
    if X <= -0.05 then --goalkeeper
        sim.setJointTargetVelocity(right_joint_r1,-5)
    elseif X > -0.05 then
        sim.setJointTargetVelocity(right_joint_r1,5)
    end
    Y = Y*5
    sim.setJointTargetVelocity(right_slider_r1,Y)
end

桿子位置 = 模擬得到物件位置(處理的物件 , -1啟動)。

球的位置 = 模擬得到物件位置(處理的物件 , -1啟動)。

X = 球的位置 - 桿件的位置 (在X軸上)。

Y = 球的位置 - 桿件的位置 (在Y軸上)。

if (假設 1 = true) then (接著)

   [ if (假設X <= -0.05) 接著

        模擬設定軸的目標速度 ( 處理後的物件 , 速度大小(負號是指方向))

    elseif (額外假設 X > -0.05) 接著

        模擬設定軸的目標速度 (處理後的物件 , 速度大小)

    end (結束此迴圈) ]

    Y = 上方 Y軸的位置差  *  上5倍

    模擬設定軸的目標速度 (處理後的物件 , 為上方 Y 的追蹤速度)

end (結束迴圈)。

下方程式包刮 (guard midfield forward)的部分 

position_PR=sim.getObjectPosition(right_pole_r2,-1)
position_S=sim.getObjectPosition(Sphere_handle,-1)
X = position_S[1] - position_PR[1]
Y = position_S[2] - position_PR[2] + 0.1
Y2 = position_S[2] - position_PR[2] - 0.1
if X >= -1 then --goalkeeper
   if position_S[2] <= 0.1 then
        if X <= -0.05 then
            sim.setJointTargetVelocity(right_joint_r2,-5)
        elseif X > -0.05 then
            sim.setJointTargetVelocity(right_joint_r2,5)
        end
        Y = Y*5
        sim.setJointTargetVelocity(right_slider_r2,Y)
    elseif position_S[2] > 0.1 then
        if X <= -0.05 then
            sim.setJointTargetVelocity(right_joint_r2,-5)
        elseif X > -0.05 then
            sim.setJointTargetVelocity(right_joint_r2,5)
        end
        Y2 = Y2*5
        sim.setJointTargetVelocity(right_slider_r2,Y2)
    end
end

桿子位置 = 模擬得到物件位置(處理的物件 , -1啟動)。

球的位置 = 模擬得到物件位置(處理的物件 , -1啟動)。

X = 球的位置 - 桿件的位置 (在X軸上)。

Y = 球的位置 - 桿件的位置再+ 0.1(在Y軸上)。

Y2= 球的位置 - 桿件的位置再 - 0.1(在Y軸上)。

if (假設X>= -1  = true ) then (接著)

   { if (假設球在Y軸時 <= 0.1 = true) then (接著)

       [ if (假設X <= -0.05時 = true) then (接著)

            模擬設定軸的目標速度(處理後的物件 , 速度大小(負號為方向))

        elseif (額外假設X> -0.05時 = true ) then (接著)

            模擬設定軸的目標速度(處理後的物件 , 速度大小)

        end (結束此迴圈) ]

        Y = 上方Y在Y軸的位置差*5倍

        模擬設定的目標速度(處理後的物件 , Y的追蹤速度大小)

    elseif (額外假設求在Y軸上 > 0.1) then (接著)

       [ if (假設X <= -0.05時 = true) then (接著)

            模擬設定軸的目標速度(處理後的物件 , 速度大小(負號為方向))

        elseif (額外假設X> -0.05時 = true ) then (接著)

            模擬設定軸的目標速度(處理後的物件 , 速度大小)

        end (結束此迴圈) ]

        Y2 = 上方Y2 在Y軸位置差* 5倍

        模擬設定軸的目標速度(處理後的物間 , 上方 Y2 追蹤的速度大小)

    end (結束此迴圈) }

end(結束迴圈)。

守門員的程式與其他人的程式相差是在於,我設定的X軸跟Y軸的位置差所針對的部分是球的型心與桿子的型心所做的位置差,所以為了避免有空踢的可能性,所以必須在後衛、中場、前鋒上給予在Y軸上的彌補,其用意除了在空踢以外,還要避免當球員道極 限位置時要求另一個球員要去踢球,所以在第一大迴圈中給的X要>= -1是要求球員要在X軸為 1 的範圍內可以判定球的X軸在哪,第二個迴圈中,用球的Y軸 <=0.1時,要求Y的設定之人偶去追蹤球,額外的假設是當球的Y軸>0.1時,要求Y2的設定之人偶去追蹤球,第三迴圈,相對簡單,先告訴它假設 X < -0.05 時,要求欲踢狀態,額外假設X>-0.05 時,要求踢擊狀態,這是三層迴圈的內部定義。


human and computer << Previous Next >> Object setting step