Tworzenie modeli symulacyjnych przez AI (ChatGPT, Microsoft Bing Copilot)


Automatyczne generowanie kodu dla skryptów programu Simultus DIGITAL TWIN z wykorzystaniem AI:

Teraz w prosty sposób możesz generować kod skryptów dla programu Simultus DIGITAL TWIN w swoich modelach symulacyjnych stosując sztuczną inteligencję (AI).

Jak to zrobić w skrócie:

- poproś AI o wygenerowanie kodu funkcji w języku programowania LUA
- skopiuj kod do sekcji 'global' w programie Simultus
- powiąż wejścia i wyjścia bloku z argumentami funkcji i jej wynikami

A oto szczegóły:


Język programowania LUA stosowany w programie Simultus jest 'znany' sztucznej inteligencji. Poniżej przedstawiono dwa przykłady wygenerowania kodu do bloku funkcyjnego LUA_SCRIPT przy pomocy Chata GPT i Copilota (wyszukiwarka Microsoft Bing) w wersjach darmowych wraz z ich dostosowaniem do współpracy z Simultusem.

Zarówno w jednym jak i drugim przypadku kod wymagał uzupełnienia o przypisanie wartości wejściowych i rezultatów obliczeń odpowiednio do wejść i wyjść bloku funkcyjnego LUA_SCRIPT.
Z kodu usunięto również niepotrzebną deklarację funkcji oraz linię zwracająca obliczoną wartość. Co zaznaczono i skomentowano w przykładach.

Aby połączyć wejścia bloku funkcyjnego ze zmiennymi w skrypcie powiązanym z danym blokiem funkcyjnym LUA_SCRIPT na początku skryptu należy dopisać dwie linie kodu:

-- utworzenie obiektu zapewniającego dostęp do we/wy bloku funkcyjnego LUA_SCRIPT:
Function_Block_Inputs = FBInTblHelper.new()
Function_Block_Outputs = FBOutTblHelper.new()


Odwołanie do konkretnego wejścia następuje poprzez jego nazwę i podanie w nawiasie kwadratowym numeru wejścia. Poniższy przykład pokazuje przypisanie wartości zmiennej Input_3_State do wyjścia nr 3 bloku funkcyjnego LUA_SCRIPT. takie przypisanie najlepiej zrobićna początku skryptu:

Input_3_State = Function_Block_Inputs[3]

Podobnie, odwołanie się do konkretnego wyjścia bloku funkcyjnego LUA_SCRIPT nastepuje poprzez podanie jego nazwy i numeru wyjścia w nawiasie kwadratowym. Poniższy przykład pokazuje powiązanie wyjścia nr 1 ze zmienną o nazwie Function_Result. Takie przypisanie najlepiej zrobić na końcu skryptu:

Function_Block_Outputs[1] = Function_Result

Przykład wykorzystania ChataGPT i Copilot do tworzenia funkcji w języku skryptowym LUA obliczającej odległość punktu o współrzędnych (px, py, pz) środka pudełka od prostej w 3D:



Oba chaty zdecydowały, że położenie prostej będzie zdefiniowane poprzez podanie współrzędnych dwóch punktów o współrzędnych (x1, y1, z1) oraz (x2, y2, z2), przez które przechodzi.

Wejścia bloku funkcyjnego LUA_SCRIPT zostały zdefiniowane w poniższy sposób:




Ustawienia nazw wejść i wyjść bloku oraz ich typu i liczby dokonuje się we właściwościach bloku funkcyjnego LUA_SCRIPT, po zaznaczeniu go na diagramie bloków funkcyjnych:



Na diagramie umieszczono dodatkowo blok funkcyjny 6DOF_SOLID podający aktualne współrzędne swobodnie poruszającej się bryły. W tym przypadku były to współrzędne środka pudełka BOX. Jak widac na diagramie wyniki obliczeń zostały przekopiowany do rejestru VR1 nazwanego TAG'iem 'Distance_GPT' oraz do rejestru VR2 nazwanego TAG'iem 'Distance_Copilot'.



Wyniki obliczeń można obserwować w okienku Status Monitor:


Kod funkcji obliczającej odległość punktu od prostej wygenerowano przy pomocy ChataGPT oraz Copilot'a w wyszukiwarce Microsoft Bing stosując proste zapytanie w języku polskim:

'
Napisz funkcję w języku LUA, która oblicza odległość punktu od prostej w 3D. '

Otrzymano odpowiedź od ChataGPT, w której znajdowała się treść funkcji i komentarz do niej:


Oto funkcja w języku Lua, która oblicza odległość punktu od prostej w przestrzeni trójwymiarowej:

function distancePointToLine3D(px, py, pz, x1, y1, z1, x2, y2, z2)
    -- Wektor kierunkowy prostej
    local dx, dy, dz = x2 - x1, y2 - y1, z2 - z1
    
    -- Wektor od punktu do punktu na prostej
    local vpx, vpy, vpz = px - x1, py - y1, pz - z1
    
    -- Iloczyn wektorowy wektorów (vpx, vpy, vpz) i (dx, dy, dz)
    local crossX = vpy * dz - vpz * dy
    local crossY = vpz * dx - vpx * dz
    local crossZ = vpx * dy - vpy * dx
    
    -- Długość wektora iloczynu wektorowego
    local crossLength = math.sqrt(crossX^2 + crossY^2 + crossZ^2)
    
    -- Długość wektora kierunkowego prostej
    local lineLength = math.sqrt(dx^2 + dy^2 + dz^2)
    
    -- Odległość punktu od prostej
    return crossLength / lineLength
end

Funkcja distancePointToLine3D oblicza odległość punktu (px, py, pz) od prostej przechodzącej przez punkty (x1, y1, z1) i (x2, y2, z2). Wykorzystuje iloczyn wektorowy do obliczenia pola równoległoboku utworzonego przez wektory, a następnie dzieli je przez długość wektora kierunkowego prostej, aby uzyskać wysokość, czyli odległość punktu od prostej.

Podobnie otrzymano kod funkcji z Copilot z wyszukiwarki Microsoft Bing również z komentarzami:

-- Funkcja oblicza odległość punktu P od prostej zdefiniowanej przez punkty A i B w 3D
function distancePointToLine3D_Copilot(P, A, B)
    -- Wektory PA i BA
    local PA = {P[1] - A[1], P[2] - A[2], P[3] - A[3]}
    local BA = {B[1] - A[1], B[2] - A[2], B[3] - A[3]}

    -- Iloczyn wektorowy PA i BA
    local crossProduct = {
        PA[2] * BA[3] - PA[3] * BA[2],
        PA[3] * BA[1] - PA[1] * BA[3],
        PA[1] * BA[2] - PA[2] * BA[1]
    }

    -- Długość wektora BA
    local BA_length = math.sqrt(BA[1]^2 + BA[2]^2 + BA[3]^2)

    -- Długość iloczynu wektorowego (czyli odległość między punktami)
    local crossProduct_length = math.sqrt(
        crossProduct[1]^2 + crossProduct[2]^2 + crossProduct[3]^2
    )

    -- Odległość punktu P od prostej
    local distance = crossProduct_length / BA_length

    return distance
end


-- Przykład użycia funkcji

local P = {1, 2, 3}
local A = {4, 5, 6}
local B = {7, 8, 9}
print("Odległość punktu P od prostej AB wynosi: " .. distancePointToLine3D(P, A, B))


Ta funkcja oblicza odległość punktu PP od prostej zdefiniowanej przez dwa punkty AA i BB w przestrzeni 3D. Mam nadzieję, że to pomoże! Czy mogę Ci jeszcze w czymś pomóc? ????


Treść funkcji bez żadnych zmian (oprócz dodania do ich nazw końcówek odpowiednio: '_GPT' oraz '_Copilot') umieszczono w sekcji global (zakładka: 'Scripts' -> '(Sim) global'):



Funkcje wykorzystano w skrypcie powiązanym z blokiem funkcyjnym LUA_SCRIPT (zakładka 'Script' -> 'distancePointToLine3D') stosując powyżej opisane przypisania wejść bloku funkcyjnego do zmiennych będących argumentami funkcji a wynik działania funkcji przypisano bezpośrednio do wyjść bloku funkcyjnego:



Podsumowanie:
Jak widać na powyższym przykładzie Chat_GPT oraz Microsoft Bing Copilot wygenerowały funkcje w inny sposób ale prawidłowo. Funkcje nie wymagają żadnych modyfikacji, aby wykorzystac je w programie Simultus DIGITAL TWIN i posiadały już odpowiednie i czytelne komentarze. Implementacja funkcji w programie Simultus wymagała jedynie powiązania ich z wejściami i wyjściami bloku funkcyjnego LUA_SCRIPT. Należy jednak pamiętać, że powyżej pokazano prosty przykład. Sztuczna inteligencja jest bardzo przydatna ale czasem bywa omylna i generowany przez nią kod może zawierać błędy. Każdy kod wygenerowany przez sztuczną inteligenncję należy sprawdzić przed zastosowaniem. Od wersji 5.0 programu Simultus DIGITA TWIN przypisanie wejść i wyjść bloku LUA_SCRIPT do zmiennych będzie jeszcze szybsze poprzez wykorzystanie dodatkowych przycisków BLOCK_IN oraz BLOCK_OUT, które automatycznie wstawią odpowiedni fragment kodu do skryptu.