Merge branch '55-als-gebruiker-wil-ik-oefeningen-te-zien-krijgen-met-een-instructie-video-zodat-ik-weet-wat-ik' of ssh://gitlab.fdmci.hva.nl/propedeuse-hbo-ict/onderwijs/2023-2024/out-a-se-ti/blok-4/muupooviixee66 into 55-als-gebruiker-wil-ik-oefeningen-te-zien-krijgen-met-een-instructie-video-zodat-ik-weet-wat-ik

This commit is contained in:
Niels Gras
2024-05-22 14:19:37 +02:00
31 changed files with 578 additions and 250 deletions

35
.idea/workspace.xml generated
View File

@@ -14,10 +14,9 @@
</configurations>
</component>
<component name="ChangeListManager">
<list default="true" id="00599d5b-7eb5-44da-ad7f-98bf42384c16" name="Changes" comment="Final update onderzoek-formulier.md" />
<list default="true" id="00599d5b-7eb5-44da-ad7f-98bf42384c16" name="Changes" comment="Updated onderzoek-voorbeeld.md &amp; motion-tracking-system-analysis.md">
<list default="true" id="00599d5b-7eb5-44da-ad7f-98bf42384c16" name="Changes" comment="Merge">
<change afterPath="$PROJECT_DIR$/docs/personal-documentation/Luca/persoonlijke-reflectie-opdracht.md" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/docs/documentation/research-questions/motion-tracking-system-analysis.md" beforeDir="false" afterPath="$PROJECT_DIR$/docs/documentation/research-questions/motion-tracking-system-analysis.md" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -27,7 +26,6 @@
<component name="ClangdSettings">
<option name="formatViaClangd" value="false" />
</component>
<component name="ExecutionTargetManager" SELECTED_TARGET="device_and_snapshot_combo_box_target[C:\Users\Niels\.android\avd\Pepper_1.9_API_29.avd]" />
<component name="ExternalProjectsData">
<projectState path="$PROJECT_DIR$">
<ProjectState />
@@ -75,6 +73,9 @@
<component name="MarkdownSettingsMigration">
<option name="stateVersion" value="1" />
</component>
<component name="ProjectColorInfo">{
&quot;associatedIndex&quot;: 5
}</component>
<component name="ProjectId" id="2fE3N2CwEPDo9wBtexBLxU20tCJ" />
<component name="ProjectLevelVcsManager">
<ConfirmationsSetting value="2" id="Add" />
@@ -83,13 +84,6 @@
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent">
<property name="RunOnceActivity.OpenProjectViewOnStart" value="true" />
<property name="RunOnceActivity.ShowReadmeOnStart" value="true" />
<property name="RunOnceActivity.cidr.known.project.marker" value="true" />
<property name="cidr.known.project.marker" value="true" />
<property name="last_opened_file_path" value="$PROJECT_DIR$/code/src/Fitbot" />
</component>
<component name="PropertiesComponent">{
&quot;keyToString&quot;: {
&quot;RunOnceActivity.OpenProjectViewOnStart&quot;: &quot;true&quot;,
@@ -202,6 +196,11 @@
<workItem from="1715765990621" duration="8538000" />
<workItem from="1715777647522" duration="725000" />
<workItem from="1715779408605" duration="3840000" />
<workItem from="1715957538891" duration="2000" />
<workItem from="1716126955744" duration="1102000" />
<workItem from="1716286107331" duration="6057000" />
<workItem from="1716308427931" duration="28000" />
<workItem from="1716318640952" duration="7000" />
</task>
<task id="LOCAL-00001" summary="Changes">
<created>1713528225837</created>
@@ -295,7 +294,15 @@
<option name="project" value="LOCAL" />
<updated>1715780873394</updated>
</task>
<option name="localTasksCounter" value="13" />
<task id="LOCAL-00013" summary="Merge">
<option name="closed" value="true" />
<created>1715951036170</created>
<option name="number" value="00013" />
<option name="presentableId" value="LOCAL-00013" />
<option name="project" value="LOCAL" />
<updated>1715951036170</updated>
</task>
<option name="localTasksCounter" value="14" />
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
@@ -311,7 +318,6 @@
</entry>
</map>
</option>
<option name="oldMeFiltersMigrated" value="true" />
</component>
<component name="VcsManagerConfiguration">
<MESSAGE value="Changes" />
@@ -327,6 +333,7 @@
<MESSAGE value="Renamed files, added motion-tracking-system-analysis.md" />
<MESSAGE value="Updated onderzoek-voorbeeld.md and motion-tracking-system-analysis.md" />
<MESSAGE value="Updated onderzoek-voorbeeld.md &amp; motion-tracking-system-analysis.md" />
<option name="LAST_COMMIT_MESSAGE" value="Updated onderzoek-voorbeeld.md &amp; motion-tracking-system-analysis.md" />
<MESSAGE value="Merge" />
<option name="LAST_COMMIT_MESSAGE" value="Merge" />
</component>
</project>

View File

@@ -31,6 +31,7 @@
<entry key="..\:/Users/sebas/Documents/HvA/Reposetories/muupooviixee66/code/src/Fitbot/app/src/main/res/layout/activity_sport_menu.xml" value="0.1" />
<entry key="..\:/Users/sebas/Documents/HvA/Reposetories/muupooviixee66/code/src/Fitbot/app/src/main/res/layout/header.xml" value="0.125" />
<entry key="..\:/Users/sebas/Documents/HvA/Reposetories/muupooviixee66/code/src/Fitbot/app/src/main/res/layout/toolbar.xml" value="0.125" />
<entry key="app/src/main/res/layout/activity_end_screen.xml" value="0.1" />
<entry key="app/src/main/res/layout/activity_fitness.xml" value="0.23550724637681159" />
<entry key="app/src/main/res/layout/activity_main.xml" value="0.1" />
<entry key="app/src/main/res/layout/activity_sport_item.xml" value="0.2341485507246377" />

View File

@@ -22,7 +22,7 @@
android:supportsRtl="true"
android:theme="@style/Theme.Fitbot" >
<activity
android:name=".EndScreenActivity"
android:name=".ui.activities.EndScreenActivity"
android:exported="false" />
<activity
android:name=".ui.activities.FitnessActivity"

View File

@@ -8,14 +8,17 @@ import com.example.fitbot.util.server.WebSocket;
import java.util.Objects;
public abstract class AbstractExercise implements IWebSocketHandler {
public class Exercise implements IWebSocketHandler {
private EMuscleGroup muscleGroup;
private GesturePath path;
private String title;
private String description;
private float segmentsPerSecond;
// Static fields.
private static WebSocket webSocket;
private static AbstractExercise currentExercise = null;
private static Exercise currentExercise = null;
/**
@@ -23,10 +26,17 @@ public abstract class AbstractExercise implements IWebSocketHandler {
*
* @param muscleGroup The muscle group of the exercise.
* @param path The path of the exercise.
* @param title The title of the exercise.
* @param description The description of the exercise.
* @param segmentsPerSecond The number of segments per second.
* This determines how fast the exercise should be performed.
*/
public AbstractExercise(EMuscleGroup muscleGroup, GesturePath path) {
public Exercise(EMuscleGroup muscleGroup, String title, String description, GesturePath path, float segmentsPerSecond) {
this.muscleGroup = muscleGroup;
this.title = title;
this.description = description;
this.path = path;
this.segmentsPerSecond = segmentsPerSecond;
}
/**
@@ -101,4 +111,19 @@ public abstract class AbstractExercise implements IWebSocketHandler {
public GesturePath getPath() {
return path;
}
public String getTitle() {
return title;
}
public String getDescription() {
return description;
}
/**
* Get the speed of the exercise.
*/
public double getSegmentsPerSecond() {
return segmentsPerSecond;
}
}

View File

@@ -0,0 +1,41 @@
package com.example.fitbot.exercise;
import com.example.fitbot.util.processing.IMotionDataConsumer;
import com.example.fitbot.util.processing.MotionData;
import com.example.fitbot.util.processing.MotionProcessor;
import com.example.fitbot.util.server.IWebSocketHandler;
import com.example.fitbot.util.server.WebSocket;
import org.joml.Vector3f;
import java.net.Socket;
public class ExerciseBuilder implements IWebSocketHandler, IMotionDataConsumer {
private MotionProcessor processor;
public ExerciseBuilder() {
this.processor = new MotionProcessor();
this.processor.setMotionDataEventHandler(this);
}
@Override
public void onDisconnected(Socket socket) {
IWebSocketHandler.super.onDisconnected(socket);
}
@Override
public void onMessageReceived(WebSocket.Message message, WebSocket.MessageReply replier) {
IWebSocketHandler.super.onMessageReceived(message, replier);
}
@Override
public void onError(Socket socket, String error) {
IWebSocketHandler.super.onError(socket, error);
}
@Override
public void accept(Vector3f transformedVector, MotionData motionData, int sampleIndex, double sampleRate, int sensorId) {
}
}

View File

@@ -50,7 +50,7 @@ public class FitnessManager {
* @param uniqueIdentifier The unique identifier of the exercise
* @return The exercise, if it exists on the server. Otherwise null.
*/
public static <T extends AbstractExercise> AbstractExercise acquireExercise(String uniqueIdentifier, Class<T> referenceClass) {
public static <T extends Exercise> Exercise acquireExercise(String uniqueIdentifier, Class<T> referenceClass) {
String response = sendHTTP(
HOST_ADDRESS + "/acquire", "GET", "application/json", "{\"kind\":\"" + uniqueIdentifier + "\"}"
);

View File

@@ -1,10 +1,10 @@
package com.example.fitbot;
package com.example.fitbot.ui.activities;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.Button;
import com.example.fitbot.R;
import com.example.fitbot.ui.activities.FitnessActivity;
import com.example.fitbot.ui.activities.MainActivity;
public class EndScreenActivity extends AppCompatActivity {
@@ -13,12 +13,8 @@ public class EndScreenActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_end_screen);
Button homeButton = findViewById(R.id.homeButton);
homeButton.setOnClickListener(v -> {
Intent intent = new Intent(EndScreenActivity.this, MainActivity.class);
startActivity(intent);
finish();
});
com.example.fitbot.util.ButtonNavigation.setupButtonNavigation(this, R.id.homeButton, MainActivity.class);
com.example.fitbot.util.ButtonNavigation.setupButtonNavigation(this, R.id.continueButton, FitnessActivity.class);
}
}

View File

@@ -1,50 +1,64 @@
package com.example.fitbot.ui.activities;
import static com.example.fitbot.sports.Animations.Animate;
import android.content.Context;
import android.net.Uri;
import android.os.Bundle;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.MediaController;
import android.widget.VideoView;
import com.aldebaran.qi.sdk.QiContext;
import com.aldebaran.qi.sdk.QiSDK;
import com.aldebaran.qi.sdk.RobotLifecycleCallbacks;
import com.aldebaran.qi.sdk.design.activity.RobotActivity;
import com.example.fitbot.EndScreenActivity;
import com.example.fitbot.ui.activities.EndScreenActivity;
import com.example.fitbot.R;
import com.example.fitbot.sports.Animations;
import com.example.fitbot.R;
import com.example.fitbot.exercise.Exercise;
import com.example.fitbot.exercise.EMuscleGroup;
import com.example.fitbot.ui.components.PersonalMotionPreviewElement;
import com.example.fitbot.util.path.GesturePath;
import org.joml.Vector3f;
public class FitnessActivity extends RobotActivity implements RobotLifecycleCallbacks {
PersonalMotionPreviewElement personalMotionPreviewElement;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fitness);
VideoView videoView = findViewById(R.id.videoView);
videoView.setVideoURI(Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.bicepvideo));
GesturePath.Builder gesturePathBuilder = new GesturePath.Builder();
MediaController mediaController = new MediaController(this);
videoView.setMediaController(mediaController);
videoView.start();
gesturePathBuilder.addVector(new Vector3f(-.5f, -.5f, -.5f));
gesturePathBuilder.addVector(new Vector3f(.5f, -.5f, -.5f));
gesturePathBuilder.addVector(new Vector3f(.5f, -.5f, .5f));
gesturePathBuilder.addVector(new Vector3f(-.5f, -.5f, .5f));
gesturePathBuilder.addVector(new Vector3f(-.5f, -.5f, -.5f));
com.example.fitbot.util.ButtonNavigation.setupButtonNavigation(this, R.id.homeButton, MainActivity.class);
com.example.fitbot.util.ButtonNavigation.setupButtonNavigation(this, R.id.buttonComplete, EndScreenActivity.class);
gesturePathBuilder.addVector(new Vector3f(-.5f, .5f, -.5f));
gesturePathBuilder.addVector(new Vector3f(.5f, .5f, -.5f));
gesturePathBuilder.addVector(new Vector3f(.5f, .5f, .5f));
gesturePathBuilder.addVector(new Vector3f(-.5f, .5f, .5f));
gesturePathBuilder.addVector(new Vector3f(-.5f, .5f, -.5f));
personalMotionPreviewElement = findViewById(R.id.personalMotionPreviewElement);
personalMotionPreviewElement.post(() -> {
Log.i("FitnessActivity", "PersonalMotionPreviewElement.post()");
Exercise exercise = new Exercise(EMuscleGroup.ARMS, "Bicep Curls", "Oefening voor de biceps.", gesturePathBuilder.build(), 1);
personalMotionPreviewElement.initialize(exercise);
});
}
// QiSDK.register(this, this);
//
//
@Override
public void onRobotFocusGained(QiContext qiContext) {
// Implement your logic when the robot focus is gained
Animate("bicepcurl", qiContext);
Animations.Animate("bicepcurl", qiContext);
}
@@ -64,12 +78,4 @@ public class FitnessActivity extends RobotActivity implements RobotLifecycleCall
super.onDestroy();
}
public static class PersonalMotionPreviewElement extends View {
public PersonalMotionPreviewElement(Context context, AttributeSet attrs) {
super(context, attrs);
// Initialize your custom view here (optional)
}
}
}
}

View File

@@ -4,9 +4,11 @@ import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import com.example.fitbot.exercise.Exercise;
import com.example.fitbot.util.path.GesturePath;
import com.example.fitbot.util.path.PathSegment;
import com.example.fitbot.util.processing.MotionData;
@@ -22,50 +24,116 @@ public class PersonalMotionPreviewElement extends View {
private GesturePath path;
private double pathTime = 0.0D; // The timestamp at which the path is currently at.
private MotionProcessor motionProcessor;
private Path referencePath, performingPath;
private Paint referencePaint, performingPaint;
private Exercise exercise;
private Path referencePath; // The path the user is supposed to follow.
private Path performingPath; // The path the user is currently following.
private Path stickmanPath; // The path of the stickman that is drawn on the screen.
private Paint referencePaint;
private Paint performingPaint;
private Paint textPaint;
// Matrices for the projection of the path segments onto the screen.
// Depth buffering sadly is not supported yet due to brain dysfunction
private Matrix4f modelViewMatrix = new Matrix4f();
private Matrix4f projectionMatrix = new Matrix4f();
private double timePassed = 0.0D; // The time that has passed since the start of the exercise, in seconds.
private long startingTime = 0L;
private Paint backgroundColor = new Paint();
/**
* Constants for the preview path projection.
*/
private final float FOV = 70.0f; // The field of view of the preview path
private final float FOV = 80.0f; // The field of view of the preview path
private final float Z_NEAR = 0.1f; // The near clipping plane
private final float Z_FAR = 1000.0f; // The far clipping plane
private Vector3f cameraPosition = new Vector3f(0.0f, 0.0f, 0.0f); // The position of the camera
private Vector3f objectPosition = new Vector3f(0.0f, 0.0f, 0.0f); // The position of the camera
private Vector2f screenDimensions = new Vector2f(); // Width and height dimensions of the screen
private Vector2f rotation = new Vector2f(); // Rotation vector (yaw, pitch)
/**
* Constructor for the PersonalMotionPreviewElement class.
*
* @param context The context in which this element is created.
* @param path The gesture path that will be drawn on the canvas.
*/
public PersonalMotionPreviewElement(Context context, GesturePath path) {
super(context);
Log.i("PersonalMotionPreviewElement", "Creating new PersonalMotionPreviewElement.");
this.backgroundColor = new Paint();
this.backgroundColor.setColor(0xFF000000); // Black
this.path = path;
this.motionProcessor = new MotionProcessor();
this.motionProcessor.startListening();
this.motionProcessor.setMotionDataEventHandler((processed, preprocessed, sampleIndex, sampleRate) -> {
// TODO: Implement the calculation of the `performingPath` based on the motion data
});
this.referencePath = getDrawablePath(path.getSegments());
this.performingPath = new Path();
public PersonalMotionPreviewElement(Context context, AttributeSet attrs) {
super(context, attrs);
this.referencePaint = new Paint();
this.referencePaint.setColor(-1); // White
this.referencePaint.setColor(0xFFFF0000); // Red
this.referencePaint.setStyle(Paint.Style.STROKE);
this.referencePaint.setStrokeWidth(5.0f);
this.performingPaint = new Paint();
this.performingPaint.setColor(0xFF0000FF); // Blue
this.performingPaint.setStyle(Paint.Style.STROKE);
this.performingPaint.setStrokeWidth(5.0f);
this.textPaint = new Paint();
this.textPaint.setColor(-1);
this.textPaint.setStyle(Paint.Style.FILL);
this.textPaint.setTextSize(50.0f);
}
/**
* Method for updating the stickman gestures.
*
* This method will update the stickman gestures based on the current
* motion data that is being processed.
*/
private void updateStickmanGestures() {
// Reset previous path
stickmanPath.reset();
// TODO: Define all arm segments:
// - Upper left and right arm
// - Lower left and right arm
// - Upper left and right leg
// - Lower left and right leg
// Update all segments based on the perceived motion data.
PathSegment upperLeftArm = new PathSegment(
new Vector3f(),
new Vector3f()
);
PathSegment[] bodySegments = new PathSegment[] {
new PathSegment(new Vector3f(0.0f, -.5f, -.5f), new Vector3f(0, 0, 0)), // Left leg
new PathSegment(new Vector3f(0.0f, -.5f, .5f), new Vector3f(0, 0, 0)), // Right leg
new PathSegment(new Vector3f(0.0f, .5f, 0.0f), new Vector3f(0, 0, 0)), // Body
new PathSegment(new Vector3f(-.25f, .25f, 0f), new Vector3f(0, 0, 0)), // Left arm
new PathSegment(new Vector3f(.25f, .25f, 0f), new Vector3f(0, 0, 0)) // Right arm
};
// TODO: Generate new path for stickman
}
/**
* Method for initializing the PersonalMotionPreviewElement.
* This method has to be called with a "post" function when the element has been
* created, otherwise the dimensions of the element aren't initialized yet, which
* will cause the vertex projections to fail (0 width and height).
*
* @param exercise The exercise that the user is currently performing.
*/
public void initialize(Exercise exercise) {
Log.i("PersonalMotionPreviewElement", "Creating new PersonalMotionPreviewElement.");
this.backgroundColor = new Paint();
this.backgroundColor.setColor(0xFF000000); // Black
this.screenDimensions.x = this.getWidth();
this.screenDimensions.y = this.getHeight();
this.performingPath = new Path();
this.referencePath = new Path();
this.startingTime = System.nanoTime(); // Set the last time to the current time
this.exercise = exercise;
this.path = exercise.getPath();
this.motionProcessor = new MotionProcessor();
this.motionProcessor.startListening();
this.motionProcessor.setMotionDataEventHandler((processed, preprocessed, sampleIndex, sampleRate, deviceId) -> {
// TODO: Implement the calculation of the `performingPath` based on the motion data
});
}
/**
@@ -90,7 +158,7 @@ public class PersonalMotionPreviewElement extends View {
/**
* Method for setting the rotation of the preview path.
*
* @param yaw The yaw rotation of the preview path.
* @param yaw The yaw rotation of the preview path.
* @param pitch The pitch rotation of the preview path.
*/
public void setRotation(float yaw, float pitch) {
@@ -98,38 +166,38 @@ public class PersonalMotionPreviewElement extends View {
}
/**
* Method for projecting a 3D point onto the screen.
* This method converts the 3D point to 2D space using a Model-View-Projection matrix transformation.
* Method for projecting a 3D point onto the screen.
* This method converts the 3D point to 2D space using a Model-View-Projection matrix transformation.
*
* @param point The point to cast to the screen.
* @param virtualWidth The width of the virtual screen.
* This is used to normalize the screen coordinates.
* @param point The point to cast to the screen.
* @param virtualWidth The width of the virtual screen.
* This is used to normalize the screen coordinates.
* @param virtualHeight The height of the virtual screen.
* @return The transformed vector in screen coordinates ranging from (0, 0) to (virtualWidth, virtualHeight).
*/
private Vector2f projectVertex(Vector3f point, int virtualWidth, int virtualHeight) {
Matrix4f modelViewMatrix = new Matrix4f()
.rotateX((float) Math.toRadians(rotation.x))
.rotateY((float) Math.toRadians(rotation.y))
.translate(cameraPosition);
modelViewMatrix
.identity()
.translate(-objectPosition.x, -objectPosition.y, -objectPosition.z)
.rotateX((float) Math.toRadians(rotation.y))
.rotateY((float) Math.toRadians(rotation.x));
Matrix4f projectionMatrix = new Matrix4f()
// Transform the projection matrix to a perspective projection matrix
// Perspective transformation conserves the depth of the object
projectionMatrix
.identity()
.perspective((float) Math.toRadians(FOV), (float) virtualWidth / virtualHeight, Z_NEAR, Z_FAR);
// Calculate Model-View-Projection matrix
Matrix4f MVP = new Matrix4f()
.set(projectionMatrix)
.mul(modelViewMatrix);
// Convert to screen coordinates
// Convert world coordinates to screen-space using MVP matrix
Vector4f screenCoordinates = new Vector4f(point, 1.0f)
.mul(MVP);
.mul(this.modelViewMatrix)
.mul(this.projectionMatrix);
// Normalize screen coordinates from (-1, 1) to (0, virtualWidth) and (0, virtualHeight)
float normalizedX = (screenCoordinates.x / screenCoordinates.w + 1.0f) * 0.5f * virtualWidth;
float normalizedY = (1.0f - screenCoordinates.y / screenCoordinates.w) * 0.5f * virtualHeight;
Log.i("VertexProjection", "Projected vertex to screen coordinates: (" + normalizedX + ", " + normalizedY + ").");
return new Vector2f(normalizedX, normalizedY);
}
@@ -137,9 +205,9 @@ public class PersonalMotionPreviewElement extends View {
* Method that converts a sequence of vectors to a Path object.
* This path is a set of bezier curves that will be drawn on the canvas.
*
* @param segments The path segments in the path.
* These segments will be connected by bezier curves, which
* all have unique curvature values.
* @param segments The path segments in the path.
* These segments will be connected by bezier curves, which
* all have unique curvature values.
* @return The generated path object.
*/
private Path getDrawablePath(PathSegment... segments) {
@@ -152,8 +220,8 @@ public class PersonalMotionPreviewElement extends View {
// Draw the path segments
for (PathSegment segment : segments) {
Vector2f startProjected = projectVertex(segment.getStart(), getWidth()/2, getHeight());
Vector2f endProjected = projectVertex(segment.getEnd(), getWidth()/2, getHeight());
Vector2f startProjected = projectVertex(segment.getStart(), getWidth(), getHeight());
Vector2f endProjected = projectVertex(segment.getEnd(), getWidth(), getHeight());
calculatedPath.lineTo(startProjected.x, startProjected.y);
calculatedPath.lineTo(endProjected.x, endProjected.y);
}
@@ -165,8 +233,19 @@ public class PersonalMotionPreviewElement extends View {
@Override
public void onDraw(Canvas canvas) {
canvas.drawRect(0, 0, getWidth(), getHeight(), backgroundColor);
this.setBackgroundColor(0xFF000000); // Black
if (this.exercise == null)
return;
// Draw the sport preview canvas
canvas.drawPath(referencePath, referencePaint);
canvas.drawPath(performingPath, performingPaint);
canvas.drawText(this.exercise.getTitle(), 10, 40, textPaint);
timePassed = (System.nanoTime() - startingTime) / 1E9D;
this.rotation.add(1f, 0);
this.referencePath = getDrawablePath(this.path.getSegments());
this.invalidate(); // Causes a redraw.
}
}

View File

@@ -11,17 +11,12 @@ public class GesturePath {
// The vectors that make up the path.
private final PathSegment[] segments;
public GesturePath(Vector3f[] vectors) {
this(vectors, 0.0D);
}
/**
* Create a new gesture path with a given set of vectors and curvature.
*
* @param vectors The vectors that make up the path.
* @param curvature The curvature of the path.
*/
public GesturePath(Vector3f[] vectors, double curvature)
public GesturePath(Vector3f[] vectors)
{
if ( vectors.length < 2)
throw new IllegalArgumentException("A path must have at least two points.");

View File

@@ -11,6 +11,6 @@ public interface IMotionDataConsumer {
* @param sampleIndex The index of the current sample
* @param sampleRate The sample rate.
*/
void accept(Vector3f transformedVector, MotionData motionData, int sampleIndex, double sampleRate);
void accept(Vector3f transformedVector, MotionData motionData, int sampleIndex, double sampleRate, int sensorId);
}

View File

@@ -8,6 +8,7 @@ public class MotionData {
// Data of the motion sensor
public Vector3f acceleration, rotation;
public int sensorId;
// Delimiter for the data received from the motion sensor
private static final String DATA_DELIMITER = ";";
@@ -21,10 +22,10 @@ public class MotionData {
* @param rotationX The rotation in the X axis in degrees.
* @param rotationY The rotation in the Y axis in degrees.
* @param rotationZ The rotation in the Z axis in degrees.
* @param sensorId The sensor id.
*/
public MotionData(float accelerationX, float accelerationY, float accelerationZ, float rotationX, float rotationY, float rotationZ) {
this.acceleration = new Vector3f(accelerationX, accelerationY, accelerationZ);
this.rotation = new Vector3f(rotationX, rotationY, rotationZ);
public MotionData(float accelerationX, float accelerationY, float accelerationZ, float rotationX, float rotationY, float rotationZ, int sensorId) {
this(new Vector3f(accelerationX, accelerationY, accelerationZ), new Vector3f(rotationX, rotationY, rotationZ), sensorId);
}
/**
@@ -33,9 +34,10 @@ public class MotionData {
* @param acceleration The acceleration vector in m/s^2.
* @param rotation The rotation vector in degrees.
*/
public MotionData(Vector3f acceleration, Vector3f rotation) {
public MotionData(Vector3f acceleration, Vector3f rotation, int sensorId) {
this.acceleration = acceleration;
this.rotation = rotation;
this.sensorId = sensorId;
}
/**
@@ -50,7 +52,7 @@ public class MotionData {
Objects.requireNonNull(data); // Ensure data is not null
String[] parts = data.split(DATA_DELIMITER);
if (parts.length != 6)
if (parts.length != 7)
return null;
return new MotionData(
@@ -59,7 +61,8 @@ public class MotionData {
Float.parseFloat(parts[2]),
Float.parseFloat(parts[3]),
Float.parseFloat(parts[4]),
Float.parseFloat(parts[5])
Float.parseFloat(parts[5]),
Integer.parseInt(parts[6])
);
}
}

View File

@@ -22,7 +22,7 @@ public class MotionProcessor {
private Vector3f ZERO = new Vector3f(0, 0, 0);
private float sampleRate = 1.0F; // samples/second
private IMotionDataConsumer motionDataConsumer = (p1, p2, p3, p4) -> {};
private IMotionDataConsumer motionDataConsumer = (p1, p2, p3, p4, p5) -> {};
private GesturePath path;
private WebSocket socket;
@@ -110,7 +110,7 @@ public class MotionProcessor {
Vector3f previous = this.relativePath.isEmpty() ? ZERO : this.relativePath.get(this.relativePath.size() - 1);
Vector3f relativeVector = getRelativeVector(data).add(previous);
this.relativePath.add(relativeVector);
motionDataConsumer.accept(relativeVector, data, this.relativePath.size(), this.sampleRate);
motionDataConsumer.accept(relativeVector, data, this.relativePath.size(), this.sampleRate, data.sensorId);
}
/**

View File

@@ -5,7 +5,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".EndScreenActivity">
tools:context=".ui.activities.EndScreenActivity">
<View
android:id="@+id/myRectangleView"

View File

@@ -1,73 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/red"
android:background="#232323"
android:fitsSystemWindows="true"
tools:context=".ui.activities.FitnessActivity"
tools:openDrawer="start">
<!-- <com.example.fitbot.ui.components.PersonalMotionPreviewElement-->
<!-- android:id="@+id/personalMotionPreviewElement"-->
<!-- android:layout_width="600dp"-->
<!-- android:layout_height="550dp"-->
<!-- app:layout_constraintBottom_toBottomOf="parent"-->
<!-- app:layout_constraintEnd_toEndOf="parent"-->
<!-- app:layout_constraintHorizontal_bias="0.976"-->
<!-- app:layout_constraintStart_toStartOf="parent"-->
<!-- app:layout_constraintTop_toTopOf="parent"-->
<!-- app:layout_constraintVertical_bias="0.064" />-->
<com.example.fitbot.ui.components.PersonalMotionPreviewElement
android:id="@+id/personalMotionPreviewElement"
android:layout_width="356dp"
android:layout_height="match_parent"
android:visibility="visible" />
<VideoView
android:id="@+id/videoView"
android:layout_width="600dp"
android:layout_height="550dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.023"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.064" />
<Button
android:id="@+id/homeButton"
style="@style/ButtonStyle"
android:layout_width="180dp"
android:layout_height="120dp"
android:text="HOME"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.014"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.976" />
<Button
android:id="@+id/skipButton"
style="@style/ButtonStyle"
android:layout_width="180dp"
android:layout_height="120dp"
android:text="SKIP"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.976" />
<Button
android:id="@+id/buttonComplete"
style="@style/ButtonStyle"
android:layout_width="180dp"
android:layout_height="120dp"
android:text="Complete"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.985"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.976" />
</android.support.constraint.ConstraintLayout>
</android.support.v4.widget.DrawerLayout>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="PersonalMotionPreviewElement">
</declare-styleable>
</resources>

View File

@@ -1,3 +1,4 @@
<?xml version="1.0" encoding="utf-8" ?>
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Theme.Fitbot" parent="Theme.AppCompat.Light.NoActionBar">

View File

@@ -7,19 +7,21 @@ Which sensor are we gonna use for this project and why?
We wanna measure the movement of the people doing our exercises. We want to know how many times they have done the exercise and how many times they have done it correctly.
### What sensor are we going to use?
To measure these movements we are gonna use gyroscopes. With gyroscopes we can measure the rotation of the body. With some math we can also measure the speed of the rotation. So we know how fast the person is doing the exercise.
### Which methods are there to measure this?
There are a lot of different ways to measure movement. You can use cameras, gyroscopes, accelerometers or a combination of these. Each of these methods have their own pros and cons. For example cameras are good at measuring movement but they require a lot of processing power and if the user turns the other way the camera cant measure the movement anymore. Accelerometers are good at measuring the movement of the body but they are not good at measuring the speed of the movement. Gyroscopes are good at everything because they can calculate how fast the body is moving and in which rotation.
### Which gyroscopes are there?
There are a lot of different gyroscopes with a lot of different specifications.
### What type of sensor are we going to use?
To measure these movements we are gonna use IMU's. They are a combination of accelerometers and gyroscopes. This way we can measure the movement of the body and the speed of the movement.
* ADXL345
### Which IMU's are there?
There are a lot of different IMU's with a lot of different specifications.
* ADXL345
* BNO085
* Bmi160
### Which one are we gonna use?
We haven't decided on which gyroscope we are gonna use yet.
We are going to use the BNO085 because it has the least amount of drift and its very versatile. We can get almost any type of rotational and acceleration data from it.
---
<br>
<br>

View File

@@ -0,0 +1,62 @@
STARR
## Reflectie Opdracht Blok 1 - Climate Measuring Box
### Situatie
Voor het eerste blok was de opdracht het maken van een meetsysteem om bepaalde omgevingswaarden te meten, waarbij deze metingen
op een webpagina live weergeven worden.
Daarnaast moesten er ook bepaalde waarden gestuurd worden naar de HvA server, om deze vervolgens op de website op een map te weergeven.
Een voorbeeld van meetwaarden die gestuurd moesten worden waren temperatuur, luchtvochtigheid en lichtintensiteit.
### Taak
Als taak van dit project was het noodzakelijk om een hardware systeem te bouwen met behulp van de ESP32.
Hierbij was het nodig om meerdere sensoren te verbinden aan de ESP32 en deze sensoren uit te lezen.
De waarden van deze sensoren moesten vervolgens via een seriële connectie naar een webpagina gestuurd worden.
Daarnaast moest er ook een van deze waarden naar de HvA server gestuurd worden, om vervolgens op een map weergegeven te worden.
Al deze meetwaarden moesten live getoond worden op de website.
### Actie
Om te voldoen aan de criteria voor het project heb ik gebruik gemaakt van een luchtvochtigheidsensor gepaard met een temperatuursensor (DHT11)
en een lichtsensor (GL5528). Deze sensoren leverde adequate data voor het project. Daarnaast heb ik een simpele website gemaakt
waarbij de waarden van deze sensoren live in het midden van de website getoond werden.
### Resultaat
Het resultaat van het project was een werkend meetsysteem dat de waarden van de sensoren live weergaf op een website.
### Reflectie
In het eerste blok heb ik behoorlijk veel nieuwe gedragscriteria geleerd.
Ik heb geleerd om beter mijn werk bij te houden door het te actief te documenteren en het bij te houden met een version control system (VSC) zoals git.
Ik vond het aan het begin wel lastig om hieraan te voldoen, gezien ik hiervoor vrij weinig aan documentatie als git heb gedaan.
### Transfer
## Reflectie opdracht Blok 2 - TI Game Controller
## Reflectie opdracht Blok 3 - Optimalisatie Studieomgeving
Skills ontwikkelingsplan SMART
Professional Skills
Persoonlijk Leiderschap
Toekomstgericht organiseren
Doelgericht interacteren
Onderzoekend probleemoplossen
Essential Skills: Nederlands, Engels en Wiskunde

View File

@@ -0,0 +1,88 @@
# Expert review sprint 2
# Expert review sprint 2
### K1
Voor het maken van object georiënteerde software die samenwerkt met een database maak ik gebruik van Java, NodeJs, phpMyAdmin en MariaDB.
### Java
Java gebruiken wij als taal van de app. Deze taal zorgt ervoor dat onze app functioneert.
### Database
De database voor FitBot zal worden gebruikt als opslag van de oefeningen die wij willen gebruiken. Wij moeten deze nog verbinden met de app
#### Apache en phpMyAdmin
Om de database te managen gebruiken wij PHPmyadmin deze meot worden gedraaid op een webserver en voor de webserver hebben wij apache2 gebruikt
##### MariaDB
MariaDB dient als onze database om de oefeningen in op te slaan.
##### NodeJs
NodeJS is geinstaleerd op de Pi maar deze moeten wij nog verder instellen
Ik heb in java ook OOP gewerkt, niet in hele grote maten, omdat wij gaan voor een minimalistische app, maar ik heb de app ontworpen daar heb ik gebruik gemaakt van styles. Hier vindt u mijn documentatie over android styles. [Documentatie styles](docs\documentation\android\code_documentation\AndroidStyles.md)
Ik heb ook een class gemaakt om eenvoudig code te schrijven om via buttons te navigeren. Ik heb hier nog geen documentatie over geschreven, maar ik heb wel de code al af en functionerend. Hier vindt u de class [buttonClass](code\src\Fitbot\app\src\main\java\com\example\fitbot\util\ButtonNavigation.java)
```java
com.example.fitbot.util.ButtonNavigation.setupButtonNavigation(this, R.id.homeButton, MainActivity.class);
```
Dit hoe je de class implementeerd in de activities.
### K2
De wensen en Behoeftes van de gebruikers hebben wij nog niet kunnen meten. Ik ga wel binnenkort (28 mei) een wandeling maken met de gebruikers. Deze wandeling doe ik via buurtcampus oost. Om deze test zo goed mogelijk uitvoeren heb ik een test card gemaakt. Met deze testcard wil ik aan de gang gaan tijdens de wandeling
![TESTCARD](TESTCARD28.png)
Na het uitvoeren van de test ga ik de resultaten bespreken in een apart markdown folder. Na het bespreken van de resultaten ga ik een learningcard maken, zodat ik kan zien wat ik geleerd heb.
![empty learning card](Learningcardempty.png)
Daarnaast heb ik meerdere onderzoeken naar hoe je een app voor ouderen moet maken. Dit onderzoek kan je hier vinden [colorsforlayout](docs\documentation\brainstorm\colorsforlayout.md)
Ik zou ook nog graag onze app willen voorleggen aan ouderen om te kijken of onze app wel goed gebouwd is, dit komt als wij ons prototype afhebben dan kunnen we beginnen met testen en aan de hand van die feedback gaan wij extra user stories aanmaken.
### K3
De infrastructuur voor FitBot bestaat uit een database, een server en een app. De database wordt gebruikt om de oefeningen in op te slaan, de server wordt gebruikt om de app te verbinden met de database en de app wordt gebruikt om de oefeningen op te halen.
Voor de server gebruiken Wij Apache2.
Voor de database gebruiken wij MariaDB.
Voor management van de database gebruiken wij phpMyAdmin.
**Infrastructuur diagram**
```mermaid
graph TD
    subgraph Raspberry Pi
        A[MariaDB]
    end
    subgraph Pepper Bot
        C[Android Tablet]
   
    end
    subgraph WiFi Fit Board
     B[WiFi Fit Board]
    end
    B --> |Bluetooth| C
    C --> |Receive/Send Data| A
    A --> |Communicate Workouts| C
   
```
Om nog extra voor K3 te doen ga ik een onderzoek schrijven over de datatransfer protocollen en welke het beste werkt voor ons project. Dan aan de hand van dat onderzoek moeten wij een keuze gaan maken in welke protocollen we willen gebruiken.
### K4
Ik heb de verschillen tussen de NAO en pepper onderzocht, dit heb ik gedaan om te kijken welke het beste bij ons project past. Dit is belangrijk om te weten voor als we moeten switchen/het project opnieuw moeten doen.
[pepperNAOcompare](Docs\documentation\robots\Comparisons.md)
Daarnaast waren er wat mankementen met de Wiifit bord. ik wil graag onderzoeken hoe het fout kan gaan en wat de alternatieven zijn.
### K5
Voor K5 hebben wij motion trackers ontworpen die wij willen gebruiken voor onze oefeningen. Deze werken met een accelerometeren een gyro sensor. Deze gebruiken wij om te meten of een persoon de oefening goed. De gebruiker krijgt zijn bewegeingen live terug te zien in de app en zo kan je je eigen bewegingen zien en het vergelijken met het voorbeeld. Ook hebben wij een wii fit bord om te kijken of een persoon er op staat dit kan gebruikt worden voor oefeningen op 1 been bijvoorbeeld. Deze moeten wij nog verbinden met de app alleen hebben wij een probleem dat het wiifit bord niet wil werken als alternatief gaan wij aan de slag met een ESP en LDRs. Wij willen meten of iemand op een bord staat doormideel wan licht en wij willen die dat versturen met de Bluetooth van de EPS door daar een bleutooth server op te hosten die comminuceert met de app.

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

View File

@@ -0,0 +1,36 @@
# climate measering box (blok 1)
In blok 1 kwam
**Situatie**
**Taak/Opgave**
**Aanpak en activiteiten**
**Resultaat**
**Reflectie**
**Transfer**
# TI game controller (blok 2)
**Situatie**
**Taak/Opgave**
**Aanpak en activiteiten**
**Resultaat**
**Reflectie**
**Transfer**
# verbeting leer omgeving (blok 3)
**Situatie**
**Taak/Opgave**
**Aanpak en activiteiten**
**Resultaat**
**Reflectie**
**Transfer**

Binary file not shown.

After

Width:  |  Height:  |  Size: 133 KiB

View File

@@ -0,0 +1,11 @@
# Reflectie 3 blokken
## Blok 1
In blok 1 heb ik de professionele skills Persoonlijk leiderschap en Toekomstgericht organiseren. Ik had veel moeite met documenteren en het scrumboard te gebruiken, omdat ik er nog geen ervaring mee had. Ik had op dat moment al het hele project in blokjes opgedeeld voor mezelf en keer daarna nooit meer naar het scrumboard. Door die manier van werken deed ik ook 5 dingen tegelijk waardoor ik af en toe het overzicht kwijtraakte . Ik had als doel opgesteld om in de volgende blokken meer het scrumboard te gaan gebruiken. Mijn aanpak was proberen zelf wat user storys te maken, zodat ik ook wat meer betrokken was bij het scrumboard. Uiteindelijk heb ik daardoor wel wat meer gebruik gemaakt van het scrumboard, maar ik ging nog wel veel mijn eigen weg. Ik was niet helemaal tevreden met het resultaat, maar de aanpak werkte wel. Wat ik heb geleerd is als ik veel gebruik van iets wil maken moet ik er zelf ook bij betrokken zijn. Volgende keren zorg ik er voor dat ik betrokken ben bij het scrum board wat nu ook moet, waardoor ik meer het scrumboard gebruik.
## Blok 2
In blok 2 gingen we voor het eerst samenwerken in een duo, waarbij we ook deels onze eigen user storys moesten maken, dat heeft me ook geholpen om door het hele blok heen het scrumboard meer te gebruiken. Communicatie ging over het algemeen in dat blok redelijk goed. Als we vragen aan elkaar hadden werden die gewoon gesteld en als een van ons vastliep hielpen we elkaar. In sprint 2 werden classes aan ons geïntroduceerd waarbij ik best wat moeite had om dat te begrijpen. Dus ik had maar 1 class gemaakt en verder alles in functies gestopt. Pas eind sprint 2 probeerde ik de feedback te verwerken om alles in classes te stoppen, maar omdat je code uiteindelijk zo complex is. Is het bijna onmogelijk om het in classes te stoppen. Waarbij het resultaat was een heel lastig leesbaar programma. Ik was niet tevreden of over het resultaat aan het einde van het blok. Mijn aanpak was bij het volgende blok. Meteen alles in classes maken. Wat uiteindelijk wel goed heeft gewerkt. Ben daardoor ook achter gekomen hoe handig classes zijn en dat ze enorm veel overzicht geven van wat je aan het maken bent.
## Blok 3
In blok 3 stond doelgericht interacteren en persoonlijke leiderschap centraal. Het groepje in blok 3 was te gezellig waardoor we vaak meer zaten te lollen dan we aan het werk waren. Ik had mezelf de taak gegeven om proberen om meer gefocust te werken zonder dat ik afgeleid raakte door mijn groepje. Mijn aanpak was door mezelf af te schermen met een koptelefoon of eventjes ergens anders te gaan zitten, wat ook goed hielp was even een rondje lopen. Op die manier kon ik de laatste sprint heel efficiënt werken en in blok 4 merk ik ook dat die techniek enorm erg helpt met meer gefocust en productief blijven op een dag. Dit resultaat was eigenlijk een beetje laat het liefst deed ik dit al eind sprint 1, zodat ik heel het blok beter kon doorwerken.

View File

@@ -2,22 +2,33 @@
## Inhoudsopgave
- [Inleiding](#inleiding)
- [Reflectie](#reflectie)
* [Blok 1](#blok-1)
* [Blok 2](#blok-2)
* [Blok 3](#blok-3)
- [Conclusie](#conclusie)
* [Inleiding](#inleiding)
* [Reflectie](#reflectie)
+ [Blok 1](#blok-1)
+ [Blok 2](#blok-2)
+ [Blok 3](#blok-3)
* [Conclusie](#conclusie)
## Inleiding
In dit document zal ik een skill ontwikkelplan schrijven voor mijn persoonlijk leiderschap. Dit plan zal bestaan uit een reflectie van de afgelopen blokken, mijn sterke en zwakke punten en mijn smart leerdoelen voor de komende blokken.
De vier profecional skills:
* Toekomstgericht organiseren
* Onderzoekend probleemoplossen
* Persoonlijk leiderschap
* Doelgericht interacteren
## Reflectie
In het volgende stuk zal ik reflecteren op de afgelopen blokken. Hierbij kijk ik naar de feedback die ik heb gekregen, waar ik op dat moment stond en wat ik heb geleerd. Bij het reflecteren zal ik de vier profecional skills gebruiken als leidraad.
### Blok 1
In het eerste blok heb ik op veel verschillende vlakken geleerd wat mijn sterke en zwakke punten zijn. Groot en deels van de eerste periode in blok 1 heb ik gespendeerd aan mezelf leren kennen binnen de opleiding. Het werken binnen een nieuwe omgeving en met nieuwe mensen was voor mij goed te doen. Ik heb de leeromgeving snel leren kennen en heb geen moeite gehad met het communiceren met mijn medestudenten en docenten.
In het eerste blok heb ik op veel verschillende vlakken geleerd wat mijn sterke en zwakke punten zijn. Groot en deels van de eerste periode in blok 1 heb ik gespendeerd aan mezelf leren kennen binnen de opleiding. Het werken binnen een nieuwe omgeving en met nieuwe mensen was voor mij goed te doen. Ik heb de leeromgeving snel leren kennen en heb geen moeite gehad met het communiceren met mijn medestudenten en docenten. Enekele problemen die ik tijdens dit blok tegen kwam heb ik snel kunnen oplossen door vragen te stellen aan de docenten.
Door dagelijks mijn bezigheden te documenteren heb ik een goed overzicht kunnen houden van mijn werkzaamheden dit heeft mij geholpen om snel te kunnen schakelen tussen verschillende taken. Aan het begin van de sprints plannde ik mijn werkzaamheden in en zorgde ik ervoor dat ik mijn werkzaamheden op tijd af had. Ik heb in blok 1 veel tijd gestoken in het voorbereiden en het documenteren van mijn werk. Dit heeft mij geholpen om het beste uit mezelf te halen.
Als ik een aantal sterke en zwakke punten moet noemen van blok 1 dan zijn dat:
@@ -25,9 +36,9 @@ Sterke punten:
- Goed kunnen communiceren
- Snel kunnen schakelen tussen verschillende taken
- Snelle ontwikkeling in nieuwe omgevingen
- Documenteren van het werk
- Voorbereiden van presentaties
- Het beste uit mezelf halen
- Voorbereiden en documenteren van werkzaamheden
- Goed kunnen plannen
- Het meeste uit mezelf halen
Zwakke punten:
- Meer gebruik maken van coding conventions
@@ -35,13 +46,53 @@ Zwakke punten:
Ik heb in blok 1 enorm veel kunnen leren en heb echt het meeste uit mezelf kunnen halen. Ik ben erg tevreden met de resultaten die ik heb behaald en ben blij met de manier waarop ik mezelf heb kunnen ontwikkelen.
![Beoordeling Blok 1](../assets/beoordelingBlok1.png)
### Blok 2
Niet alles op mij nemen en meer vertrouwen hebben in anderen
In blok 2 heb ik voor het eerst moeten samenwerken met een teamgenoot. Aan het begin heb ik veel moeite gehad met het toe vertrouwen van werk aan mijn teamgenoot. Ik heb hier veel van kunnen leren en gerealiseerd dat ik te perfectionistisch aan het werk was. Ik heb in blok 2 veel tijd gestoken in het leren vertrouwen van mijn teamgenoot en het loslaten van de controle. Dit heeft mij geholpen om beter te kunnen samenwerken en om meer te kunnen focussen op mijn eigen werkzaamheden. Een voordeel van deze perfectionistische houding was dat ik de werkzaamheden van het project goed kon overzien en kon bijsturen waar nodig. Door dagelijks eerder aanwezig te zijn heb ik met mijn teamgenoot de tijd kunnen nemen om de werkzaamheden te bespreken en te plannen.
De eerste 2 weken (sprint 1) van blok 2 hebben ik en mijn teamgenoot aan een game gewerkt voor ons project. We hebben uiteindelijk besloten om deze game niet voor te zetten en zijn overgestapt naar een nieuwe game. We hebben allebei de realisatie gehad dat de gekozen game te hoog gegrepen was en dat we beter een andere game konden kiezen. Dit was een goede keuze en heeft ons geholpen om de rest van het project goed te kunnen afronden.
Als ik een aantal sterke en zwakke punten moet noemen van blok 2 dan zijn dat:
Sterke punten:
- Goed kunnen communiceren
- Snel kunnen schakelen tussen verschillende taken
- Snelle ontwikkeling in nieuwe omgevingen
- Inzicht om problemen te voorkomen
Zwakke punten:
- Gebruik maken van UML
- Te perfectionistisch aan het werk
Ik heb in blok 2 veel kunnen leren over het samenwerken met een teamgenoot en het loslaten van de controle. In het begin was dit erg lastig maar naarmate de weken vorderde heb ik hier veel van kunnen leren. De behaalde resultaten in blok 2 zijn goed en ik ben tevreden dat ik controle heb kunnen loslaten en heb kunnen samenwerken met mijn teamgenoot.
![Beoordeling Blok 2](../assets/beoordelingBlok2.png)
### Blok 3
eerder aan de bel trekken wanneer het team niet goed functioneert
Blok 3 is voor mij het blok geweest met de meeste leer punten. Het blok is begonnen met het leren van je nieuwe klas, er is door de opleiding een keuze gemaakt op klassen te vormen met leerlingen van de zelfde richting. Dit hield in dat ik in een nieuwe klas terecht kwam met nieuwe mensen. Dit was voor mij een grote verandering omdat ik gewend was geraakt aan mijn oude klas. Ik hierdoor ook kunnen ontdekken dat ik moeite heb met grote veranderingen. Het onbekende en niet wetende is voor mij een grote uitdaging.
In blok 3 zijn we gaan werken in teams van 4, aan het begin was ik hier erg enthousiast over omdat je met een groter team een beter product neer zou kunnen zetten. Dit bleek in de praktijk toch lastiger dan gedacht. De teams van blok 3 moest je zelf maken en binnen het team moesten leerlingen van de verschillende klassen zitten. Helaas zat niet iedereen binnen het team op het zelfde niveau. Ik heb in de eerste sprint de rol van scrum master op mij genomen. Hierdoor heb ik het project kunnen uitplannen en heb ik een werk structuur voor het team opgezet.
Naarmate het project zich vorderede werdt duidelijk dat het niveau verschil een probleem begon te worden. Halverwege sprint 2 heb ik met een docent gesproken over de problemen binnen het team. Hier uit kwam voort dat een spoed overleg met het team nodig was. Een week later vond dit overleg plaats. Hier uit bleek dat door het niveau verschil maakte dat sommige teamleden niet mee konden komen. Deze leerlingen gingen met hun problemen niet naar de docenten maar vroegen dit aan de andere teamleden. Dit heeft er voor gezorgd dat de andere teamleden niet aan hun eigen werkzaamheden toe kwamen. De uitkomst van dit overleg was de teamleden die niet mee konden komen met hun problemen naar docenten zouden gaan. Als binnen 1 week geen verbetering zou zijn dan zou het team uit elkaar worden gehaald. Na dit overleg is de samenwerking verbeterd maar het niveau verschil bleef een probleem. Dit heeft er voor gezorgd dat het project niet op het gewenste niveau is afgerond.
Als ik een aantal sterke en zwakke punten moet noemen van blok 3 dan zijn dat:
Sterke punten:
- Leiderschap nemen
- Doorzettingsvermogen
- Doelgericht werken
Zwakke punten:
- Moeite met grote veranderingen
- Moeite met onbekende situaties
- Te laat aan de bel trekken bij problemen
In blok 3 heb ik veel kunnen leren over het samenwerken in een team waar niveau verschil is. Ik heb geleerd dat ik eerder deze problemen moet aangeven bij de docenten en niet moet wachten tot het te laat is. Ik heb in blok 3 veel tijd gestoken in het leren van het leiden van een team en het nemen van leiderschap.
![Beoordeling Blok 3](../assets/beoordelingBlok3.png)
## Sterke en zwakke punten (Profesional skills)
@@ -49,14 +100,13 @@ eerder aan de bel trekken wanneer het team niet goed functioneert
## Conclusie
## Profesional skills
https://www.hva.nl/binaries/content/assets/serviceplein-a-z/media-creatie-en-informatie/hbo-ict/competenties/professional-skills-hbo-ict-2023-2024.pdf
De vier profecional skills:
- Toekomstgericht organiseren
- Onderzoekend probleemoplossen
- Persoonlijk leiderschap
- Doelgericht interacteren
* Toekomstgericht organiseren
* Onderzoekend probleemoplossen
* Persoonlijk leiderschap
* Doelgericht interacteren

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

View File

@@ -255,6 +255,14 @@ Done
**18 May**
- Weekend
**19 May**
- Weekend
**20 May**
To do
- LDR sensor
@@ -262,43 +270,27 @@ To do
Done
-
**19 May**
To do
-
Done
-
**20 May**
To do
-
Done
-
- Ethics research
**21 May**
To do
-
- Ethics research besrpeken met pieta
- Skill ontwikkeling plan
- LDR sensor
Done
-
- Ethics research besrpeken met pieta
- LDR sensor
**22 May**
To do
-
- Skill ontwikkeling plan
- Fitness activity videos/database
Done

View File

@@ -1,18 +0,0 @@
# Hoofd en deelvragen met bronnen
## Hoofdvraag
Hoe beïnvloedt de opkomst van robots in de ouderenzorg de kwaliteit van leven en menselijke interactie van ouderen
## Deelvragen
1. Wat zijn de voor en nadelen van robots in de ouderenzorg?
2. Wat zijn de verschillen in communicatie tussen mens en robot?
3. Hoe voelen ouderen zich bij de vervanging van menselijke communicatie met robots?
## Bronnen
* [Socially Assistive Robots in Elderly Care: A Systematic Review into Effects and Effectiveness](https://www.sciencedirect.com/science/article/abs/pii/S1525861010003476)
* [Socially Assistive Robots in Elderly Care: A Mixed-Method Systematic Literature Review](https://www.tandfonline.com/doi/abs/10.1080/10447318.2013.873278)
* [Scoping review on the use of socially assistive robot technology in elderly care](https://bmjopen.bmj.com/content/8/2/e018815.abstract)
* [A critique of robotics in health care](https://link.springer.com/article/10.1007/s00146-021-01206-z)
* [The use of care robots in aged care: A systematic review of argument-based ethics literature](https://www.sciencedirect.com/science/article/pii/S0167494317302790)
* [Significant challenges when introducing care robots in Swedish elder care](https://www.tandfonline.com/doi/abs/10.1080/17483107.2020.1773549)
* [Ethical challenges in the use of social service robots for elderly people](https://link.springer.com/article/10.1007/s00391-016-1066-5)