From 83b233e2755c1161cf3e12a94b39a348bd9caf24 Mon Sep 17 00:00:00 2001 From: Sam Hos Date: Tue, 28 May 2024 15:16:04 +0200 Subject: [PATCH 1/7] dead code removal --- .../Movement-sensor-code.ino | 44 +++---------------- .../Movement-sensor-code/SensorManager.cpp | 14 +++--- 2 files changed, 14 insertions(+), 44 deletions(-) diff --git a/code/arduino/Movement-sensor-code/Movement-sensor-code.ino b/code/arduino/Movement-sensor-code/Movement-sensor-code.ino index 6253ccf..09894fe 100644 --- a/code/arduino/Movement-sensor-code/Movement-sensor-code.ino +++ b/code/arduino/Movement-sensor-code/Movement-sensor-code.ino @@ -5,56 +5,24 @@ void setup() { Serial.begin(9600); Serial.println("startup"); - + //connect to internet and start sensor connectivity.connectWiFi(ssid, pass); sensorManager.sensorSetup(); - //ws server address, port and URL - // webSocket.begin("145.28.160.108", 8001, ""); - // try every 500 again if connection has failed - // webSocket.setReconnectInterval(500); } void loop() { SensorManager::eulerAngles eulerRotation = sensorManager.getEulerAngles(); - // Subtract offset - // rotation.i -= offset.i; - // rotation.j -= offset.j; - // rotation.k -= offset.k; - // rotation.w -= offset.w; - - // Convert quaternion to Euler angles in radians - - - // Convert to degrees - // float rollDegrees = roll * 180.0f / PI; - // float pitchDegrees = pitch * 180.0f / PI; - // float yawDegrees = yaw * 180.0f / PI; - Serial.print(eulerRotation.roll); Serial.print(" "); Serial.print(eulerRotation.pitch); Serial.print(" "); Serial.print(eulerRotation.yaw); - sendData(eulerRotation.roll, eulerRotation.pitch, eulerRotation.yaw); - Serial.println(); - // webSocket.loop(); -} -// if (Serial.available()) { -// String command = Serial.readStringUntil('\n'); -// command.trim(); // remove any trailing whitespace -// if (command == "setZeroPoint") { -// setZeroPoint(); -// } -// } -// } -// void setZeroPoint() { -// offset = sensorManager.readLoop(); -// } -void sendData(float roll, float pitch, float yaw){ - String message = "{\"Sensor\": 1, \"roll\":\"" + String(roll) + "\",\"pitch\":\"" + String(pitch) + "\",\"yaw\":\"" + String(yaw) + "\"}"; - webSocket.sendTXT(message); -} \ No newline at end of file + String message = "{\"Sensor\": 1, \"roll\":\"" + String(eulerRotation.roll) + "\",\"pitch\":\"" + String(eulerRotation.pitch) + "\",\"yaw\":\"" + String(eulerRotation.yaw) + "\"}"; + int messageLength = message.length(); + Serial.println(message); + Serial.println(connectivity.httpPost("192.168.137.146", "/", 3445, message.c_str(), message.length(), "json")); +} diff --git a/code/arduino/Movement-sensor-code/SensorManager.cpp b/code/arduino/Movement-sensor-code/SensorManager.cpp index 50a0052..f9cae9d 100644 --- a/code/arduino/Movement-sensor-code/SensorManager.cpp +++ b/code/arduino/Movement-sensor-code/SensorManager.cpp @@ -15,20 +15,20 @@ void SensorManager::sensorSetup() { //start sensorfunction and start autocalibration //once calibration is enabled it attempts to every 5 min - Wire.setClock(400000); //Increase I2C data rate to 400kHz - myIMU.calibrateAll(); //Turn on cal for Accel, Gyro, and Mag + Wire.setClock(400000); + myIMU.calibrateAll(); myIMU.enableGyroIntegratedRotationVector(100); //send data every 100ms myIMU.enableMagnetometer(100); //Send data update every 100ms myIMU.saveCalibration(); //Saves the current dynamic calibration data (DCD) to memory myIMU.requestCalibrationStatus(); //Sends command to get the latest calibration status - + //Never seen this work in serial console if (myIMU.calibrationComplete() == true) { Serial.println("Calibration data successfully stored"); } Serial.println(F("magnetometer rotation enabled")); } - +//get sensordata SensorManager::RotationQuintillions SensorManager::getQuintillions() { if (myIMU.dataAvailable() == true) { float i = myIMU.getQuatI(); @@ -48,7 +48,7 @@ SensorManager::RotationQuintillions SensorManager::getQuintillions() { return rotation; } } - +//calculate Quintillions to Euler angles from -1π to +1π SensorManager::eulerAngles SensorManager::getEulerAngles() { SensorManager::RotationQuintillions rotation = getQuintillions(); float roll = atan2(2.0f * (rotation.w * rotation.i + rotation.j * rotation.k), 1.0f - 2.0f * (rotation.i * rotation.i + rotation.j * rotation.j)); @@ -56,4 +56,6 @@ SensorManager::eulerAngles SensorManager::getEulerAngles() { float yaw = atan2(2.0f * (rotation.w * rotation.k + rotation.i * rotation.j), 1.0f - 2.0f * (rotation.j * rotation.j + rotation.k * rotation.k)); eulerAngles EulerAngles = { roll, pitch, yaw }; return EulerAngles; -} \ No newline at end of file +} + +SensorManager::bool \ No newline at end of file From 1a56a054097b70443dbbe44e8145a48d150f349f Mon Sep 17 00:00:00 2001 From: Sam Hos Date: Tue, 28 May 2024 16:17:06 +0200 Subject: [PATCH 2/7] Junk cleanup and new json formatting --- .../Movement-sensor-code.ino | 29 ++++++++++++------- .../Movement-sensor-code/SensorManager.cpp | 19 +++++------- .../Movement-sensor-code/SensorManager.h | 8 ++++- 3 files changed, 34 insertions(+), 22 deletions(-) diff --git a/code/arduino/Movement-sensor-code/Movement-sensor-code.ino b/code/arduino/Movement-sensor-code/Movement-sensor-code.ino index 09894fe..be47405 100644 --- a/code/arduino/Movement-sensor-code/Movement-sensor-code.ino +++ b/code/arduino/Movement-sensor-code/Movement-sensor-code.ino @@ -13,16 +13,25 @@ void setup() { void loop() { SensorManager::eulerAngles eulerRotation = sensorManager.getEulerAngles(); + SensorManager::acceleration rotationAcceleration = sensorManager.getAcelleration(); + unsigned long lastTime = 0; // will store the last time the code was run - Serial.print(eulerRotation.roll); - Serial.print(" "); - Serial.print(eulerRotation.pitch); - Serial.print(" "); - Serial.print(eulerRotation.yaw); - Serial.println(); + Serial.print(eulerRotation.roll); + Serial.print(" "); + Serial.print(eulerRotation.yaw); + Serial.print(" "); + Serial.print(eulerRotation.pitch); + Serial.println(); - String message = "{\"Sensor\": 1, \"roll\":\"" + String(eulerRotation.roll) + "\",\"pitch\":\"" + String(eulerRotation.pitch) + "\",\"yaw\":\"" + String(eulerRotation.yaw) + "\"}"; - int messageLength = message.length(); - Serial.println(message); - Serial.println(connectivity.httpPost("192.168.137.146", "/", 3445, message.c_str(), message.length(), "json")); + unsigned long currentTime = millis(); + if (currentTime - lastTime >= 100) { // 100 ms has passed + String message = "{\"deviceId\": 1, \"rotationX\":\"" + String(eulerRotation.roll) + "\",\"rotationY\":\"" + String(eulerRotation.pitch) + "\",\"rotationZ\":\"" + String(eulerRotation.yaw) + "\",\"accelerationX\":\"" + String(rotationAcceleration.x) + "\",\"accelerationY\":\"" + String(rotationAcceleration.y) + "\",\"accelerationZ\":\"" + String(rotationAcceleration.z) + "\",\"type\":\"data\"}"; + Serial.println(connectivity.httpPost("192.168.137.146", "/", 3445, message.c_str(), message.length(), "json")); + Serial.println(message); + lastTime = currentTime; } +} +//acceleration.X +//acceleration.Y +//acceleration.Z + diff --git a/code/arduino/Movement-sensor-code/SensorManager.cpp b/code/arduino/Movement-sensor-code/SensorManager.cpp index f9cae9d..075e5ce 100644 --- a/code/arduino/Movement-sensor-code/SensorManager.cpp +++ b/code/arduino/Movement-sensor-code/SensorManager.cpp @@ -5,7 +5,6 @@ SensorManager::SensorManager() {} void SensorManager::sensorSetup() { - Wire.setClockStretchLimit(150000L); // Default stretch limit 150mS Wire.begin(); //wait for the sensor to start before continue if (myIMU.begin() == false) { @@ -16,16 +15,8 @@ void SensorManager::sensorSetup() { //once calibration is enabled it attempts to every 5 min Wire.setClock(400000); - myIMU.calibrateAll(); myIMU.enableGyroIntegratedRotationVector(100); //send data every 100ms - myIMU.enableMagnetometer(100); //Send data update every 100ms - myIMU.saveCalibration(); //Saves the current dynamic calibration data (DCD) to memory - myIMU.requestCalibrationStatus(); //Sends command to get the latest calibration status - //Never seen this work in serial console - if (myIMU.calibrationComplete() == true) { - Serial.println("Calibration data successfully stored"); - } - + myIMU.enableAccelerometer(100); //Send data update every 100ms Serial.println(F("magnetometer rotation enabled")); } //get sensordata @@ -57,5 +48,11 @@ SensorManager::eulerAngles SensorManager::getEulerAngles() { eulerAngles EulerAngles = { roll, pitch, yaw }; return EulerAngles; } +SensorManager::acceleration SensorManager::getAcelleration(){ + float x = myIMU.getAccelX(); + float y = myIMU.getAccelY(); + float z = myIMU.getAccelZ(); + acceleration Acceleration = { x, y, z }; -SensorManager::bool \ No newline at end of file + return Acceleration; +} \ No newline at end of file diff --git a/code/arduino/Movement-sensor-code/SensorManager.h b/code/arduino/Movement-sensor-code/SensorManager.h index 048ed7f..6a8a796 100644 --- a/code/arduino/Movement-sensor-code/SensorManager.h +++ b/code/arduino/Movement-sensor-code/SensorManager.h @@ -13,8 +13,14 @@ public: float pitch; float yaw; }; - eulerAngles getEulerAngles(); + struct acceleration { + float x; + float y; + float z; + }; + eulerAngles getEulerAngles(); + acceleration getAcelleration(); private: struct RotationQuintillions { From f1570aaea933cf36d83215580fbe503b8deeb4b9 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 28 May 2024 20:16:56 +0200 Subject: [PATCH 3/7] added part of research --- .../Onderzoeks verslag/betoog opdrachten.md | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/docs/personal-documentation/Niels/Onderzoeks verslag/betoog opdrachten.md b/docs/personal-documentation/Niels/Onderzoeks verslag/betoog opdrachten.md index d5771c1..6780845 100644 --- a/docs/personal-documentation/Niels/Onderzoeks verslag/betoog opdrachten.md +++ b/docs/personal-documentation/Niels/Onderzoeks verslag/betoog opdrachten.md @@ -67,25 +67,38 @@ https://www.ncbi.nlm.nih.gov/pmc/articles/PMC8936033/ # inleiding -De vergrijzing van de samenleving zet druk op de ouderenzorg. Er is een tekort aan zorgverleners, terwijl de vraag naar zorg toeneemt. Robotica wordt gezien als een mogelijke oplossing om dit probleem optelossen. Robots kunnen taken overnemen van verpleegsters, zoals medicatie toedienen, lichaamsverzorging en gezelschap bieden. Maar de inzet van robots in de ouderenzorg roept ook ethische dilemma's op. Ik ga onderzoeken welke etische dillemas er kunnen ontstaan in de zorg. Om dit doel te bereiken, zullen we de volgende deelvragen beantwoorden: +De vergrijzing van de samenleving zet druk op de ouderenzorg. Er is een tekort aan zorgverleners, terwijl de vraag naar zorg toeneemt. Robotica wordt gezien als een mogelijke oplossing om dit probleem optelossen. Robots kunnen taken overnemen van verpleegsters, zoals medicatie toedienen, lichaamsverzorging en gezelschap bieden. Maar de inzet van robots in de ouderenzorg roept ook ethische dilemma's op. In dit onderzoek wordt onderzocht welke etische dillemas er kunnen ontstaan in de zorg. Om dit doel te bereiken, zullen de volgende deelvragen beantwoord worden: - Wat zijn de mogelijke effecten van het gebruik van robots op het emotionele en sociale welzijn van ouderen? -- Leidt robotisering in de ouderenzorg tot onpersoonlijke en mechanische zorg? +- Welke voordelen zijn er bij gebruik van robots in de ouderezorg -- Welke risico's zijn er over de veiligheid en privacy voor ouderen bij het gebruik van robots in de zorg? +- Welke nadelen zijn er bij gebruik van robots in de ouderezorg Deze vragen behandelen allerei verschillende aspecten van robotica in de ouderzorg. na het beantwoorden van de deelvragen kunnen wij een concusie trekken en kijken naar welke dillemas er kunnen ontstaan. ## Wat zijn de mogelijke effecten van het gebruik van robots op het emotionele en sociale welzijn van ouderen? -Het sociale welzijn van ouderen is een belangrijk onderwerp. Ouderen kunnen zich vaak enzaam of afgesloten voelen van de samenleving. Dit is een groot probleem binnen in de ouderzorg omdat je niet wilt dat ouderen zich nog eenzamer gaan voelen nadat zij worden verzorgd door een robot. Daarom wil ik weten wat de effecten zijn van het gebruik van robotica in de ouderzorg, Zodat ik daaruit kan bepalen wat voor een dillema het met zich mee zou brengen. +Het sociale welzijn van ouderen is een belangrijk onderwerp. Ouderen kunnen zich vaak enzaam of afgesloten voelen van de samenleving. Dit is een groot probleem binnen in de ouderzorg omdat je niet wilt dat ouderen zich nog eenzamer gaan voelen nadat zij worden verzorgd door een robot. Daarom is het belangrijk om te weten wat de effecten zijn van het gebruik van robotica in de ouderzorg, Zodat er daaruit kan bepaalt worden wat voor dillema's het met zivh mee kan brengen. -Er zijn al veel onderzoeken geweest naar dit onderwerp. Onderzoek wijst uit dat robots zowel positieve als negatieve effecten kunnen hebben. Een postief effect ervan is dat ouderen zich minder eenzaam voelen. 17 onderzoeken met 4 verschillende type robots wijsen erop dat Uit de meeste onderzoeken bleek dat gezelschapsrobots een positieve invloed hadden op (socio)psychologische (bijv. humeur, eenzaamheid, sociale connecties en communicatie) en fysiologische (bijv. stressverlaging) variabelen. De methodologische kwaliteit van de studies was over het algemeen laag.[1] Dit laat zien dat het helpt om eenzaamheid bij ouderen tegentegaan. Ze kunnen ook worden gebruikt om ouderen te helpen in contact te blijven met vrienden en familie. Dit is handig iets omdat ouderen dan dichter bij hun familie zijn wat voor de meeste ouderen heel belangrijk is om eenzaamheid tegen te gaan. Bovendien kunnen robots worden gebruikt om ouderen te motiveren om actief en betrokken te blijven bij hun leven. Fitness is niet alleen iets om fit te blijven maar brengt ook socialen aspecten met zich mee. Ik ben nu persoonlijk bezig met een project waarmee wij ouderen willen stimuleren meer te bewegen zodat zij ook wat vaker naar buiten kunnen en potentieel ook samen workouts kunnen doen. +Er zijn al veel onderzoeken geweest naar dit onderwerp. Onderzoek wijst uit dat robots zowel positieve als negatieve effecten kunnen hebben. Een postief effect ervan is dat ouderen zich minder eenzaam voelen. 17 onderzoeken met 4 verschillende type robots wijsen erop dat uit de meeste onderzoeken bleek dat gezelschapsrobots een positieve invloed hadden op (socio)psychologische (bijv. humeur, eenzaamheid, sociale connecties en communicatie) en fysiologische (bijv. stressverlaging) variabelen. De methodologische kwaliteit van de studies was over het algemeen laag volgens [(Socially Assistive Robots in Elderly Care: A Systematic Review into Effects and Effectiveness, 2010)](https://www.sciencedirect.com/science/article/abs/pii/S1525861010003476) . Dit laat zien dat het helpt om eenzaamheid bij ouderen tegentegaan. Ze kunnen ook worden gebruikt om ouderen te helpen in contact te blijven met vrienden en familie. Dit is handig iets omdat ouderen dan dichter bij hun familie zijn wat voor de meeste ouderen heel belangrijk is om eenzaamheid tegen te gaan. Bovendien kunnen robots worden gebruikt om ouderen te motiveren om actief en betrokken te blijven bij hun leven. Fitness is niet alleen iets om fit te blijven maar brengt ook socialen aspecten met zich mee. Over het algemeen zijn de mogelijke effecten van robots op het emotionele en sociale welzijn van ouderen complex. Er zijn zowel mogelijke Voordelen en nadelen, en de impact van robots zal waarschijnlijk van persoon tot persoon verschillen. Het is belangrijk om deze factoren zorgvuldig af te wegen bij het beslissen of robots wel of niet in de ouderzorg te implementeren. -## Kan het gebruik van robots in de ouderenzorg leiden tot een gevoel van dehumanisering of verminderde menselijke interactie voor ouderen? +## Welke voordelen zijn er bij gebruik van robots in de ouderezorg + +Het gebruik van robots in de ouderenzorg kan meerdere voordelen met zich meebrengen. Robots kunnen in sommige aspecten beter zijn dan mensen. Het is belangrijk om er achter komen wat de voordelen zijn, zodat ik kan inzien wat de positieve kant is van het gebruik van robots. Daarnaast vallen er ook wat dillema's af omdat als er voordelen zijn dat er neit vaak een dillema aan hangt. + +Robots kunnen taken overnemen van zorgverleners, zoals het toedienen van medicijnen, het verzorgen van patiënten en het verplaatsen van patiënten. Hierdoor kunnen zorgverleners zich meer focussen op complexere zorgtaken die robots niet kunnen overnemen en meer tijd doorbrengen met ouderen. Dit heeft een positief effect op het bestrijden van de eenzaamheid van ouderen. Uit onderzoek blijkt dat 70% van de zorgverleners in verpleeghuizen gelooft dat robots hen kunnen helpen om de kwaliteit van zorg te verbeteren. [(Impacts of robot implementation on care personnel and clients in elderly-care institutions, 2019)](https://www.sciencedirect.com/science/article/pii/S1386505619300498) Het gebruik van robots zorgt dus ervoor dat de simpelere taken die vaak moeten gebeuren dat die geautomatiseerd worden. Daarnaast kunnen robots ook de hele dag en nacht door zorg bieden indien nodig. Dit zorgt ervoor dat er minder personeel nodig is voor nachtdiensten in de zorg. + +Dit is een groot voordeel van het gebruik van robots. De vermindering in de werkdruk in de zorg is fijn voor de hulpverleners en ook voor de ouderen. Als de zorgverleners meer tijd hebben voor de ouderen en de zwaardere taken kunnen de robots het lichte en simpele werk overnemen. + +## Welke nadelen zijn er bij gebruik van robots in de ouderezorg +Naast de voordelen zijn er ook nadelen bij het gebruik van robots in de ouderezorg. Deze nadelen zijn essentieel om te onderzoeken doordat er vaak dillemas aan nadelen hangen. Robots kunnen meerdere nadelen met zich mee brengen (Socially Assistive Robots in Elderly Care: A Systematic Review into Effects and Effectiveness https://www.sciencedirect.com/science/article/abs/pii/S1525861010003476)[1] + +(Impacts of robot implementation on care personnel and clients in elderly-care institutions https://www.sciencedirect.com/science/article/pii/S1386505619300498) + + From e4ee419e2dbc9e275d6386090080b97604fddc24 Mon Sep 17 00:00:00 2001 From: Niels Date: Tue, 28 May 2024 21:39:25 +0200 Subject: [PATCH 4/7] finished betoog --- .../Onderzoeks verslag/betoog opdrachten.md | 34 +++++++++++++------ 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/docs/personal-documentation/Niels/Onderzoeks verslag/betoog opdrachten.md b/docs/personal-documentation/Niels/Onderzoeks verslag/betoog opdrachten.md index 6780845..0a6ba87 100644 --- a/docs/personal-documentation/Niels/Onderzoeks verslag/betoog opdrachten.md +++ b/docs/personal-documentation/Niels/Onderzoeks verslag/betoog opdrachten.md @@ -67,38 +67,50 @@ https://www.ncbi.nlm.nih.gov/pmc/articles/PMC8936033/ # inleiding -De vergrijzing van de samenleving zet druk op de ouderenzorg. Er is een tekort aan zorgverleners, terwijl de vraag naar zorg toeneemt. Robotica wordt gezien als een mogelijke oplossing om dit probleem optelossen. Robots kunnen taken overnemen van verpleegsters, zoals medicatie toedienen, lichaamsverzorging en gezelschap bieden. Maar de inzet van robots in de ouderenzorg roept ook ethische dilemma's op. In dit onderzoek wordt onderzocht welke etische dillemas er kunnen ontstaan in de zorg. Om dit doel te bereiken, zullen de volgende deelvragen beantwoord worden: +De vergrijzing van de samenleving zet druk op de ouderenzorg. Er is een tekort aan zorgverleners, terwijl de vraag naar zorg toeneemt. Robotica wordt gezien als een mogelijke oplossing om dit probleem op te lossen. Robots kunnen taken overnemen van verpleegsters, zoals medicatie toedienen, lichaamsverzorging en gezelschap bieden. Maar de inzet van robots in de ouderenzorg roept ook ethische dilemma's op. In dit onderzoek wordt onderzocht welke ethische Dillema's er kunnen ontstaan in de zorg. Om dit doel te bereiken, zullen de volgende deelvragen beantwoord worden: - Wat zijn de mogelijke effecten van het gebruik van robots op het emotionele en sociale welzijn van ouderen? -- Welke voordelen zijn er bij gebruik van robots in de ouderezorg +- Welke voordelen zijn er bij gebruik van robots in de ouderenzorg -- Welke nadelen zijn er bij gebruik van robots in de ouderezorg +- Welke nadelen zijn er bij gebruik van robots in de ouderenzorg -Deze vragen behandelen allerei verschillende aspecten van robotica in de ouderzorg. na het beantwoorden van de deelvragen kunnen wij een concusie trekken en kijken naar welke dillemas er kunnen ontstaan. +Deze vragen behandelen verschillende aspecten van robotica in de ouderzorg. Na het beantwoorden van de deelvragen kunnen we een conclusie trekken en kijken naar welke dilemma's er kunnen ontstaan. ## Wat zijn de mogelijke effecten van het gebruik van robots op het emotionele en sociale welzijn van ouderen? -Het sociale welzijn van ouderen is een belangrijk onderwerp. Ouderen kunnen zich vaak enzaam of afgesloten voelen van de samenleving. Dit is een groot probleem binnen in de ouderzorg omdat je niet wilt dat ouderen zich nog eenzamer gaan voelen nadat zij worden verzorgd door een robot. Daarom is het belangrijk om te weten wat de effecten zijn van het gebruik van robotica in de ouderzorg, Zodat er daaruit kan bepaalt worden wat voor dillema's het met zivh mee kan brengen. +Het sociale welzijn van ouderen is een belangrijk onderwerp. Ouderen kunnen zich vaak eenzaam of afgesloten voelen van de samenleving. Dit is een groot probleem binnen in de ouderzorg omdat je niet wilt dat ouderen zich nog eenzamer gaan voelen nadat ze worden verzorgd door een robot. Daarom is het belangrijk om te weten wat de effecten zijn van het gebruik van robotica in de ouderzorg, zodat er daaruit kan bepaald worden wat voor dilemma's het met zich mee kan brengen. -Er zijn al veel onderzoeken geweest naar dit onderwerp. Onderzoek wijst uit dat robots zowel positieve als negatieve effecten kunnen hebben. Een postief effect ervan is dat ouderen zich minder eenzaam voelen. 17 onderzoeken met 4 verschillende type robots wijsen erop dat uit de meeste onderzoeken bleek dat gezelschapsrobots een positieve invloed hadden op (socio)psychologische (bijv. humeur, eenzaamheid, sociale connecties en communicatie) en fysiologische (bijv. stressverlaging) variabelen. De methodologische kwaliteit van de studies was over het algemeen laag volgens [(Socially Assistive Robots in Elderly Care: A Systematic Review into Effects and Effectiveness, 2010)](https://www.sciencedirect.com/science/article/abs/pii/S1525861010003476) . Dit laat zien dat het helpt om eenzaamheid bij ouderen tegentegaan. Ze kunnen ook worden gebruikt om ouderen te helpen in contact te blijven met vrienden en familie. Dit is handig iets omdat ouderen dan dichter bij hun familie zijn wat voor de meeste ouderen heel belangrijk is om eenzaamheid tegen te gaan. Bovendien kunnen robots worden gebruikt om ouderen te motiveren om actief en betrokken te blijven bij hun leven. Fitness is niet alleen iets om fit te blijven maar brengt ook socialen aspecten met zich mee. +Er zijn al veel onderzoeken geweest naar dit onderwerp. Onderzoek wijst uit dat robots zowel positieve als negatieve effecten kunnen hebben. Een positief effect ervan is dat ouderen zich minder eenzaam voelen. 17 onderzoeken met 4 verschillende type robots wijzen erop dat uit de meeste onderzoeken bleek dat gezelschapsrobots een positieve invloed hadden op (socio)psychologische (bijv. humeur, eenzaamheid, sociale connecties en communicatie) en fysiologische (bijv. stressverlaging) variabelen. De methodologische kwaliteit van de studies was over het algemeen laag volgens [(Socially Assistive Robots in Elderly Care: A Systematic Review into Effects and Effectiveness, 2010)](https://www.sciencedirect.com/science/article/abs/pii/S1525861010003476). Dit laat zien dat het helpt om eenzaamheid bij ouderen tegen te gaan. Ze kunnen ook worden gebruikt om ouderen te helpen in contact te blijven met vrienden en familie. Dit is handig iets omdat ouderen dan dichter bij hun familie zijn, wat voor de meeste ouderen heel belangrijk is om eenzaamheid tegen te gaan. Bovendien kunnen robots worden gebruikt om ouderen te motiveren om actief en betrokken te blijven bij hun leven. Fitness is niet alleen iets om fit te blijven, maar brengt ook sociale aspecten met zich mee. -Over het algemeen zijn de mogelijke effecten van robots op het emotionele en sociale welzijn van ouderen complex. Er zijn zowel mogelijke Voordelen en nadelen, en de impact van robots zal waarschijnlijk van persoon tot persoon verschillen. Het is belangrijk om deze factoren zorgvuldig af te wegen bij het beslissen of robots wel of niet in de ouderzorg te implementeren. +Over het algemeen zijn de mogelijke effecten van robots op het emotionele en sociale welzijn van ouderen complex. Er zijn zowel mogelijke Voordelen als nadelen, en de impact van robots zal waarschijnlijk van persoon tot persoon verschillen. Het is belangrijk om deze factoren zorgvuldig af te wegen bij het beslissen of robots wel of niet in de ouderzorg te implementeren. -## Welke voordelen zijn er bij gebruik van robots in de ouderezorg +## Welke voordelen zijn er bij gebruik van robots in de ouderenzorg -Het gebruik van robots in de ouderenzorg kan meerdere voordelen met zich meebrengen. Robots kunnen in sommige aspecten beter zijn dan mensen. Het is belangrijk om er achter komen wat de voordelen zijn, zodat ik kan inzien wat de positieve kant is van het gebruik van robots. Daarnaast vallen er ook wat dillema's af omdat als er voordelen zijn dat er neit vaak een dillema aan hangt. +Het gebruik van robots in de ouderenzorg kan meerdere voordelen met zich meebrengen. Robots kunnen in sommige aspecten beter zijn dan mensen. Het is belangrijk om er achter komen wat de voordelen zijn, zodat ik kan inzien wat de positieve kant is van het gebruik van robots. Daarnaast vallen er ook wat dilemma's af omdat als er voordelen zijn dat er niet vaak een dilemma aan hangt. Robots kunnen taken overnemen van zorgverleners, zoals het toedienen van medicijnen, het verzorgen van patiënten en het verplaatsen van patiënten. Hierdoor kunnen zorgverleners zich meer focussen op complexere zorgtaken die robots niet kunnen overnemen en meer tijd doorbrengen met ouderen. Dit heeft een positief effect op het bestrijden van de eenzaamheid van ouderen. Uit onderzoek blijkt dat 70% van de zorgverleners in verpleeghuizen gelooft dat robots hen kunnen helpen om de kwaliteit van zorg te verbeteren. [(Impacts of robot implementation on care personnel and clients in elderly-care institutions, 2019)](https://www.sciencedirect.com/science/article/pii/S1386505619300498) Het gebruik van robots zorgt dus ervoor dat de simpelere taken die vaak moeten gebeuren dat die geautomatiseerd worden. Daarnaast kunnen robots ook de hele dag en nacht door zorg bieden indien nodig. Dit zorgt ervoor dat er minder personeel nodig is voor nachtdiensten in de zorg. Dit is een groot voordeel van het gebruik van robots. De vermindering in de werkdruk in de zorg is fijn voor de hulpverleners en ook voor de ouderen. Als de zorgverleners meer tijd hebben voor de ouderen en de zwaardere taken kunnen de robots het lichte en simpele werk overnemen. -## Welke nadelen zijn er bij gebruik van robots in de ouderezorg -Naast de voordelen zijn er ook nadelen bij het gebruik van robots in de ouderezorg. Deze nadelen zijn essentieel om te onderzoeken doordat er vaak dillemas aan nadelen hangen. Robots kunnen meerdere nadelen met zich mee brengen +## Welke nadelen zijn er bij gebruik van robots in de ouderenzorg +Naast de voordelen zijn er ook nadelen bij het gebruik van robots in de ouderenzorg. Deze nadelen zijn essentieel om te onderzoeken, doordat er vaak dilemma's aan nadelen hangen. Robots kunnen meerdere nadelen met zich mee brengen. Deze nadelen kunnen in het ethische aspect vallen, maar ook daar buiten. + +Een nadeel dat zou kunnen vormen heeft te maken met privacy. Ouderen kunnen te maken krijgen met geheugen verlies. Dit kan leiden tot momenten dat ze niet meer weten wat ze zeggen of waar ze toestemming op geven. Een robot kan niet altijd de situatie begrijpen als een persoon te maken heeft met geheugen verlies. Dit zou een probleem kunnen zijn volgens [((The ethical issues of social assistive robotics: A critical literature review, 2021)](https://www.sciencedirect.com/science/article/pii/S0160791X21002013#bib40:~:text=3.1.1.%20Well,requiring%20ethical%20ponderation). Daarnaast slaan de robots constant data op zoals wat de gebruiker doet, waar ze naar toe gaan en met wie ze omgaan. De robots kunnen met deze informatie een profiel gaan maken per persoon met de data die ze verzamelen. Deze vormen een privacy problemen doordat het persoonlijke informatie kan zijn. Deze persoonlijke profielen kunnen worden verkocht voor commerciële doel einde of worden gelekt waardoor de persoonlijke informatie publiekelijk kan zijn. + +De nadelen van het gebruik van robots in de ouderenzorg is vooral gebonden aan privacy. Als de robots persoonlijke profielen kunnen aanmaken vormt dit een gevaar voor de privacy. Deze profielen kunnen voor meerdere doeleinde worden gebruikt die een gevaar kunnen vormen voor de ouderen. +# conclusie + +In dit onderzoek hebben we het gehad over het sociale welzijn van de ouderen en de voor- en nadelen van robots in de ouderen zorg. Het is belangrijk dat we voorzichtig doen met het implementeren van robots in de ouderenzorg doordat de behoeftes per persoon kunnen verschillen. We moeten goed blijven onderzoeken wat de behoeftes zijn van de ouderen omdat het belangrijk is dat ze zich niet slecht gaan voelen. De voordelen van de robots zijn dat we de druk van de zorgverleners af kunnen halen. Doordat de robots de simpele taken van de zorgverleners kunnen over nemen kan er extra tijd vrij komen om met de ouderen persoonlijke tijd door te brengen. Er zijn ook nadelen van het gebruik van robots, deze hangen vooral aan de privacy. Doordat de robots een profiel van de ouderen kunnen maken en deze kan worden misbruikt voor commerciële doel einde. + +Een dilemma die kan ontstaan gaat over Privacy en gegevens. Robots verzamelen constant data over ouderen en mensen met wie ze omgaan. Deze informatie kan gevoelig zijn over de gezondheid en het welzijn van die persoon. Ook zijn er dilemma's over de behoeftes van oudere. Is het wel ethisch verantwoordelijk om robots te gebruiken tegen de zin in van ouderen. Als de robots globaal worden ingezet kan het zo zijn dat niet iedereen er comfortabel mee is en dat men op zoek is naar menselijk contact. Voor verder onderzoek adviseer ik om te kijken naar hoe we gegevens kunnen beschermen en met welke gegevens ze comfortabel zijn te delen met de robot. Dit is essentieel om te weten om de privacy te beschermen van de ouderen. Doordat het een dilemma is moeten we kijken naar de oplossingen. (Socially Assistive Robots in Elderly Care: A Systematic Review into Effects and Effectiveness https://www.sciencedirect.com/science/article/abs/pii/S1525861010003476)[1] (Impacts of robot implementation on care personnel and clients in elderly-care institutions https://www.sciencedirect.com/science/article/pii/S1386505619300498) +(The ethical issues of social assistive robotics: A critical literature review https://www.sciencedirect.com/science/article/pii/S0160791X21002013) +https://www.sciencedirect.com/science/article/pii/S0160791X21002013#bib40:~:text=3.1.1.%20Well,requiring%20ethical%20ponderation + From d080f0af8dd353a819efe1a2931efff9aa5e01ce Mon Sep 17 00:00:00 2001 From: Luca Warmenhoven Date: Wed, 29 May 2024 12:17:33 +0200 Subject: [PATCH 5/7] Updated incoming_request_handlers.js to match database querying --- .idea/workspace.xml | 40 +++++++++++++++++++++++---- code/web/incoming_request_handlers.js | 21 ++++++++------ code/web/pepper_data_test.js | 24 ++++++++++++++++ 3 files changed, 71 insertions(+), 14 deletions(-) create mode 100644 code/web/pepper_data_test.js diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 691e0e6..4020532 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -14,7 +14,8 @@ - + + @@ -49,6 +50,7 @@ @@ -87,6 +89,7 @@ { "keyToString": { + "Node.js.pepper_data_test.js.executor": "Run", "git-widget-placeholder": "main", "node.js.detected.package.eslint": "true", "node.js.detected.package.tslint": "true", @@ -103,7 +106,7 @@ - + + + + + + + + + @@ -197,7 +208,9 @@ - + + + 1713528225837 @@ -355,7 +368,23 @@ - @@ -394,6 +423,7 @@ - \ No newline at end of file diff --git a/code/web/incoming_request_handlers.js b/code/web/incoming_request_handlers.js index 8289837..6049b3b 100644 --- a/code/web/incoming_request_handlers.js +++ b/code/web/incoming_request_handlers.js @@ -31,16 +31,19 @@ function handleIncoming(request, response, app, pool) else { // Send back the data in the right format - let firstRow = rows[0]; + let converted = rows.map(row => { + return { + name: row.Name, + description: row.Description, + muscleGroup: row.MuscleGroup, + imageUrl: row.ImageURL, + videoUrl: row.VideoURL + }; + }); + response .status(200) - .send(JSON.stringify({ - name: firstRow.Name, - description: firstRow.Description, - muscleGroup: firstRow.MuscleGroup, - imageUrl: firstRow.ImageURL, - videoUrl: firstRow.VideoURL - })); + .send(JSON.stringify(converted)); } }) .catch(error => { @@ -64,5 +67,5 @@ function handleIncoming(request, response, app, pool) // Export the function that registers the incoming request handlers module.exports = function(app, pool) { - app.get('/', (req, res) => handleIncoming(req, res, app, pool)); + app.post('/', (req, res) => handleIncoming(req, res, app, pool)); }; \ No newline at end of file diff --git a/code/web/pepper_data_test.js b/code/web/pepper_data_test.js new file mode 100644 index 0000000..674aa18 --- /dev/null +++ b/code/web/pepper_data_test.js @@ -0,0 +1,24 @@ +const address = 'http://145.92.8.135:3445/'; + +const data = { + rotationX: 1, + rotationY: .4, + rotationZ: .1, + accelerationX: 1, + accelerationY: 2, + accelerationZ: 4, + deviceId: 1, + type: 'data' +}; + +for ( let i = 0; i < 10; i++) +{ + setTimeout(() => { + console.log("Sending data"); + fetch(address, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(data) + }); + }, i * 1000); +} \ No newline at end of file From c362a41f06214de28c010ec9edb3c1aa7a204054 Mon Sep 17 00:00:00 2001 From: SebasKoedam Date: Wed, 29 May 2024 13:04:57 +0200 Subject: [PATCH 6/7] added infrastructure documentation --- docs/documentation/database/infrastructure.md | 54 ++++-- .../diagrams/.$appDiagram.drawio.bkp | 169 +++++++----------- docs/documentation/diagrams/appDiagram.drawio | 70 ++++---- .../diagrams/assets/.$appDiagramV4.png.bkp | Bin 0 -> 27916 bytes .../diagrams/assets/appDiagramV4.png | Bin 0 -> 27916 bytes 5 files changed, 142 insertions(+), 151 deletions(-) create mode 100644 docs/documentation/diagrams/assets/.$appDiagramV4.png.bkp create mode 100644 docs/documentation/diagrams/assets/appDiagramV4.png diff --git a/docs/documentation/database/infrastructure.md b/docs/documentation/database/infrastructure.md index fc83b22..1b6cbea 100644 --- a/docs/documentation/database/infrastructure.md +++ b/docs/documentation/database/infrastructure.md @@ -1,19 +1,45 @@ # Infrastructure -The infrastructure of the database is composed of the following components: +This document describes the infrastructure of the database and server components of the project. -- User -- Pepper - - Interface - - Robot -- Raspberry Pi - - Database - - MariaDB - - Server - - Apache - - phpMyAdmin - - Node.js +## Components -User interacts with Pepper through the interface. The interface sends the user input to the robot. The robot processes the input (java) and sends the output (xml) back to the interface. The interface displays the output to the user. The Raspberry Pi hosts the server and database. The database stores the data and the server hosts the website. The server runs Apache, phpMyAdmin, and Node.js. The interface makes a request to the server (HTTP GET) to retrieve the data in the database. The server processes the request (HTTP GET) and retrieves (SQL) the data from the database. The interface displays the data to the user. +The database component of the project consists of the following components: + +- Node.js (Server) +- Apache2 (Web Server) +- phpMyAdmin (Database Management Tool) +- MariaDB (Database) + +## Diagrams + +Architecture application diagram of the project. + +![Architecture application](../diagrams/assets/appDiagramV2.png) + +Deyplomment application diagram of the project. + +![Deyplomment application](../diagrams/assets/appDiagramV4.png) + +## Database + +The database component of the project is responsible for storing and managing the data used by the application. The database is implemented using MariaDB. The database is responsible for storing data such as exercises, names, descriptions, images, videos and exercise paths. The database is accessed by the server component of the project to retrieve data. + +## Server + +The server components of the project are responsible for handling requests from the client application and interacting with the database. The server is implemented using Node.js and is responsible for handling requests to retrieve exercises. The server is also responsible for serving the client application to the user. + +The web server component of the project is implemented using Apache2 and is responsible for hosting phpMyAdmin, a database management tool used to interact with the database. + +## Problems/Solutions + +During the setup of the infrastructure, the following problems were encountered. + +### Reverse proxy + +The initial problem is that the Pi has a limeted amount of ports that can be used. This means that the server can only be accessed through port 80. This is a problem because the server is running on port 3000. To solve this problem, a reverse proxy was used to redirect traffic from port 80 to port 3000. This was done by creating a virtual host in the Apache2 configuration file that listens on port 80 and redirects traffic to port 3000. + +When implementing the reverse proxy a problem was encountered where everything on port 80 was being redirected to port 3000. This was a problem because the server was also running on port 80. The initial solution was to remove the reverse proxy from sites-enabled and restart the server. However this caused the reverse proxy to stop working. Eventually it took too long to fix the problem and the reverse proxy was removed. + +Running the server on port 443 was also considered as a solution. At the first sight this dind't seem possible since the access to port 443 is restricted. However, after some research it was found that it is possible to run the server on port 443 by starting the node with sudo. This was the solution that was chosen. -![Application Architecture Diagram](../diagrams/assets/appDiagram.png) \ No newline at end of file diff --git a/docs/documentation/diagrams/.$appDiagram.drawio.bkp b/docs/documentation/diagrams/.$appDiagram.drawio.bkp index 31a34c1..1d420ac 100644 --- a/docs/documentation/diagrams/.$appDiagram.drawio.bkp +++ b/docs/documentation/diagrams/.$appDiagram.drawio.bkp @@ -1,140 +1,99 @@ - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - - - - - + - - + + - - + + - - + + - - + + - - + + - - + + - - - - - - - - - - - - - + - - - - - + + - + + + + + + + + + + + + + + + + - - - - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/documentation/diagrams/appDiagram.drawio b/docs/documentation/diagrams/appDiagram.drawio index 1d420ac..7114ed8 100644 --- a/docs/documentation/diagrams/appDiagram.drawio +++ b/docs/documentation/diagrams/appDiagram.drawio @@ -1,99 +1,105 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + - + - + - + - + - + - + - - + + - + - + - + - - + + - + + + + diff --git a/docs/documentation/diagrams/assets/.$appDiagramV4.png.bkp b/docs/documentation/diagrams/assets/.$appDiagramV4.png.bkp new file mode 100644 index 0000000000000000000000000000000000000000..c46a0d1b7da1a52f64cb712e6a7e0fe857e7a92d GIT binary patch literal 27916 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 Gss8{iIeI1l literal 0 HcmV?d00001 diff --git a/docs/documentation/diagrams/assets/appDiagramV4.png b/docs/documentation/diagrams/assets/appDiagramV4.png new file mode 100644 index 0000000000000000000000000000000000000000..b432d5204605fa3b30887fc41b740ea577b82011 GIT binary patch literal 27916 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%0AeQAs?JO6H-2<3+9NdgFu1Ou?$ZN539;(? zWoiRlW}>U!)=!I+BinCwl{k1QN6k!6>=a9&B_C!Xjc&oICpv{fU}GNlkiWa zvKujnz;UnTp7X}O$0nW_$L&?GL4F=ieZ6fULf55FBMxfeHbhfR1l%&P3ImrTP?(SM*802gHkZ=dqefsQMs69lkw?j2k-_0bb3S zFmtQ!e@64c^93VJzrDHr+Pj&?`CQjNShEME`yq>Eo;8SQL z9S`R9>W_<92_iMv&WSvkM<#PMVbg=xbTj(F8kY6PFGL*9-dSXI8U)x;nzV|m25^_MSasQTng51&WaB^(5tDEVH7%+cmJNIO1p;# z#gI{u1tNthEci246iZwz(011kqA3MrW(y=2CrMm|$E_Z8MX0R2BA4{IOC>%0q-BAF zF&m%jSXAT$gPu#rCs10n5gUz8%9K*UpnPGdB8-^;zYv64;Or(weA{`_#D74k#Vw$^E=o@ zpB<=sdGgi$>Mdi)qmnBA@@@BJAZ&l14uql{_=#_fx*hNn6!hU~yep!t@@>ne93hTH_^DmrH3|GE`m_-mJH zXblk`-|o42&-HJWXKYRSFThTiFa<%MR>*;vV2g?gNx#M3hTY=vNc&ZMDh%|9r|fFX zORz^bIx_l87cCN@qu&vb<+6(eRwmCdg5qviE0;nGdT^EyG|BeoOUWBDvX73*hCPNS z=XF@TQ@WrEi=eq&_walYkT%TG!MEq#%oHimvV~FOwIb5{RwO%@+j}C1DU5ATPXNfiOJ13&{|{VL={{ z^X%v7W9$KhUb{SVrZJJa{&K`wc|GU`XS_WW`^Bj$zJ}!~@&9B1kQES=QZ5^C6Z@EkQIR)2*;DzPN zg*OJFwNHqg3E5^ffZ%Iis>&>UnE-4g-;0{JVP9{B&FQmOZQa7_unc_{tM7!@|K5EN zQJ8`yD|ln2_Yb`c9%=-aBR*PH9J={8)dl@w0f=*9Sl^*@=)MOmQjY*GRtTE_q!qvJ zy&h0U`2B@I#BEWGqP821Jmgb{!F+!@fxz~h{Hq9>YC%71Ek&{ys*j>K!6w>MNZ#Q9 z!DQO9^0ekBVlOzUJWs(B^Py*EtuiyeK?cu!`p1jcx&c@W{8&QoSio9zF2Ck6DB(am zGvt154@bLV1r0A+Z#(@PVI{_Q*Onia2+jAf88hs5y{ip5UEP_8)=06cjO@BG{ EAF29!761SM literal 0 HcmV?d00001 From d6fc5098dda965f4f3ffb3ee6ab0a80351746dd7 Mon Sep 17 00:00:00 2001 From: SebasKoedam Date: Wed, 29 May 2024 13:06:55 +0200 Subject: [PATCH 7/7] Update database host to use IP address instead of localhost --- code/web/server.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/web/server.js b/code/web/server.js index 90b9f9f..886846e 100644 --- a/code/web/server.js +++ b/code/web/server.js @@ -7,7 +7,7 @@ app.use(bodyParser.json()); const serverPort = 3000; const databaseCredentials = { - host: 'localhost', + host: '127.0.0.1', user: 'fitbot', password: 'fitbot123', database: 'fitbot',