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 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.