phd-test-bench-flexible-joints/test-bench-flexible-joints.org

1376 lines
52 KiB
Org Mode
Raw Normal View History

2024-03-19 15:18:31 +01:00
#+TITLE: Flexible Joints - Test Bench
:DRAWER:
#+LANGUAGE: en
#+EMAIL: dehaeze.thomas@gmail.com
#+AUTHOR: Dehaeze Thomas
#+HTML_LINK_HOME: ../index.html
#+HTML_LINK_UP: ../index.html
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="https://research.tdehaeze.xyz/css/style.css"/>
#+HTML_HEAD: <script type="text/javascript" src="https://research.tdehaeze.xyz/js/script.js"></script>
#+BIND: org-latex-image-default-option "scale=1"
#+BIND: org-latex-image-default-width ""
#+LaTeX_CLASS: scrreprt
#+LaTeX_CLASS_OPTIONS: [a4paper, 10pt, DIV=12, parskip=full, bibliography=totoc]
#+LaTeX_HEADER_EXTRA: \input{preamble.tex}
#+LATEX_HEADER_EXTRA: \bibliography{test-bench-flexible-joints.bib}
#+BIND: org-latex-bib-compiler "biber"
#+PROPERTY: header-args:matlab :session *MATLAB*
#+PROPERTY: header-args:matlab+ :comments org
#+PROPERTY: header-args:matlab+ :exports none
#+PROPERTY: header-args:matlab+ :results none
#+PROPERTY: header-args:matlab+ :eval no-export
#+PROPERTY: header-args:matlab+ :noweb yes
#+PROPERTY: header-args:matlab+ :mkdirp yes
#+PROPERTY: header-args:matlab+ :output-dir figs
#+PROPERTY: header-args:matlab+ :tangle no
#+PROPERTY: header-args:latex :headers '("\\usepackage{tikz}" "\\usepackage{import}" "\\import{$HOME/Cloud/tikz/org/}{config.tex}")
#+PROPERTY: header-args:latex+ :imagemagick t :fit yes
#+PROPERTY: header-args:latex+ :iminoptions -scale 100% -density 150
#+PROPERTY: header-args:latex+ :imoutoptions -quality 100
#+PROPERTY: header-args:latex+ :results file raw replace
#+PROPERTY: header-args:latex+ :buffer no
#+PROPERTY: header-args:latex+ :tangle no
#+PROPERTY: header-args:latex+ :eval no-export
#+PROPERTY: header-args:latex+ :exports results
#+PROPERTY: header-args:latex+ :mkdirp yes
#+PROPERTY: header-args:latex+ :output-dir figs
#+PROPERTY: header-args:latex+ :post pdf2svg(file=*this*, ext="png")
:END:
#+begin_export html
<hr>
<p>This report is also available as a <a href="./test-bench-flexible-joints.pdf">pdf</a>.</p>
<hr>
#+end_export
#+latex: \clearpage
* Build :noexport:
#+NAME: startblock
#+BEGIN_SRC emacs-lisp :results none :tangle no
(add-to-list 'org-latex-classes
'("scrreprt"
"\\documentclass{scrreprt}"
("\\chapter{%s}" . "\\chapter*{%s}")
("\\section{%s}" . "\\section*{%s}")
("\\subsection{%s}" . "\\subsection*{%s}")
("\\paragraph{%s}" . "\\paragraph*{%s}")
))
;; Remove automatic org heading labels
(defun my-latex-filter-removeOrgAutoLabels (text backend info)
"Org-mode automatically generates labels for headings despite explicit use of `#+LABEL`. This filter forcibly removes all automatically generated org-labels in headings."
(when (org-export-derived-backend-p backend 'latex)
(replace-regexp-in-string "\\\\label{sec:org[a-f0-9]+}\n" "" text)))
(add-to-list 'org-export-filter-headline-functions
'my-latex-filter-removeOrgAutoLabels)
;; Remove all org comments in the output LaTeX file
(defun delete-org-comments (backend)
(loop for comment in (reverse (org-element-map (org-element-parse-buffer)
'comment 'identity))
do
(setf (buffer-substring (org-element-property :begin comment)
(org-element-property :end comment))
"")))
(add-hook 'org-export-before-processing-hook 'delete-org-comments)
;; Use no package by default
(setq org-latex-packages-alist nil)
(setq org-latex-default-packages-alist nil)
;; Do not include the subtitle inside the title
(setq org-latex-subtitle-separate t)
(setq org-latex-subtitle-format "\\subtitle{%s}")
(setq org-export-before-parsing-hook '(org-ref-glossary-before-parsing
org-ref-acronyms-before-parsing))
#+END_SRC
* Notes :noexport:
2024-03-25 10:01:56 +01:00
Prefix for figures/section/tables =test_joints=
2024-03-19 17:36:39 +01:00
2024-03-19 15:18:31 +01:00
Compilation of the following reports:
2024-03-25 10:01:56 +01:00
- [X] [[file:~/Cloud/work-projects/ID31-NASS/matlab/test-bench-flexible-joints-old/index.org][test-bench-flexible-joints-adv]]
Ideas of measuring shear stiffness, axial stiffness and torsion
Not done in the end
- [X] [[/home/thomas/Cloud/work-projects/ID31-NASS/matlab/test-bench-flexible-joints-old/bending.org][bending measurement]]
Some possible errors when measuring bending stiffness
- [X] [[file:~/Cloud/documents/internships/2021-martin-reichert/Bachelor thesis.pdf][Report of Martin]]
Analytical estimation of the stiffness
Estimation of possible errors in the estimation of the stiffness
May not be useful here.
2024-03-19 17:36:39 +01:00
- [X] [[file:~/Cloud/work-projects/ID31-NASS/matlab/test-bench-nass-flexible-joints/test-bench-flexible-joints.org][test-bench-nass-flexible-joints]]
2024-03-25 10:01:56 +01:00
Here only the bending stiffness is measured
2024-03-19 17:36:39 +01:00
- [ ] Also check start of this report: [[file:~/Cloud/work-projects/ID31-NASS/matlab/nass-simscape/org/nano_hexapod.org][nano_hexapod]]
2024-03-25 10:01:56 +01:00
Model of the flexible joints
Maybe add a section for the model of the flexible joints (of maybe this was done in the "detailed design" section?)
2024-04-04 17:38:22 +02:00
- [X] Maybe say that some flexible joints where not machined properly (show picture with deformed machining and one with "chips" stuck inside)
- [X] Explain why the encoder is here: in line with the measurement, no "abbe errors"
2024-03-25 10:01:56 +01:00
Goal:
- Characterization of flexible joints:
- Remind the specifications
- Most important: bending stiffness
- Dimensional measurement
- Presentation of test bench to measure stiffness
- Possible measurement errors and how to prevent them
- Calibration of force sensor
- Section 6 is most important: measurement results
- Conclusion
2024-03-19 15:18:31 +01:00
2024-04-04 17:38:22 +02:00
** TODO [#B] Add symbols for the different characteristics
- Axial Stiffness: $k_z$
- Shear Stiffness: $k_x$, $k_y$
- Bending Stiffness: $k_{R_x}$, $k_{R_y}$
- Torsion Stiffness: $k_{R_z}$
- Bending Stroke: $\theta_{R_x\text{max}}$, $\theta_{R_y\text{max}}$
- Torsion Stroke: $\theta_{R_z\text{max}}$
2024-03-19 15:18:31 +01:00
2024-03-25 10:01:56 +01:00
* Introduction :ignore:
2024-03-19 17:36:39 +01:00
2024-04-04 17:38:22 +02:00
At both ends of the nano-hexapod struts, a flexible spherical joint is used.
Ideally, these flexible joints would behave as perfect spherical joints, that is to say no bending and torsional stiffnesses, infinite shear and axial stiffnesses, unlimited bending and torsional stroke, no friction and no backlash.
2024-03-19 17:36:39 +01:00
2024-04-04 17:38:22 +02:00
Deviations from this ideal properties will impact the dynamics of the Nano-Hexapod and could limit the attainable performances.
During the detailed design phase, specifications in term of stiffness and stroke have been determined and are summarized in Table ref:tab:test_joints_specs.
2024-03-19 17:36:39 +01:00
2024-03-25 10:01:56 +01:00
#+name: tab:test_joints_specs
2024-03-19 17:36:39 +01:00
#+caption: Specifications for the flexible joints and estimated characteristics from the Finite Element Model
#+attr_latex: :environment tabularx :width 0.5\linewidth :align Xcc
#+attr_latex: :center t :booktabs t :float t
2024-03-25 10:01:56 +01:00
| | *Specification* | *FEM* |
|-------------------+------------------------+-------|
| Axial Stiffness | $> 100\,N/\mu m$ | 94 |
| Shear Stiffness | $> 1\,N/\mu m$ | 13 |
| Bending Stiffness | $< 100\,Nm/\text{rad}$ | 5 |
| Torsion Stiffness | $< 500\,Nm/\text{rad}$ | 260 |
| Bending Stroke | $> 1\,\text{mrad}$ | 24.5 |
| Torsion Stroke | $> 5\,\mu\text{rad}$ | |
2024-04-04 17:38:22 +02:00
After optimization using a finite element model, the geometry shown in Figure ref:fig:test_joints_schematic has been obtained and the corresponding flexible joints characteristics are summarized in Table ref:tab:test_joints_specs.
This flexible joint is a monolithic piece of stainless steel[fn:1] manufactured using wire electrical discharge machining.
It serves several functions as shown in Figure ref:fig:test_joints_iso, such as:
- Rigid interfacing with the nano-hexapod plates (yellow surfaces)
- Rigid interfacing with the amplified piezoelectric actuator (blue surface)
- Allow two rotations between the "yellow" and the "blue" interfaces.
The rotation axes are represented by the dashed lines which are intersecting
#+name: fig:test_joints_schematic
#+caption: Geometry of the optimized flexible joints
#+attr_latex: :options [htbp]
#+begin_figure
#+attr_latex: :caption \subcaption{\label{fig:test_joints_iso}ISO view}
#+attr_latex: :options {0.39\textwidth}
#+begin_subfigure
#+attr_latex: :scale 1
[[file:figs/test_joints_iso.png]]
#+end_subfigure
#+attr_latex: :caption \subcaption{\label{fig:test_joints_yz_plane}YZ plane}
#+attr_latex: :options {0.3\textwidth}
#+begin_subfigure
#+attr_latex: :scale 1
[[file:figs/test_joints_yz_plane.png]]
#+end_subfigure
#+attr_latex: :caption \subcaption{\label{fig:test_joints_xz_plane}XZ plane}
#+attr_latex: :options {0.3\textwidth}
#+begin_subfigure
#+attr_latex: :scale 1
[[file:figs/test_joints_xz_plane.png]]
#+end_subfigure
#+end_figure
2024-03-19 17:36:39 +01:00
2024-04-04 17:38:22 +02:00
16 flexible joints have been ordered (shown in Figure ref:fig:test_joints_received) such some selection can be made for the 12 that will be used on the nano-hexapod.
2024-03-19 17:36:39 +01:00
2024-03-25 10:01:56 +01:00
#+name: fig:test_joints_received
2024-03-19 17:36:39 +01:00
#+caption: 15 of the 16 flexible joints
2024-04-04 17:38:22 +02:00
#+attr_latex: :width 0.8\linewidth
2024-03-25 10:01:56 +01:00
[[file:figs/test_joints_received.jpg]]
2024-04-04 17:38:22 +02:00
In this document, the received flexible joints are characterize to make sure they are fulfilling the requirements and such that they can well be modelled.
2024-03-25 10:01:56 +01:00
2024-04-04 17:38:22 +02:00
First, the flexible joints are visually inspected, and the minimum gaps (responsible for most of the joint compliance) are measured (Section ref:sec:test_joints_flex_dim_meas).
Then, a test bench is developed to measure the bending stiffness of the flexible joints.
The development of this test bench is presented in Section ref:sec:test_joints_test_bench_desc, including a noise budget and some requirements in terms of instrumentation.
Finally, the test bench is manufacturer and used to measure the bending stiffnesses of all the flexible joints.
Results are shown in Section ref:sec:test_joints_bending_stiffness_meas
2024-03-25 10:01:56 +01:00
#+name: tab:test_joints_section_matlab_code
#+caption: Report sections and corresponding Matlab files
#+attr_latex: :environment tabularx :width 0.6\linewidth :align lX
#+attr_latex: :center t :booktabs t
2024-04-04 17:38:22 +02:00
| *Sections* | *Matlab File* |
|----------------------------------------------------+--------------------------------------|
| Section ref:sec:test_joints_flex_dim_meas | =test_joints_1_dim_meas.m= |
| Section ref:sec:test_joints_test_bench_desc | =test_joints_2_bench_dimensioning.m= |
| Section ref:sec:test_joints_bending_stiffness_meas | =test_joints_3_bending_stiff_meas.m= |
2024-03-19 17:36:39 +01:00
2024-04-04 17:38:22 +02:00
* Flexible Joints Model :noexport:
<<sec:test_joints_conf_flexible_joint>>
2024-03-19 17:36:39 +01:00
2024-04-04 17:38:22 +02:00
The model of the flexible joint is composed of 3 solid bodies as shown in Figure [[fig:simscape_model_flexible_joint]] which are connected by joints representing the flexibility of the joint.
2024-03-19 17:36:39 +01:00
2024-04-04 17:38:22 +02:00
We can represent:
- the bending flexibility $k_{R_x}$, $k_{R_y}$
- the torsional flexibility $k_{R_z}$
- the axial flexibility $k_z$
2024-03-19 17:36:39 +01:00
2024-04-04 17:38:22 +02:00
The configurations and the represented flexibilities are summarized in Table [[tab:flex_type_conf]].
2024-03-19 17:36:39 +01:00
2024-04-04 17:38:22 +02:00
#+name: tab:flex_type_conf
#+caption: Flexible joint's configuration and associated represented flexibility
#+attr_latex: :environment tabularx :width 0.6\linewidth :align lXXX
#+attr_latex: :center t :booktabs t :float t
| =flex_type= | Bending | Torsional | Axial |
|-------------+---------+-----------+-------|
| =2dof= | x | | |
| =3dof= | x | x | |
| =4dof= | x | x | x |
2024-03-19 17:36:39 +01:00
2024-04-04 17:38:22 +02:00
Of course, adding more DoF for the flexible joint will induce an addition of many states for the nano-hexapod simscape model.
2024-03-19 17:36:39 +01:00
2024-04-04 17:38:22 +02:00
#+name: fig:simscape_model_flexible_joint
#+caption: 3D view of the Sismcape model for the Flexible joint (4DoF configuration)
#+attr_latex: :width 0.8\linewidth
[[file:figs/simscape_model_flexible_joint.png]]
2024-03-19 17:36:39 +01:00
2024-04-04 17:38:22 +02:00
* Dimensional Measurements
:PROPERTIES:
:header-args:matlab+: :tangle matlab/test_joints_1_dim_meas.m
:END:
<<sec:test_joints_flex_dim_meas>>
2024-03-19 17:36:39 +01:00
** Matlab Init :noexport:ignore:
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
<<matlab-dir>>
#+end_src
#+begin_src matlab :exports none :results silent :noweb yes
<<matlab-init>>
#+end_src
2024-03-25 10:01:56 +01:00
#+begin_src matlab :tangle no :noweb yes
<<m-init-path>>
2024-03-19 17:36:39 +01:00
#+end_src
2024-03-25 10:01:56 +01:00
#+begin_src matlab :eval no :noweb yes
<<m-init-path-tangle>>
#+end_src
#+begin_src matlab :noweb yes
<<m-init-other>>
2024-03-19 17:36:39 +01:00
#+end_src
2024-04-04 17:38:22 +02:00
** Measurement Bench
2024-03-19 17:36:39 +01:00
2024-04-04 17:38:22 +02:00
The dimensions of the flexible part in the Y-Z plane will contribute to the X-bending stiffness.
Similarly, the dimensions of the flexible part in the X-Z plane will contribute to the Y-bending stiffness.
2024-03-19 17:36:39 +01:00
2024-04-04 17:38:22 +02:00
The setup to measure the dimension of the "X" flexible beam is shown in Figure ref:fig:test_joints_profilometer_setup.
2024-03-19 17:36:39 +01:00
2024-04-04 17:38:22 +02:00
What we typically observe is shown in Figure ref:fig:test_joints_profilometer_image.
It is then possible to estimate to dimension of the flexible beam with an accuracy of $\approx 5\,\mu m$,
#+name: fig:test_joints_profilometer
#+caption: Setup to measure the dimension of the flexible beam corresponding to the X-bending stiffness. The flexible joint is fixed to the profilometer (\subref{fig:test_joints_profilometer_image}) and a image is obtained with which the gap can be estimated (\subref{fig:test_joints_profilometer_setup})
#+attr_latex: :options [htbp]
#+begin_figure
#+attr_latex: :caption \subcaption{\label{fig:test_joints_profilometer_image}Flexible joint fixed on the profilometer}
#+attr_latex: :options {0.49\textwidth}
#+begin_subfigure
#+attr_latex: :width 0.95\linewidth
[[file:figs/test_joints_profilometer_image.jpg]]
#+end_subfigure
#+attr_latex: :caption \subcaption{\label{fig:test_joints_profilometer_setup}Obtain image to estimate the gap}
#+attr_latex: :options {0.49\textwidth}
#+begin_subfigure
#+attr_latex: :width 0.95\linewidth
[[file:figs/test_joints_profilometer_setup.png]]
#+end_subfigure
#+end_figure
** Measurement Results
The specified flexible beam thickness (gap) is $250\,\mu m$.
Four gaps are measured for each flexible joints (2 in the $x$ direction and 2 in the $y$ direction).
The "beam thickness" is then estimated to be the mean between the gaps measured on opposite sides.
An histogram of the measured beam thicknesses is shown in Figure ref:fig:test_joints_size_hist.
The measured thickness is less thant the specified value of $250\,\mu m$, but this optical method may not be very accurate as the estimated gap can depend on the lighting of the part and of its proper alignment.
However, what is more important than the true value of the thickness is the consistency between all the flexible joints.
2024-03-19 17:36:39 +01:00
#+begin_src matlab :exports none
2024-04-04 17:38:22 +02:00
%% Measured gap for the 16 flexible joints
2024-03-19 17:36:39 +01:00
meas_flex = [[223, 226, 224, 214];
[229, 231, 237, 224];
[234, 230, 239, 231];
[233, 227, 229, 232];
[225, 212, 228, 228];
[220, 221, 224, 220];
[206, 207, 228, 226];
[230, 224, 224, 223];
[223, 231, 228, 233];
[228, 230, 235, 231];
[197, 207, 211, 204];
[227, 226, 225, 226];
[215, 228, 231, 220];
[216, 224, 224, 221];
[209, 214, 220, 221];
[213, 210, 230, 229]];
#+end_src
#+begin_src matlab :exports none
2024-04-04 17:38:22 +02:00
%% Histogram of the measured gap
2024-03-19 17:36:39 +01:00
figure;
histogram([(meas_flex(:,1)+meas_flex(:,2))/2,(meas_flex(:,3)+meas_flex(:,4))/2], 7)
2024-04-04 17:38:22 +02:00
xlabel("Measured beam thickness [$\mu m$]");
xticks([200, 205, 210, 215, 220, 225, 230, 235])
2024-03-19 17:36:39 +01:00
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
2024-03-25 10:01:56 +01:00
exportFig('figs/test_joints_size_hist.pdf', 'width', 'normal', 'height', 'normal');
2024-03-19 17:36:39 +01:00
#+end_src
2024-03-25 10:01:56 +01:00
#+name: fig:test_joints_size_hist
2024-04-04 17:38:22 +02:00
#+caption: Histogram for the (16x2) measured beams' thickness
2024-03-19 17:36:39 +01:00
#+RESULTS:
2024-03-25 10:01:56 +01:00
[[file:figs/test_joints_size_hist.png]]
#+begin_src matlab :exports none :tangle no
%% Save beam sizes
save('./matlab/mat/flex_meas_dim.mat', 'meas_flex');
#+end_src
2024-03-19 17:36:39 +01:00
2024-03-25 10:01:56 +01:00
#+begin_src matlab :exports none :eval no
%% Save beam sizes
save('./mat/flex_meas_dim.mat', 'meas_flex');
2024-03-19 17:36:39 +01:00
#+end_src
** Bad flexible joints
2024-04-04 17:38:22 +02:00
Using this profilometer allowed to detect flexible joints with manufacturing defects such as non-symmetrical shape (see Figure ref:fig:test_joints_bad_shape) or flexible joints with machining chips stuck in the gap (see Figure ref:fig:test_joints_bad_chips).
#+name: fig:test_joints_bad
#+caption: Example of two flexible joints that were considered unsatisfactory after visual inspection
2024-04-04 17:38:22 +02:00
#+attr_latex: :options [htbp]
#+begin_figure
#+attr_latex: :caption \subcaption{\label{fig:test_joints_bad_shape}Non-Symmetrical shape}
#+attr_latex: :options {0.49\textwidth}
#+begin_subfigure
#+attr_latex: :height 6cm
[[file:figs/test_joints_bad_shape.jpg]]
#+end_subfigure
#+attr_latex: :caption \subcaption{\label{fig:test_joints_bad_chips}"Chips" stuck in the air gap}
#+attr_latex: :options {0.49\textwidth}
#+begin_subfigure
#+attr_latex: :height 6cm
[[file:figs/test_joints_bad_chips.jpg]]
#+end_subfigure
#+end_figure
2024-04-04 17:38:22 +02:00
* Development of the Measurement Test Bench
2024-03-19 17:36:39 +01:00
:PROPERTIES:
2024-03-25 10:01:56 +01:00
:header-args:matlab+: :tangle matlab/test_joints_2_bench_dimensioning.m
2024-03-19 17:36:39 +01:00
:END:
2024-03-25 10:01:56 +01:00
<<sec:test_joints_test_bench_desc>>
2024-03-19 17:36:39 +01:00
** Introduction :ignore:
2024-04-04 17:38:22 +02:00
The most important characteristic of the flexible joint to be measured is its bending stiffness $k_{R_x} \approx k_{R_y}$.
2024-03-19 17:36:39 +01:00
2024-04-04 17:38:22 +02:00
To estimate the bending stiffness, the basic idea is to apply a torque $T_{x}$ to the flexible joints and to measure its angular deflection $\theta_{x}$.
Then, the bending stiffness can be computed from equation eqref:eq:test_joints_bending_stiffness.
\begin{equation}\label{eq:test_joints_bending_stiffness}
2024-03-19 17:36:39 +01:00
k_{R_x} = \frac{T_x}{\theta_x}
\end{equation}
** Matlab Init :noexport:ignore:
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
<<matlab-dir>>
#+end_src
#+begin_src matlab :exports none :results silent :noweb yes
<<matlab-init>>
#+end_src
2024-03-25 10:01:56 +01:00
#+begin_src matlab :tangle no :noweb yes
<<m-init-path>>
#+end_src
#+begin_src matlab :eval no :noweb yes
<<m-init-path-tangle>>
#+end_src
#+begin_src matlab :noweb yes
<<m-init-other>>
#+end_src
2024-04-04 17:38:22 +02:00
** Measurement principle
As it is difficult to apply a pure torque, a "linear" force can be applied instead.
The application point of the force should be far enough from the rotation axis such that the resulting bending motion is much larger than the displacement due to shear.
The working principle of the measurement bench is schematically shown in Figure ref:fig:test_joints_bench_working_principle.
One part of the flexible joint is fixed.
On the mobile part, a force $F_x$ is applied which is equivalent to a torque applied on the flexible joint center.
The induced rotation is measured with a displacement sensor $d_x$.
#+name: fig:test_joints_bench_working_principle
#+caption: Test Bench - working principle
[[file:figs/test_joints_bench_working_principle.png]]
2024-03-19 17:36:39 +01:00
2024-03-25 10:01:56 +01:00
#+name: fig:test_joints_bend_geometry
2024-03-19 17:36:39 +01:00
#+caption: Geometry of the flexible joint
2024-03-25 10:01:56 +01:00
[[file:figs/test_joints_bend_geometry.png]]
2024-03-19 17:36:39 +01:00
2024-04-04 17:38:22 +02:00
This test-bench will be used to have a first approximation of the bending stiffnesss and stroke of the flexible joints.
The flexible joint used for the Nano-Hexapod is shown in Figure ref:fig:test_joints_bend_geometry.
Its bending stiffness is foreseen to be $k_{R_y}\approx 5\,\frac{Nm}{rad}$ and its stroke $\theta_{y,\text{max}}\approx 25\,mrad$.
2024-03-19 17:36:39 +01:00
The height between the flexible point (center of the joint) and the point where external forces are applied is $h = 20\,mm$.
Let's define the parameters on Matlab.
#+begin_src matlab
kRx = 5; % Bending Stiffness [Nm/rad]
Rxmax = 25e-3; % Bending Stroke [rad]
h = 20e-3; % Height [m]
#+end_src
2024-04-04 17:38:22 +02:00
**** Required external applied force
2024-03-19 17:36:39 +01:00
The bending $\theta_y$ of the flexible joint due to the force $F_x$ is:
\begin{equation}
\theta_y = \frac{M_y}{k_{R_y}} = \frac{F_x h}{k_{R_y}}
\end{equation}
Therefore, the applied force to test the full range of the flexible joint is:
\begin{equation}
F_{x,\text{max}} = \frac{k_{R_y} \theta_{y,\text{max}}}{h}
\end{equation}
#+begin_src matlab
Fxmax = kRx*Rxmax/h; % Force to induce maximum stroke [N]
#+end_src
And we obtain:
#+begin_src matlab :results value raw replace :exports results
sprintf('\\begin{equation} F_{x,max} = %.1f\\, [N] \\end{equation}', Fxmax)
#+end_src
#+RESULTS:
\begin{equation} F_{x,max} = 6.2\, [N] \end{equation}
The measurement range of the force sensor should then be higher than $6.2\,N$.
2024-04-04 17:38:22 +02:00
**** Required actuator stroke and sensors range
2024-03-19 17:36:39 +01:00
The flexible joint is designed to allow a bending motion of $\pm 25\,mrad$.
The corresponding stroke at the location of the force sensor is:
\[ d_{x,\text{max}} = h \tan(R_{x,\text{max}}) \]
#+begin_src matlab
dxmax = h*tan(Rxmax);
#+end_src
#+begin_src matlab :results value raw replace :exports results
sprintf('\\begin{equation} d_{max} = %.1f\\, [mm] \\end{equation}', 1e3*dxmax)
#+end_src
#+RESULTS:
\begin{equation} d_{max} = 0.5\, [mm] \end{equation}
In order to test the full range of the flexible joint, the stroke of the translation stage used to move the force sensor should be higher than $0.5\,mm$.
Similarly, the measurement range of the displacement sensor should also be higher than $0.5\,mm$.
2024-04-04 17:38:22 +02:00
** Developped test bench
2024-03-19 17:36:39 +01:00
2024-03-25 10:01:56 +01:00
A CAD view of the measurement bench is shown in Figure ref:fig:test_joints_bench_overview.
2024-03-19 17:36:39 +01:00
#+begin_note
Here are the different elements used in this bench:
- *Translation Stage*: [[file:doc/V-408-Datasheet.pdf][V-408]]
- *Load Cells*: [[file:doc/A700000007147087.pdf][FC2231-0000-0010-L]]
- *Encoder*: [[file:doc/L-9517-9448-05-B_Data_sheet_RESOLUTE_BiSS_en.pdf][Renishaw Resolute 1nm]]
#+end_note
Both the measured force and displacement are acquired at the same time using a Speedgoat machine.
2024-04-04 17:38:22 +02:00
Explain why the encoder is here: in line with the measurement, no "abbe errors"
2024-03-19 17:36:39 +01:00
2024-03-25 10:01:56 +01:00
A side view of the bench with the important quantities are shown in Figure ref:fig:test_joints_bench_side.
2024-03-19 17:36:39 +01:00
2024-04-04 17:38:22 +02:00
#+name: fig:test_joints_bench
#+caption: Caption with reference to sub figure (\subref{fig:fig_label_a})
#+attr_latex: :options [htbp]
#+begin_figure
#+attr_latex: :caption \subcaption{\label{fig:test_joints_bench_overview}Schematic of the test bench to measure the bending stiffness of the flexible joints}
#+attr_latex: :options {0.78\textwidth}
#+begin_subfigure
#+attr_latex: :width 0.95\linewidth
[[file:figs/test_joints_bench_overview.png]]
#+end_subfigure
#+attr_latex: :caption \subcaption{\label{fig:test_joints_bench_side}Zoom}
#+attr_latex: :options {0.21\textwidth}
#+begin_subfigure
#+attr_latex: :width 0.95\linewidth
2024-03-25 10:01:56 +01:00
[[file:figs/test_joints_bench_side.png]]
2024-04-04 17:38:22 +02:00
#+end_subfigure
#+end_figure
2024-03-19 17:36:39 +01:00
2024-04-04 17:38:22 +02:00
** Error budget
<<ssec:test_joints_error_budget>>
**** Introduction :ignore:
2024-03-19 17:36:39 +01:00
Many things can impact the accuracy of the measured bending stiffness such as:
- Errors in the force and displacement measurement
- Shear effects
- Deflection of the Force sensor
- Errors in the geometry of the bench
In this section, we wish to estimate the attainable accuracy with the current bench, and identified the limiting factors.
2024-04-04 17:38:22 +02:00
**** Finite Element Model
2024-03-25 10:01:56 +01:00
From the Finite Element Model, the stiffness and stroke of the flexible joint have been computed and summarized in Tables ref:tab:test_joints_axial_shear_prop and ref:tab:test_joints_bending_torsion_prop.
2024-03-19 17:36:39 +01:00
#+begin_src matlab :exports none
%% Stiffness
ka = 94e6; % Axial Stiffness [N/m]
ks = 13e6; % Shear Stiffness [N/m]
kb = 5; % Bending Stiffness [Nm/rad]
kt = 260; % Torsional Stiffness [Nm/rad]
%% Maximum force
Fa = 469; % Axial Force before yield [N]
Fs = 242; % Shear Force before yield [N]
Fb = 0.118; % Bending Force before yield [Nm]
Ft = 1.508; % Torsional Force before yield [Nm]
%% Compute the corresponding stroke
Xa = Fa/ka; % Axial Stroke before yield [m]
Xs = Fs/ks; % Shear Stroke before yield [m]
Xb = Fb/kb; % Bending Stroke before yield [rad]
Xt = Ft/kt; % Torsional Stroke before yield [rad]
#+end_src
#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*)
data2orgtable([1e-6*ka, Fa, 1e6*Xa; 1e-6*ks, Fs, 1e6*Xs], {'Axial', 'Shear'}, {'Stiffness [N/um]', 'Max Force [N]', 'Stroke [um]'}, ' %.0f ');
#+end_src
2024-03-25 10:01:56 +01:00
#+name: tab:test_joints_axial_shear_prop
2024-03-19 17:36:39 +01:00
#+caption: Axial/Shear characteristics
#+attr_latex: :environment tabularx :width 0.6\linewidth :align Xccc
#+attr_latex: :center t :booktabs t :float t
#+RESULTS:
| | Stiffness [N/um] | Max Force [N] | Stroke [um] |
|-------+------------------+---------------+-------------|
| Axial | 94 | 469 | 5 |
| Shear | 13 | 242 | 19 |
#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*)
data2orgtable([kb, 1e3*Fb, 1e3*Xb; kt, 1e3*Ft, 1e3*Xt], {'Bending', 'Torsional'}, {'Stiffness [Nm/rad]', 'Max Torque [Nmm]', 'Stroke [mrad]'}, ' %.0f ');
#+end_src
2024-03-25 10:01:56 +01:00
#+name: tab:test_joints_bending_torsion_prop
2024-03-19 17:36:39 +01:00
#+caption: Bending/Torsion characteristics
#+attr_latex: :environment tabularx :width 0.7\linewidth :align Xccc
#+attr_latex: :center t :booktabs t :float t
#+RESULTS:
| | Stiffness [Nm/rad] | Max Torque [Nmm] | Stroke [mrad] |
|-----------+--------------------+------------------+---------------|
| Bending | 5 | 118 | 24 |
| Torsional | 260 | 1508 | 6 |
2024-04-04 17:38:22 +02:00
**** Setup
2024-03-19 17:36:39 +01:00
2024-03-25 10:01:56 +01:00
The setup is schematically represented in Figure ref:fig:test_joints_bench_side_bis.
2024-03-19 17:36:39 +01:00
The force is applied on top of the flexible joint with a distance $h$ with the joint's center.
The displacement of the flexible joint is also measured at the same height.
The height between the joint's center and the force application point is:
#+begin_src matlab
h = 25e-3; % Height [m]
#+end_src
2024-04-04 17:38:22 +02:00
**** Effect of Bending
2024-03-19 17:36:39 +01:00
The torque applied is:
\begin{equation}
M_y = F_x \cdot h
\end{equation}
The flexible joint is experiencing a rotation $\theta_y$ due to the torque $M_y$:
\begin{equation}
\theta_y = \frac{M_y}{k_{R_y}} = \frac{F_x \cdot h}{k_{R_y}}
\end{equation}
This rotation is then measured by the displacement sensor.
The measured displacement is:
\begin{equation}
D_b = h \tan(\theta_y) = h \tan\left( \frac{F_x \cdot h}{k_{R_y}} \right) \label{eq:bending_stiffness_formula}
\end{equation}
2024-04-04 17:38:22 +02:00
**** Computation of the bending stiffness
2024-03-19 17:36:39 +01:00
From equation eqref:eq:bending_stiffness_formula, we can compute the bending stiffness:
\begin{equation}
k_{R_y} = \frac{F_x \cdot h}{\tan^{-1}\left( \frac{D_b}{h} \right)}
\end{equation}
For small displacement, we have
\begin{equation}
\boxed{k_{R_y} \approx h^2 \frac{F_x}{d_x}}
\end{equation}
And therefore, to precisely measure $k_{R_y}$, we need to:
- precisely measure the motion $d_x$
- precisely measure the applied force $F_x$
- precisely now the height of the force application point $h$
2024-04-04 17:38:22 +02:00
**** Estimation error due to force and displacement sensors accuracy
2024-03-19 17:36:39 +01:00
The maximum error on the measured displacement with the encoder is 40 nm.
This quite negligible compared to the measurement range of 0.5 mm.
The accuracy of the force sensor is around 1% and therefore, we should expect to have an accuracy on the measured stiffness of at most 1%.
2024-04-04 17:38:22 +02:00
**** Estimation error due to Shear
2024-03-19 17:36:39 +01:00
The effect of Shear on the measured displacement is simply:
\begin{equation}
D_s = \frac{F_x}{k_s}
\end{equation}
The measured displacement will be the effect of shear + effect of bending
\begin{equation}
d_x = D_b + D_s = h \tan\left( \frac{F_x \cdot h}{k_{R_y}} \right) + \frac{F_x}{k_s} \approx F_x \left( \frac{h^2}{k_{R_y}} + \frac{1}{k_s} \right)
\end{equation}
The estimated bending stiffness $k_{\text{est}}$ will then be:
\begin{equation}
k_{\text{est}} = h^2 \frac{F_x}{d_x} \approx k_{R_y} \frac{1}{1 + \frac{k_{R_y}}{k_s h^2}}
\end{equation}
#+begin_src matlab :results value replace :exports results :tangle no
sprintf('The measurement error due to Shear is %.1f %%', 100*abs(1-1/(1 + kb/(ks*h^2))))
#+end_src
#+RESULTS:
: The measurement error due to Shear is 0.1 %
2024-04-04 17:38:22 +02:00
**** Estimation error due to force sensor compression
2024-03-19 17:36:39 +01:00
The measured displacement is not done directly at the joint's location.
The force sensor compression will then induce an error on the joint's stiffness.
The force sensor stiffness $k_F$ is estimated to be around:
#+begin_src matlab
kF = 50/0.05e-3; % [N/m]
#+end_src
#+begin_src matlab :results value replace :exports results
sprintf('k_F = %.1e [N/m]', kF)
#+end_src
#+RESULTS:
: k_F = 1.0e+06 [N/m]
The measured displacement will be the sum of the displacement induced by the bending and by the compression of the force sensor:
\begin{equation}
d_x = D_b + \frac{F_x}{k_F} = h \tan\left( \frac{F_x \cdot h}{k_{R_y}} \right) + \frac{F_x}{k_F} \approx F_x \left( \frac{h^2}{k_{R_y}} + \frac{1}{k_F} \right)
\end{equation}
The estimated bending stiffness $k_{\text{est}}$ will then be:
\begin{equation}
k_{\text{est}} = h^2 \frac{F_x}{d_x} \approx k_{R_y} \frac{1}{1 + \frac{k_{R_y}}{k_F h^2}}
\end{equation}
#+begin_src matlab :results value replace :exports results :tangle no
sprintf('The measurement error due to height estimation errors is %.1f %%', 100*abs(1-1/(1 + kb/(kF*h^2))))
#+end_src
#+RESULTS:
: The measurement error due to height estimation errors is 0.8 %
2024-04-04 17:38:22 +02:00
**** Estimation error due to height estimation error
2024-03-19 17:36:39 +01:00
Let's consider an error in the estimation of the height from the application of the force to the joint's center:
\begin{equation}
h_{\text{est}} = h (1 + \epsilon)
\end{equation}
The computed bending stiffness will be:
\begin{equation}
k_\text{est} \approx h_{\text{est}}^2 \frac{F_x}{d_x}
\end{equation}
And the stiffness estimation error is:
\begin{equation}
\frac{k_{\text{est}}}{k_{R_y}} = (1 + \epsilon)^2
\end{equation}
#+begin_src matlab
h_err = 0.2e-3; % Height estimation error [m]
#+end_src
#+begin_src matlab :results value replace :exports results :tangle no
sprintf('The measurement error due to height estimation errors of %.1f [mm] is %.1f %%', 1e3*h_err, 100*abs(1-(1 + h_err/h)^2))
#+end_src
#+RESULTS:
: The measurement error due to height estimation errors of 0.2 [mm] is 1.6 %
2024-04-04 17:38:22 +02:00
**** Conclusion
:PROPERTIES:
:UNNUMBERED: t
:END:
2024-03-19 17:36:39 +01:00
Based on the above analysis, we should expect no better than few percent of accuracy using the current test-bench.
This is well enough for a first estimation of the bending stiffness of the flexible joints.
2024-04-04 17:38:22 +02:00
* Bending Stiffness Measurement
2024-03-19 17:36:39 +01:00
:PROPERTIES:
2024-04-04 17:38:22 +02:00
:header-args:matlab+: :tangle ./matlab/test_joints_3_bending_stiff_meas.m
2024-03-19 17:36:39 +01:00
:END:
2024-04-04 17:38:22 +02:00
<<sec:test_joints_bending_stiffness_meas>>
** Introduction
2024-03-19 17:36:39 +01:00
2024-04-04 17:38:22 +02:00
A picture of the bench used to measure the X-bending stiffness of the flexible joints is shown in Figure ref:fig:test_joints_picture_bench_overview.
A closer view on flexible joint is shown in Figure ref:fig:test_joints_picture_bench_close and a zoom on the force sensor tip is shown in Figure ref:fig:test_joints_picture_bench_zoom.
#+name: fig:test_joints_picture_bench_overview
#+caption: Side view of the flexible joint stiffness bench. X-Bending stiffness is measured.
#+attr_latex: :width \linewidth
[[file:figs/test_joints_picture_bench_overview.jpg]]
#+name: fig:test_joints_picture_bench_close
#+caption: Zoom on the flexible joint - Side view
#+attr_latex: :width \linewidth
[[file:figs/test_joints_picture_bench_close.jpg]]
#+name: fig:test_joints_picture_bench_zoom
#+caption: Zoom on the tip of the force sensor
#+attr_latex: :width 0.4\linewidth
[[file:figs/test_joints_picture_bench_zoom.jpg]]
The same bench used to measure the Y-bending stiffness of the flexible joint by pivoting the flexible joint by 90 degrees.
2024-03-19 17:36:39 +01:00
2024-03-25 10:01:56 +01:00
** Matlab Init :noexport:ignore:
2024-03-19 15:18:31 +01:00
#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name)
<<matlab-dir>>
#+end_src
#+begin_src matlab :exports none :results silent :noweb yes
<<matlab-init>>
#+end_src
2024-03-25 10:01:56 +01:00
#+begin_src matlab :tangle no :noweb yes
<<m-init-path>>
2024-03-19 17:36:39 +01:00
#+end_src
2024-03-25 10:01:56 +01:00
#+begin_src matlab :eval no :noweb yes
<<m-init-path-tangle>>
2024-03-19 17:36:39 +01:00
#+end_src
2024-03-25 10:01:56 +01:00
#+begin_src matlab :noweb yes
<<m-init-other>>
2024-03-19 17:36:39 +01:00
#+end_src
** Force Sensor Calibration
#+begin_note
*Load Cells*:
- [[file:doc/A700000007147087.pdf][FC2231-0000-0010-L]]
- [[file:doc/FRE_DS_XFL212R_FR_A3.pdf][XFL212R]]
#+end_note
There are both specified to have $\pm 1 \%$ of non-linearity over the full range.
The XFL212R has a spherical interface while the FC2231 has a flat surface.
2024-03-25 10:01:56 +01:00
Therefore, we should have a nice point contact when using the two force sensors as shown in Figure ref:fig:test_joints_force_sensor_calib.
2024-03-19 17:36:39 +01:00
2024-03-25 10:01:56 +01:00
#+name: fig:test_joints_force_sensor_calib
2024-03-19 17:36:39 +01:00
#+caption: Zoom on the two force sensors in contact
#+attr_latex: :width 0.8\linewidth
2024-03-25 10:01:56 +01:00
[[file:figs/test_joints_force_sensor_calib.jpg]]
2024-03-19 17:36:39 +01:00
The two force sensors are therefore measuring the exact same force, and we can compare the two measurements.
Let's load the measured force of both sensors.
#+begin_src matlab
%% Load measurement data
load('calibration_force_sensor.mat', 't', 'F', 'Fc')
#+end_src
We remove any offset such that they are both measuring no force when not in contact.
#+begin_src matlab
%% Remove offset
F = F - mean(F( t > 0.5 & t < 1.0));
Fc = Fc - mean(Fc(t > 0.5 & t < 1.0));
#+end_src
#+begin_src matlab :exports none
figure;
hold on;
plot(t, F, 'DisplayName', 'FC2231');
plot(t, Fc, 'DisplayName', 'XFL212R');
hold off;
xlabel('Time [s]'); ylabel('Measured Force [N]');
xlim([0,15]); ylim([0,55]);
legend('location', 'southeast');
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
2024-03-25 10:01:56 +01:00
exportFig('figs/test_joints_force_sensor_calib_time.pdf', 'width', 'wide', 'height', 'normal');
2024-03-19 17:36:39 +01:00
#+end_src
2024-03-25 10:01:56 +01:00
#+name: fig:test_joints_force_sensor_calib_time
2024-03-19 17:36:39 +01:00
#+caption: Measured force using both sensors as a function of time
#+RESULTS:
2024-03-25 10:01:56 +01:00
[[file:figs/test_joints_force_sensor_calib_time.png]]
2024-03-19 17:36:39 +01:00
Let's select only the first part from the moment they are in contact until the maximum force is reached.
#+begin_src matlab
%% Only get the first part until maximum force
F = F( t > 1.55 & t < 4.65);
Fc = Fc(t > 1.55 & t < 4.65);
#+end_src
Then, let's make a linear fit between the two measured forces.
#+begin_src matlab
%% Make a line fit
fit_F = polyfit(Fc, F, 1);
#+end_src
2024-03-25 10:01:56 +01:00
The two forces are plotted against each other as well as the linear fit in Figure ref:fig:test_joints_force_sensor_calib_fit.
2024-03-19 17:36:39 +01:00
#+begin_src matlab :exports none
figure;
hold on;
plot(Fc, F, '-', 'DisplayName', 'Raw Data');
plot(Fc([1,end]), Fc([1,end])*fit_F(1) + fit_F(2), '--', 'DisplayName', 'Line Fit');
hold off;
xlabel('XFL212R [N]'); ylabel('FC2231 [N]');
xlim([0,50]); ylim([0,50]);
legend('location', 'southeast');
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
2024-03-25 10:01:56 +01:00
exportFig('figs/test_joints_force_sensor_calib_fit.pdf', 'width', 'wide', 'height', 'normal');
2024-03-19 17:36:39 +01:00
#+end_src
2024-03-25 10:01:56 +01:00
#+name: fig:test_joints_force_sensor_calib_fit
2024-03-19 17:36:39 +01:00
#+caption: Measured two forces and linear fit
#+RESULTS:
2024-03-25 10:01:56 +01:00
[[file:figs/test_joints_force_sensor_calib_fit.png]]
2024-03-19 17:36:39 +01:00
2024-03-25 10:01:56 +01:00
The measurement error between the two sensors is shown in Figure ref:fig:test_joints_force_sensor_calib_error.
2024-03-19 17:36:39 +01:00
It is below 0.1N for the full measurement range.
#+begin_src matlab :exports none
figure;
hold on;
plot(Fc, F - (Fc*fit_F(1) + fit_F(2)), 'k-');
hold off;
xlim([0,50]); ylim([-0.12, 0.12]);
xlabel('Measured Force [N]');
ylabel('Error [N]')
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
2024-03-25 10:01:56 +01:00
exportFig('figs/test_joints_force_sensor_calib_error.pdf', 'width', 'wide', 'height', 'normal');
2024-03-19 17:36:39 +01:00
#+end_src
2024-03-25 10:01:56 +01:00
#+name: fig:test_joints_force_sensor_calib_error
2024-03-19 17:36:39 +01:00
#+caption: Error in Newtons
#+RESULTS:
2024-03-25 10:01:56 +01:00
[[file:figs/test_joints_force_sensor_calib_error.png]]
2024-03-19 17:36:39 +01:00
** Force Sensor Stiffness
The objective of this measurement is to estimate the stiffness of the force sensor [[file:doc/A700000007147087.pdf][FC2231-0000-0010-L]].
2024-03-25 10:01:56 +01:00
To do so, a very stiff element is fixed in front of the force sensor as shown in Figure ref:fig:test_joints_meas_force_sensor_stiffness.
2024-03-19 17:36:39 +01:00
Then, we apply a force on the stiff element through the force sensor.
We measure the deflection of the force sensor using an encoder.
Then, having the force and the deflection, we should be able to estimate the stiffness of the force sensor supposing the stiffness of the other elements are much larger.
2024-03-25 10:01:56 +01:00
#+name: fig:test_joints_meas_force_sensor_stiffness
2024-03-19 17:36:39 +01:00
#+caption: Bench used to measured the stiffness of the force sensor
#+attr_latex: :width 0.6\linewidth
2024-03-25 10:01:56 +01:00
[[file:figs/test_joints_meas_force_sensor_stiffness.jpg]]
2024-03-19 17:36:39 +01:00
From the documentation, the deflection of the sensor at the maximum load (50N) is 0.05mm, the stiffness is therefore foreseen to be around $1\,N/\mu m$.
Let's load the measured force as well as the measured displacement.
#+begin_src matlab
%% Load measurement data
load('force_sensor_stiffness_meas.mat', 't', 'F', 'd')
#+end_src
Some pre-processing is applied on the data.
#+begin_src matlab
%% Remove offset
F = F - mean(F(t > 0.5 & t < 1.0));
%% Select important part of data
F = F( t > 4.55 & t < 7.24);
d = d( t > 4.55 & t < 7.24); d = d - d(1);
t = t( t > 4.55 & t < 7.24);
#+end_src
The linear fit is performed.
#+begin_src matlab
%% Linear fit
fit_k = polyfit(F, d, 1);
#+end_src
2024-03-25 10:01:56 +01:00
The displacement as a function of the force as well as the linear fit are shown in Figure ref:fig:test_joints_force_sensor_stiffness_fit.
2024-03-19 17:36:39 +01:00
#+begin_src matlab :exports none
figure;
hold on;
plot(F, 1e6*d, '-', 'DisplayName', 'Raw Data');
plot(F([1,end]), 1e6*(F([1,end])*fit_k(1) + fit_k(2)), '--', 'DisplayName', 'Line Fit');
hold off;
xlabel('Force [$N$]'); ylabel('Displacement [$\mu m$]');
xlim([0,45]); ylim([0,60]);
legend('location', 'southeast');
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
2024-03-25 10:01:56 +01:00
exportFig('figs/test_joints_force_sensor_stiffness_fit.pdf', 'width', 'wide', 'height', 'normal');
2024-03-19 17:36:39 +01:00
#+end_src
2024-03-25 10:01:56 +01:00
#+name: fig:test_joints_force_sensor_stiffness_fit
2024-03-19 17:36:39 +01:00
#+caption: Displacement as a function of the measured force
#+RESULTS:
2024-03-25 10:01:56 +01:00
[[file:figs/test_joints_force_sensor_stiffness_fit.png]]
2024-03-19 17:36:39 +01:00
And we obtain the following stiffness:
#+begin_src matlab :results value replace :exports results
%% Force Sensor Stiffness
sprintf('k = %.2f [N/um]', 1e-6*1/fit_k(1));
#+end_src
#+RESULTS:
: k = 0.76 [N/um]
** Analysis of one measurement
In this section is shown how the data are analysis in order to measured:
- the bending stiffness
- the bending stroke
- the stiffness once the mechanical stops are in contact
The height from the flexible joint's center and the point of application force $h$ is defined below:
#+begin_src matlab
h = 25e-3; % [m]
#+end_src
#+begin_src matlab
%% Load Data
load('meas_stiff_flex_1_x.mat', 't', 'F', 'd');
%% Zero the force
F = F - mean(F(t > 0.1 & t < 0.3));
%% Start measurement at t = 0.2 s
d = d(t > 0.2);
F = F(t > 0.2);
t = t(t > 0.2); t = t - t(1);
#+end_src
2024-03-25 10:01:56 +01:00
The obtained time domain measurements are shown in Figure ref:fig:test_joints_meas_bend_time.
2024-03-19 17:36:39 +01:00
#+begin_src matlab :exports none
%% Time Domain plots
figure;
2024-03-25 10:01:56 +01:00
tiledlayout(2, 1, 'TileSpacing', 'Compact', 'Padding', 'None');
2024-03-19 17:36:39 +01:00
ax1 = nexttile;
plot(t, F);
ylabel('Force [N]'); set(gca, 'XTickLabel',[]);
ax2 = nexttile;
plot(t, 1e3*d);
hold off;
xlabel('Time [s]'); ylabel('Displacement [mm]');
linkaxes([ax1,ax2],'x');
xlim([0,5]);
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
2024-03-25 10:01:56 +01:00
exportFig('figs/test_joints_meas_bend_time.pdf', 'width', 'wide', 'height', 'tall');
2024-03-19 17:36:39 +01:00
#+end_src
2024-03-25 10:01:56 +01:00
#+name: fig:test_joints_meas_bend_time
2024-03-19 17:36:39 +01:00
#+caption: Typical time domain measurements
#+RESULTS:
2024-03-25 10:01:56 +01:00
[[file:figs/test_joints_meas_bend_time.png]]
2024-03-19 17:36:39 +01:00
2024-03-25 10:01:56 +01:00
The displacement as a function of the force is then shown in Figure ref:fig:test_joints_meas_F_d.
2024-03-19 17:36:39 +01:00
#+begin_src matlab :exports none
figure;
plot(F, 1e3*d);
xlabel('Force [N]'); ylabel('Displacement [mm]');
xlim([0,6]); ylim([0,1]);
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
2024-03-25 10:01:56 +01:00
exportFig('figs/test_joints_meas_F_d.pdf', 'width', 'wide', 'height', 'normal');
2024-03-19 17:36:39 +01:00
#+end_src
2024-03-25 10:01:56 +01:00
#+name: fig:test_joints_meas_F_d
2024-03-19 17:36:39 +01:00
#+caption: Typical measurement of the diplacement as a function of the applied force
#+RESULTS:
2024-03-25 10:01:56 +01:00
[[file:figs/test_joints_meas_F_d.png]]
2024-03-19 17:36:39 +01:00
2024-03-25 10:01:56 +01:00
The bending stiffness can be estimated by computing the slope of the curve in Figure ref:fig:test_joints_meas_F_d.
2024-03-19 17:36:39 +01:00
The bending stroke and the stiffness when touching the mechanical stop can also be estimated from the same figure.
#+begin_src matlab
%% Determine the linear region and region when touching the mechanical stop
% Find when the force sensor touches the flexible joint
i_l_start = find(F > 0.3, 1, 'first');
% Reset the measured diplacement at that point
d = d - d(i_l_start);
% Find then the maximum force is applied
[~, i_s_stop] = max(F);
% Linear region stops ~ when 90% of the stroke is reached
i_l_stop = find(d > 0.9*d(i_s_stop), 1, 'first');
% "Stop" region start ~1N before maximum force is applied
i_s_start = find(F > max(F)-1, 1, 'first');
%% Define variables for the two regions
F_l = F(i_l_start:i_l_stop);
d_l = d(i_l_start:i_l_stop);
F_s = F(i_s_start:i_s_stop);
d_s = d(i_s_start:i_s_stop);
#+end_src
#+begin_src matlab
%% Fit the best straight line for the two regions
fit_l = polyfit(F_l, d_l, 1);
fit_s = polyfit(F_s, d_s, 1);
%% Reset displacement based on fit
d = d - fit_l(2);
fit_s(2) = fit_s(2) - fit_l(2);
fit_l(2) = 0;
#+end_src
2024-03-25 10:01:56 +01:00
The raw data as well as the fit corresponding to the two stiffnesses are shown in Figure ref:fig:test_joints_meas_F_d_lin_fit.
2024-03-19 17:36:39 +01:00
#+begin_src matlab :exports none
figure;
hold on;
plot(F(1:i_s_stop), 1e3*d(1:i_s_stop), '.k')
plot(F_l, 1e3*(F_l*fit_l(1) + fit_l(2)))
plot(F_s, 1e3*(F_s*fit_s(1) + fit_s(2)))
hold off;
xlabel('Force [N]'); ylabel('Displacement [mm]');
xlim([0,6]);
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
2024-03-25 10:01:56 +01:00
exportFig('figs/test_joints_meas_F_d_lin_fit.pdf', 'width', 'wide', 'height', 'normal');
2024-03-19 17:36:39 +01:00
#+end_src
2024-03-25 10:01:56 +01:00
#+name: fig:test_joints_meas_F_d_lin_fit
2024-03-19 17:36:39 +01:00
#+caption: Typical measurement of the diplacement as a function of the applied force with estimated linear fits
#+RESULTS:
2024-03-25 10:01:56 +01:00
[[file:figs/test_joints_meas_F_d_lin_fit.png]]
2024-03-19 17:36:39 +01:00
Then, the bending stroke is estimated as crossing point between the two fitted lines:
#+begin_src matlab
d_max = fit_l(1)*fit_s(2)/(fit_l(1) - fit_s(1));
#+end_src
2024-03-25 10:01:56 +01:00
The obtained characteristics are:
- Bending Stiffness: 5.5Nm/rad
- Bending Stiffness at stop: 173.6Nm/rad
- Bending Stroke: 18.9mrad
2024-03-19 17:36:39 +01:00
** Bending stiffness and bending stroke of all the flexible joints
Now, let's estimate the bending stiffness and stroke for all the flexible joints.
#+begin_src matlab :exports none
%% Initialize variables
kRx = zeros(1,16);
kSx = zeros(1,16);
Rmx = zeros(1,16);
for i = 1:16
%% Load the data
load(['meas_stiff_flex_' num2str(i) '_x.mat'], 't', 'F', 'd');
%% Automatic Zero of the force
F = F - mean(F(t > 0.1 & t < 0.3));
%% Start measurement at t = 0.2 s
d = d(t > 0.2);
F = F(t > 0.2);
t = t(t > 0.2); t = t - t(1);
%% Estimate linear region and "stop" region
i_l_start = find(F > 0.3, 1, 'first');
d = d - d(i_l_start);
[~, i_s_stop] = max(F);
i_l_stop = find(d > 0.9*d(i_s_stop), 1, 'first');
i_s_start = find(F > max(F)-1, 1, 'first');
F_l = F(i_l_start:i_l_stop);
d_l = d(i_l_start:i_l_stop);
F_s = F(i_s_start:i_s_stop);
d_s = d(i_s_start:i_s_stop);
%% Straight line fit
fit_l = polyfit(F_l, d_l, 1);
fit_s = polyfit(F_s, d_s, 1);
%% Reset displacement based on fit
d = d - fit_l(2);
fit_s(2) = fit_s(2) - fit_l(2);
fit_l(2) = 0;
%% Estimated Stroke
d_max = fit_l(1)*fit_s(2)/(fit_l(1) - fit_s(1));
%% Save stiffnesses and stroke
kRx(i) = (h)^2/fit_l(1);
kSx(i) = (h)^2/fit_s(1);
Rmx(i) = atan2(d_max,h);
end
#+end_src
#+begin_src matlab :exports none
%% Initialize variables
kRy = zeros(1,16);
kSy = zeros(1,16);
Rmy = zeros(1,16);
for i = 1:16
%% Load the data
load(['meas_stiff_flex_' num2str(i) '_y.mat'], 't', 'F', 'd');
%% Automatic Zero of the force
F = F - mean(F(t > 0.1 & t < 0.3));
%% Start measurement at t = 0.2 s
d = d(t > 0.2);
F = F(t > 0.2);
t = t(t > 0.2); t = t - t(1);
%% Estimate linear region and "stop" region
i_l_start = find(F > 0.3, 1, 'first');
d = d - d(i_l_start);
[~, i_s_stop] = max(F);
i_l_stop = find(d > 0.9*d(i_s_stop), 1, 'first');
i_s_start = find(F > max(F)-1, 1, 'first');
F_l = F(i_l_start:i_l_stop);
d_l = d(i_l_start:i_l_stop);
F_s = F(i_s_start:i_s_stop);
d_s = d(i_s_start:i_s_stop);
%% Straight line fit
fit_l = polyfit(F_l, d_l, 1);
fit_s = polyfit(F_s, d_s, 1);
%% Reset displacement based on fit
d = d - fit_l(2);
fit_s(2) = fit_s(2) - fit_l(2);
fit_l(2) = 0;
%% Estimated Stroke
d_max = fit_l(1)*fit_s(2)/(fit_l(1) - fit_s(1));
%% Save stiffnesses and stroke
kRy(i) = (h)^2/fit_l(1);
kSy(i) = (h)^2/fit_s(1);
Rmy(i) = atan2(d_max,h);
end
#+end_src
2024-03-25 10:01:56 +01:00
The results are summarized in Table ref:tab:test_joints_meas_results_x_dir for the X direction and in Table ref:tab:test_joints_meas_results_y_dir for the Y direction.
2024-03-19 17:36:39 +01:00
#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*)
data2orgtable([kRx; kSx; 1e3*Rmx]', {'1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16'}, {'$R_{R_x}$ [Nm/rad]', '$k_{R_x,s}$ [Nm/rad]', '$R_{x,\text{max}}$ [mrad]'}, ' %.1f ');
#+end_src
2024-03-25 10:01:56 +01:00
#+name: tab:test_joints_meas_results_x_dir
2024-03-19 17:36:39 +01:00
#+caption: Measured characteristics of the flexible joints in the X direction
#+attr_latex: :environment tabularx :width 0.6\linewidth :align cccc
#+attr_latex: :center t :booktabs t :float t
#+RESULTS:
| | $R_{R_x}$ [Nm/rad] | $k_{R_x,s}$ [Nm/rad] | $R_{x,\text{max}}$ [mrad] |
|----+--------------------+----------------------+---------------------------|
| 1 | 5.5 | 173.6 | 18.9 |
| 2 | 6.1 | 195.0 | 17.6 |
| 3 | 6.1 | 191.3 | 17.7 |
| 4 | 5.8 | 136.7 | 18.3 |
| 5 | 5.7 | 88.9 | 22.0 |
| 6 | 5.7 | 183.9 | 18.7 |
| 7 | 5.7 | 157.9 | 17.9 |
| 8 | 5.8 | 166.1 | 17.9 |
| 9 | 5.8 | 159.5 | 18.2 |
| 10 | 6.0 | 143.6 | 18.1 |
| 11 | 5.0 | 163.8 | 17.7 |
| 12 | 6.1 | 111.9 | 17.0 |
| 13 | 6.0 | 142.0 | 17.4 |
| 14 | 5.8 | 130.1 | 17.9 |
| 15 | 5.7 | 170.7 | 18.6 |
| 16 | 6.0 | 148.7 | 17.5 |
#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*)
data2orgtable([kRy; kSy; 1e3*Rmy]', {'1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16'}, {'$R_{R_y}$ [Nm/rad]', '$k_{R_y,s}$ [Nm/rad]', '$R_{y,\text{may}}$ [mrad]'}, ' %.1f ');
#+end_src
2024-03-25 10:01:56 +01:00
#+name: tab:test_joints_meas_results_y_dir
2024-03-19 17:36:39 +01:00
#+caption: Measured characteristics of the flexible joints in the Y direction
#+attr_latex: :environment tabularx :width 0.6\linewidth :align cccc
#+attr_latex: :center t :booktabs t :float t
#+RESULTS:
| | $R_{R_y}$ [Nm/rad] | $k_{R_y,s}$ [Nm/rad] | $R_{y,\text{may}}$ [mrad] |
|----+--------------------+----------------------+---------------------------|
| 1 | 5.7 | 323.5 | 17.9 |
| 2 | 5.9 | 306.0 | 17.2 |
| 3 | 6.0 | 224.4 | 16.8 |
| 4 | 5.7 | 247.3 | 17.8 |
| 5 | 5.8 | 250.9 | 13.0 |
| 6 | 5.8 | 244.5 | 17.8 |
| 7 | 5.3 | 214.8 | 18.1 |
| 8 | 5.8 | 217.2 | 17.6 |
| 9 | 5.7 | 225.0 | 17.6 |
| 10 | 6.0 | 254.7 | 17.3 |
| 11 | 4.9 | 261.1 | 18.4 |
| 12 | 5.9 | 161.5 | 16.7 |
| 13 | 6.1 | 227.6 | 16.8 |
| 14 | 5.9 | 221.3 | 17.8 |
| 15 | 5.4 | 241.5 | 17.8 |
| 16 | 5.3 | 291.1 | 17.7 |
** Analysis
2024-03-25 10:01:56 +01:00
The dispersion of the measured bending stiffness is shown in Figure ref:fig:test_joints_bend_stiff_hist and of the bending stroke in Figure ref:fig:test_joints_bend_stroke_hist.
2024-03-19 17:36:39 +01:00
#+begin_src matlab :exports none
figure;
hold on;
histogram(kRx, 'DisplayName', '$k_{R_x}$')
histogram(kRy, 'DisplayName', '$k_{R_y}$')
hold off;
xlabel('Bending Stiffness [Nm/rad]')
legend();
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
2024-03-25 10:01:56 +01:00
exportFig('figs/test_joints_bend_stiff_hist.pdf', 'width', 'wide', 'height', 'normal');
2024-03-19 17:36:39 +01:00
#+end_src
2024-03-25 10:01:56 +01:00
#+name: fig:test_joints_bend_stiff_hist
2024-03-19 17:36:39 +01:00
#+caption: Histogram of the measured bending stiffness
#+RESULTS:
2024-03-25 10:01:56 +01:00
[[file:figs/test_joints_bend_stiff_hist.png]]
2024-03-19 17:36:39 +01:00
#+begin_src matlab :exports none
figure;
hold on;
histogram(1e3*Rmx, 'DisplayName', '$k_{R_x}$')
histogram(1e3*Rmy, 'DisplayName', '$k_{R_y}$')
hold off;
xlabel('Bending Stroke [mrad]')
legend();
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
2024-03-25 10:01:56 +01:00
exportFig('figs/test_joints_bend_stroke_hist.pdf', 'width', 'wide', 'height', 'normal');
2024-03-19 17:36:39 +01:00
#+end_src
2024-03-25 10:01:56 +01:00
#+name: fig:test_joints_bend_stroke_hist
2024-03-19 17:36:39 +01:00
#+caption: Histogram of the measured bending stroke
#+RESULTS:
2024-03-25 10:01:56 +01:00
[[file:figs/test_joints_bend_stroke_hist.png]]
2024-03-19 17:36:39 +01:00
2024-03-25 10:01:56 +01:00
The relation between the measured beam thickness and the measured bending stiffness is shown in Figure ref:fig:test_joints_thickness_stiffness.
2024-03-19 17:36:39 +01:00
#+begin_src matlab :exports none
load('flex_meas_dim.mat', 'meas_flex');
figure;
hold on;
plot((meas_flex(:,1)+meas_flex(:,2))/2, kRx, 'o', 'DisplayName', '$x$')
plot((meas_flex(:,3)+meas_flex(:,4))/2, kRy, 'o', 'DisplayName', '$y$')
hold off;
xlabel('Flexible Beam Thickness [$\mu m$]');
ylabel('Bending Stiffness [Nm/rad]');
legend('location', 'southeast');
#+end_src
#+begin_src matlab :tangle no :exports results :results file replace
2024-03-25 10:01:56 +01:00
exportFig('figs/test_joints_thickness_stiffness.pdf', 'width', 'wide', 'height', 'normal');
2024-03-19 17:36:39 +01:00
#+end_src
2024-03-25 10:01:56 +01:00
#+name: fig:test_joints_thickness_stiffness
2024-03-19 17:36:39 +01:00
#+caption: Measured bending stiffness as a function of the estimated flexible beam thickness
#+RESULTS:
2024-03-25 10:01:56 +01:00
[[file:figs/test_joints_thickness_stiffness.png]]
2024-03-19 17:36:39 +01:00
** Conclusion
2024-04-04 17:38:22 +02:00
:PROPERTIES:
:UNNUMBERED: t
:END:
2024-03-19 17:36:39 +01:00
#+begin_important
The measured bending stiffness and bending stroke of the flexible joints are very close to the estimated one using a Finite Element Model.
The characteristics of all the flexible joints are also quite close to each other.
This should allow us to model them with unique parameters.
#+end_important
2024-03-19 15:18:31 +01:00
* Conclusion
2024-03-25 10:01:56 +01:00
<<sec:test_joints_conclusion>>
2024-03-19 15:18:31 +01:00
* Bibliography :ignore:
#+latex: \printbibliography[heading=bibintoc,title={Bibliography}]
* Helping Functions :noexport:
** Initialize Path
#+NAME: m-init-path
#+BEGIN_SRC matlab
%% Path for functions, data and scripts
addpath('./matlab/mat/'); % Path for data
addpath('./matlab/'); % Path for scripts
#+END_SRC
#+NAME: m-init-path-tangle
#+BEGIN_SRC matlab
%% Path for functions, data and scripts
addpath('./mat/'); % Path for data
#+END_SRC
** Initialize other elements
#+NAME: m-init-other
#+BEGIN_SRC matlab
%% Colors for the figures
colors = colororder;
#+END_SRC
2024-04-04 17:38:22 +02:00
* Footnotes
[fn:1]The alloy used is called /F16PH/, also refereed as "1.4542"