From 31a09ae3d0ea8edb242faf4f6ebf993abf1805a9 Mon Sep 17 00:00:00 2001 From: HanaeRateau Date: Tue, 21 Apr 2026 11:15:25 +0200 Subject: [PATCH 01/11] Adds solution blocks --- labs/lab_models/sections/2_beammodels.md | 2 ++ labs/lab_models/sections/4_comparison.md | 2 ++ 2 files changed, 4 insertions(+) diff --git a/labs/lab_models/sections/2_beammodels.md b/labs/lab_models/sections/2_beammodels.md index b72d4ae..fe2a72a 100644 --- a/labs/lab_models/sections/2_beammodels.md +++ b/labs/lab_models/sections/2_beammodels.md @@ -96,5 +96,7 @@ the values, and save the changes (ctrl + s). #runsofa-button("assets/labs/lab_models/lab_models.py", "blueleg", "modelsexo1") +#solution(file="solutions/lab_models/answers.md", id="parameters") + ::::: :::::: diff --git a/labs/lab_models/sections/4_comparison.md b/labs/lab_models/sections/4_comparison.md index 6ab1653..84e2ef5 100644 --- a/labs/lab_models/sections/4_comparison.md +++ b/labs/lab_models/sections/4_comparison.md @@ -13,6 +13,7 @@ predict the behavior of a continuum robot, especially when the model is used for ::: :::: + :::: quiz **Question 2:** ::: question What are the disadvantages of using beam models, compared to volume models? @@ -49,4 +50,5 @@ for global structural analyses, contact management, or multi-physics coupling wi ::: :::: +#solution(file="solutions/lab_models/answers.md", id="quiz") :::::: \ No newline at end of file From 3029c4798a972e8af0f2fd20ebb7ac32dedd3d80 Mon Sep 17 00:00:00 2001 From: HanaeRateau Date: Tue, 21 Apr 2026 14:57:46 +0200 Subject: [PATCH 02/11] Format inversekinematics for solutions --- labs/lab_inversekinematics/sections/2_kinematics.md | 2 ++ labs/lab_inversekinematics/sections/3_inversekinematics.md | 2 ++ labs/lab_inversekinematics/sections/4_modelscomparison.md | 1 + 3 files changed, 5 insertions(+) diff --git a/labs/lab_inversekinematics/sections/2_kinematics.md b/labs/lab_inversekinematics/sections/2_kinematics.md index 0038f3f..0a16713 100644 --- a/labs/lab_inversekinematics/sections/2_kinematics.md +++ b/labs/lab_inversekinematics/sections/2_kinematics.md @@ -142,5 +142,7 @@ Also observe if and when some combinations of legs and connector configuration l 2. What is the most *stable* configuration of the robot you have found (i.e. on which there is no mechanical instabilities)? #runsofa-button(file="assets/labs/lab_inversekinematics/lab_inversekinematics.py", pyargs=["--legsName", "blueleg-direct", "--legsModel", "beam", "--legsPositionOnMotor", "exo1motor1orientation", "exo1motor2orientation", "exo1motor3orientation", "exo1motor4orientation", "--centerPartName", "exo1centerpart"]) + +#solution(file="solutions/lab_inversekinematics/answers.md", id="exercise-1") :::::: ::::::: diff --git a/labs/lab_inversekinematics/sections/3_inversekinematics.md b/labs/lab_inversekinematics/sections/3_inversekinematics.md index 5bb5216..3f93d46 100644 --- a/labs/lab_inversekinematics/sections/3_inversekinematics.md +++ b/labs/lab_inversekinematics/sections/3_inversekinematics.md @@ -127,5 +127,7 @@ you change the file `myQP_lab_inversekinematics.py`, you will need to close and #runsofa-button(file="assets/labs/lab_inversekinematics/lab_inversekinematics.py", pyargs=["--legsName", "blueleg", "--legsModel", "beam", "--legsPositionOnMotor", "counterclockwisedown", "clockwisedown", "counterclockwisedown", "clockwisedown", "--centerPartName", "bluepart"]) +#solution(file="solutions/lab_inversekinematics/answers.md", id="exercise-2") + :::: ::::: diff --git a/labs/lab_inversekinematics/sections/4_modelscomparison.md b/labs/lab_inversekinematics/sections/4_modelscomparison.md index e427c7a..0a21a1f 100644 --- a/labs/lab_inversekinematics/sections/4_modelscomparison.md +++ b/labs/lab_inversekinematics/sections/4_modelscomparison.md @@ -36,5 +36,6 @@ between the two green and red spheres (you can also use the *Plotting* tab). #runsofa-button(file="assets/labs/lab_inversekinematics/lab_inversekinematics.py", pyargs=["--legsName", "whiteleg", "--legsModel", "exo3model", "--legsPositionOnMotor", "counterclockwisedown", "clockwisedown", "counterclockwisedown", "clockwisedown", "--centerPartName", "bluepart"]) +#solution(file="solutions/lab_inversekinematics/answers.md", id="exercise-3") ::::: :::::: From 09fdf8af6b63c77cbbd52ade6a30619f8c92d1ba Mon Sep 17 00:00:00 2001 From: HanaeRateau Date: Tue, 21 Apr 2026 15:33:39 +0200 Subject: [PATCH 03/11] Adds solution to pick and place project --- labs/project_pickandplace/project_pickandplace.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/labs/project_pickandplace/project_pickandplace.md b/labs/project_pickandplace/project_pickandplace.md index d0448d6..f2836d6 100644 --- a/labs/project_pickandplace/project_pickandplace.md +++ b/labs/project_pickandplace/project_pickandplace.md @@ -71,6 +71,14 @@ including the soft gripper's 4th DoF. This will involve picking up the cube from #runsofa-button(file="assets/labs/project_pickandplace/project_pickandplace.py") +::: solution pickandplace + +You can import the following program into Sofa Robotics. + +#open-button(file="solutions/project_pickandplace") + +::: + :::: ::::: From cf92f9839e5bc5974cbf828c6b4d47d203115d6f Mon Sep 17 00:00:00 2001 From: HanaeRateau Date: Tue, 21 Apr 2026 15:51:31 +0200 Subject: [PATCH 04/11] Adds solution to lab design: --- labs/lab_design/lab_design.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/labs/lab_design/lab_design.md b/labs/lab_design/lab_design.md index 7cf3eb9..5fabac0 100644 --- a/labs/lab_design/lab_design.md +++ b/labs/lab_design/lab_design.md @@ -67,6 +67,10 @@ Emio's legs (and gripper) were printed using TPU [filament](https://shop3d.ca/co #include(assets/labs/lab_design/sections/4_iterations.md) #include(assets/labs/lab_design/sections/5_deformablegripper.md) +:::: solution labdesign +#include(solutions/lab_design/answers.md) +:::: + ::: highlight #icon("user-circle") **Authors: [Quentin Peyron](https://www.linkedin.com/in/quentin-peyron-22924683/?originalSubdomain=fr) & Compliance Robotics** From 19cd3c37a1e1e54fb861a7b6ef785001d9a3bbdd Mon Sep 17 00:00:00 2001 From: HanaeRateau Date: Tue, 21 Apr 2026 16:12:29 +0200 Subject: [PATCH 05/11] Adds solutions for lab closed loop --- labs/lab_closedloop/sections/1_openloopcontrol.md | 2 ++ labs/lab_closedloop/sections/2_proportionalcontroller.md | 2 ++ labs/lab_closedloop/sections/3_integralcontroller.md | 2 ++ labs/lab_closedloop/sections/4_improvecontroller.md | 2 ++ 4 files changed, 8 insertions(+) diff --git a/labs/lab_closedloop/sections/1_openloopcontrol.md b/labs/lab_closedloop/sections/1_openloopcontrol.md index 2bf2474..4d0c1c2 100644 --- a/labs/lab_closedloop/sections/1_openloopcontrol.md +++ b/labs/lab_closedloop/sections/1_openloopcontrol.md @@ -54,4 +54,6 @@ Choose some target points and try to reach them. Then: #runsofa-button(file="assets/labs/lab_closedloop/lab_closedloop.py") :::: +#solution(file="solutions/lab_closedloop/answers.md", id="open-loop") + ::::: diff --git a/labs/lab_closedloop/sections/2_proportionalcontroller.md b/labs/lab_closedloop/sections/2_proportionalcontroller.md index f26b7a9..e9d09b7 100644 --- a/labs/lab_closedloop/sections/2_proportionalcontroller.md +++ b/labs/lab_closedloop/sections/2_proportionalcontroller.md @@ -42,6 +42,8 @@ This controller is composed of a feedforward $q_{user}$ and a feedback part $k_p #open-button(file="assets/labs/lab_closedloop/myControl.py") #runsofa-button(file="assets/labs/lab_closedloop/lab_closedloop.py") + +#solution(file="solutions/lab_closedloop/answers.md", id="proportional") :::: ::::: diff --git a/labs/lab_closedloop/sections/3_integralcontroller.md b/labs/lab_closedloop/sections/3_integralcontroller.md index 1e00650..01b0782 100644 --- a/labs/lab_closedloop/sections/3_integralcontroller.md +++ b/labs/lab_closedloop/sections/3_integralcontroller.md @@ -23,6 +23,8 @@ admissible value for the robot otherwise the robot might go crazy. #open-button(file="assets/labs/lab_closedloop/myControl.py") #runsofa-button(file="assets/labs/lab_closedloop/lab_closedloop.py") + +#solution(file="solutions/lab_closedloop/answers.md", id="integral") :::: ::::: \ No newline at end of file diff --git a/labs/lab_closedloop/sections/4_improvecontroller.md b/labs/lab_closedloop/sections/4_improvecontroller.md index 6907c2e..dc24aa9 100644 --- a/labs/lab_closedloop/sections/4_improvecontroller.md +++ b/labs/lab_closedloop/sections/4_improvecontroller.md @@ -23,5 +23,7 @@ from the effector position. #open-button(file="assets/labs/lab_closedloop/myControl.py") #runsofa-button(file="assets/labs/lab_closedloop/lab_closedloop.py") + +#solution(file="solutions/lab_closedloop/answers.md", id="improvement") :::: ::::: \ No newline at end of file From 800965f353ba6f0c5ac0daf991d8ae2d6b5b14e3 Mon Sep 17 00:00:00 2001 From: HanaeRateau Date: Mon, 27 Apr 2026 15:59:30 +0200 Subject: [PATCH 06/11] Adds empty solutions folder to assets --- solutions/.gitignore | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 solutions/.gitignore diff --git a/solutions/.gitignore b/solutions/.gitignore new file mode 100644 index 0000000..0baf103 --- /dev/null +++ b/solutions/.gitignore @@ -0,0 +1,5 @@ +# Ignore everything in this directory +* + +# Except this file +!.gitignore \ No newline at end of file From 6d3dcde96a17223c9871f88f8d97a584da8500a5 Mon Sep 17 00:00:00 2001 From: HanaeRateau Date: Tue, 28 Apr 2026 13:30:14 +0200 Subject: [PATCH 07/11] Updates path to solutions --- labs/lab_closedloop/sections/1_openloopcontrol.md | 2 +- labs/lab_closedloop/sections/2_proportionalcontroller.md | 2 +- labs/lab_closedloop/sections/3_integralcontroller.md | 2 +- labs/lab_closedloop/sections/4_improvecontroller.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/labs/lab_closedloop/sections/1_openloopcontrol.md b/labs/lab_closedloop/sections/1_openloopcontrol.md index 4d0c1c2..24cb1c6 100644 --- a/labs/lab_closedloop/sections/1_openloopcontrol.md +++ b/labs/lab_closedloop/sections/1_openloopcontrol.md @@ -54,6 +54,6 @@ Choose some target points and try to reach them. Then: #runsofa-button(file="assets/labs/lab_closedloop/lab_closedloop.py") :::: -#solution(file="solutions/lab_closedloop/answers.md", id="open-loop") +#solution(file="assets/solutions/lab_closedloop/answers.md", id="open-loop") ::::: diff --git a/labs/lab_closedloop/sections/2_proportionalcontroller.md b/labs/lab_closedloop/sections/2_proportionalcontroller.md index e9d09b7..47bbbf6 100644 --- a/labs/lab_closedloop/sections/2_proportionalcontroller.md +++ b/labs/lab_closedloop/sections/2_proportionalcontroller.md @@ -43,7 +43,7 @@ This controller is composed of a feedforward $q_{user}$ and a feedback part $k_p #runsofa-button(file="assets/labs/lab_closedloop/lab_closedloop.py") -#solution(file="solutions/lab_closedloop/answers.md", id="proportional") +#solution(file="assets/solutions/lab_closedloop/answers.md", id="proportional") :::: ::::: diff --git a/labs/lab_closedloop/sections/3_integralcontroller.md b/labs/lab_closedloop/sections/3_integralcontroller.md index 01b0782..db85022 100644 --- a/labs/lab_closedloop/sections/3_integralcontroller.md +++ b/labs/lab_closedloop/sections/3_integralcontroller.md @@ -24,7 +24,7 @@ admissible value for the robot otherwise the robot might go crazy. #runsofa-button(file="assets/labs/lab_closedloop/lab_closedloop.py") -#solution(file="solutions/lab_closedloop/answers.md", id="integral") +#solution(file="assets/solutions/lab_closedloop/answers.md", id="integral") :::: ::::: \ No newline at end of file diff --git a/labs/lab_closedloop/sections/4_improvecontroller.md b/labs/lab_closedloop/sections/4_improvecontroller.md index dc24aa9..4f36b30 100644 --- a/labs/lab_closedloop/sections/4_improvecontroller.md +++ b/labs/lab_closedloop/sections/4_improvecontroller.md @@ -24,6 +24,6 @@ from the effector position. #runsofa-button(file="assets/labs/lab_closedloop/lab_closedloop.py") -#solution(file="solutions/lab_closedloop/answers.md", id="improvement") +#solution(file="assets/solutions/lab_closedloop/answers.md", id="improvement") :::: ::::: \ No newline at end of file From 7119e3c21bf3c20f3b67f3d227aa47fc46bcf9a1 Mon Sep 17 00:00:00 2001 From: HanaeRateau Date: Tue, 28 Apr 2026 13:38:28 +0200 Subject: [PATCH 08/11] Updates lab design solution paths --- labs/lab_design/lab_design.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/labs/lab_design/lab_design.md b/labs/lab_design/lab_design.md index 5fabac0..1d18a7b 100644 --- a/labs/lab_design/lab_design.md +++ b/labs/lab_design/lab_design.md @@ -68,7 +68,7 @@ Emio's legs (and gripper) were printed using TPU [filament](https://shop3d.ca/co #include(assets/labs/lab_design/sections/5_deformablegripper.md) :::: solution labdesign -#include(solutions/lab_design/answers.md) +#include(assets/solutions/lab_design/answers.md) :::: ::: highlight From 2dcc5d30897b3aae4b2305feb71fb0cc00f34aaf Mon Sep 17 00:00:00 2001 From: HanaeRateau Date: Tue, 28 Apr 2026 13:42:34 +0200 Subject: [PATCH 09/11] Updates lab inverse solution paths --- labs/lab_inversekinematics/sections/2_kinematics.md | 2 +- labs/lab_inversekinematics/sections/3_inversekinematics.md | 2 +- labs/lab_inversekinematics/sections/4_modelscomparison.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/labs/lab_inversekinematics/sections/2_kinematics.md b/labs/lab_inversekinematics/sections/2_kinematics.md index 0a16713..695288a 100644 --- a/labs/lab_inversekinematics/sections/2_kinematics.md +++ b/labs/lab_inversekinematics/sections/2_kinematics.md @@ -143,6 +143,6 @@ Also observe if and when some combinations of legs and connector configuration l #runsofa-button(file="assets/labs/lab_inversekinematics/lab_inversekinematics.py", pyargs=["--legsName", "blueleg-direct", "--legsModel", "beam", "--legsPositionOnMotor", "exo1motor1orientation", "exo1motor2orientation", "exo1motor3orientation", "exo1motor4orientation", "--centerPartName", "exo1centerpart"]) -#solution(file="solutions/lab_inversekinematics/answers.md", id="exercise-1") +#solution(file="assets/solutions/lab_inversekinematics/answers.md", id="exercise-1") :::::: ::::::: diff --git a/labs/lab_inversekinematics/sections/3_inversekinematics.md b/labs/lab_inversekinematics/sections/3_inversekinematics.md index 3f93d46..b3bab01 100644 --- a/labs/lab_inversekinematics/sections/3_inversekinematics.md +++ b/labs/lab_inversekinematics/sections/3_inversekinematics.md @@ -127,7 +127,7 @@ you change the file `myQP_lab_inversekinematics.py`, you will need to close and #runsofa-button(file="assets/labs/lab_inversekinematics/lab_inversekinematics.py", pyargs=["--legsName", "blueleg", "--legsModel", "beam", "--legsPositionOnMotor", "counterclockwisedown", "clockwisedown", "counterclockwisedown", "clockwisedown", "--centerPartName", "bluepart"]) -#solution(file="solutions/lab_inversekinematics/answers.md", id="exercise-2") +#solution(file="assets/solutions/lab_inversekinematics/answers.md", id="exercise-2") :::: ::::: diff --git a/labs/lab_inversekinematics/sections/4_modelscomparison.md b/labs/lab_inversekinematics/sections/4_modelscomparison.md index 0a21a1f..d38ada9 100644 --- a/labs/lab_inversekinematics/sections/4_modelscomparison.md +++ b/labs/lab_inversekinematics/sections/4_modelscomparison.md @@ -36,6 +36,6 @@ between the two green and red spheres (you can also use the *Plotting* tab). #runsofa-button(file="assets/labs/lab_inversekinematics/lab_inversekinematics.py", pyargs=["--legsName", "whiteleg", "--legsModel", "exo3model", "--legsPositionOnMotor", "counterclockwisedown", "clockwisedown", "counterclockwisedown", "clockwisedown", "--centerPartName", "bluepart"]) -#solution(file="solutions/lab_inversekinematics/answers.md", id="exercise-3") +#solution(file="assets/solutions/lab_inversekinematics/answers.md", id="exercise-3") ::::: :::::: From a9d772bcbc3c5bcb64434a262f5114010b7060b1 Mon Sep 17 00:00:00 2001 From: HanaeRateau Date: Tue, 28 Apr 2026 13:47:33 +0200 Subject: [PATCH 10/11] Updates lab models solution paths --- labs/lab_models/sections/2_beammodels.md | 2 +- labs/lab_models/sections/4_comparison.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/labs/lab_models/sections/2_beammodels.md b/labs/lab_models/sections/2_beammodels.md index 4016972..288e35b 100644 --- a/labs/lab_models/sections/2_beammodels.md +++ b/labs/lab_models/sections/2_beammodels.md @@ -96,7 +96,7 @@ the values, and save the changes (ctrl + s). #runsofa-button(file="assets/labs/lab_models/lab_models.py", pyargs=["blueleg", "modelsexo1"]) -#solution(file="solutions/lab_models/answers.md", id="parameters") +#solution(file="assets/solutions/lab_models/answers.md", id="parameters") ::::: :::::: diff --git a/labs/lab_models/sections/4_comparison.md b/labs/lab_models/sections/4_comparison.md index 84e2ef5..d261124 100644 --- a/labs/lab_models/sections/4_comparison.md +++ b/labs/lab_models/sections/4_comparison.md @@ -50,5 +50,5 @@ for global structural analyses, contact management, or multi-physics coupling wi ::: :::: -#solution(file="solutions/lab_models/answers.md", id="quiz") +#solution(file="assets/solutions/lab_models/answers.md", id="quiz") :::::: \ No newline at end of file From 17e2595994282a4dc6dbfc3d613ac370ab927257 Mon Sep 17 00:00:00 2001 From: HanaeRateau Date: Tue, 28 Apr 2026 13:49:27 +0200 Subject: [PATCH 11/11] Updates pick and place solution paths --- labs/project_pickandplace/project_pickandplace.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/labs/project_pickandplace/project_pickandplace.md b/labs/project_pickandplace/project_pickandplace.md index f2836d6..d52bcb4 100644 --- a/labs/project_pickandplace/project_pickandplace.md +++ b/labs/project_pickandplace/project_pickandplace.md @@ -75,7 +75,7 @@ including the soft gripper's 4th DoF. This will involve picking up the cube from You can import the following program into Sofa Robotics. -#open-button(file="solutions/project_pickandplace") +#open-button(file="assets/solutions/project_pickandplace") :::