From 8e2a22ec82745622d63e3bbe3fa264ac2bb0867c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bartek=20=C5=81ukawski?= Date: Mon, 13 Nov 2023 10:32:43 +0100 Subject: [PATCH] [WIP] Migrate to MkDocs --- .github/workflows/gh-pages.yml | 29 ++++ .github/workflows/gitbook.yml | 30 ---- .gitignore | 16 +- README.md | 11 +- SUMMARY.md | 27 --- book.json | 18 -- .../additional-resources.md | 0 architecture.md => docs/architecture.md | 0 docs/assets/roboticslab.png | Bin 0 -> 32270 bytes connectors.md => docs/connectors.md | 0 {csv => docs/csv}/bom.csv | 0 .../csv}/deprecated/dh-transformations.csv | 0 {csv => docs/csv}/deprecated/dh-trunk.csv | 0 {csv => docs/csv}/dh-fetch.csv | 0 {csv => docs/csv}/dh-head-transformations.csv | 0 {csv => docs/csv}/dh-head.csv | 0 {csv => docs/csv}/dh-leftArm.csv | 0 {csv => docs/csv}/dh-leftLeg.csv | 0 {csv => docs/csv}/dh-rightArm.csv | 0 {csv => docs/csv}/dh-rightLeg.csv | 0 {csv => docs/csv}/dh-root-head.csv | 0 {csv => docs/csv}/dh-root-leftArm.csv | 0 {csv => docs/csv}/dh-root-leftLeg.csv | 0 {csv => docs/csv}/dh-root-rightArm.csv | 0 {csv => docs/csv}/dh-root-rightLeg.csv | 0 {csv => docs/csv}/dynamic_info_absolute.csv | 0 {csv => docs/csv}/dynamic_info_relative.csv | 0 {csv => docs/csv}/editable/motores.ods | Bin {csv => docs/csv}/lengths.csv | 0 {csv => docs/csv}/motores-motores.csv | 0 .../csv}/motores-protecciones-brazos.csv | 0 .../csv}/motores-protecciones-piernas.csv | 0 {csv => docs/csv}/motores-transmision.csv | 0 {csv => docs/csv}/teo-center-of-masses.csv | 0 demo-procedure.md => docs/demo-procedure.md | 6 +- diagrams.md => docs/diagrams.md | 22 ++- .../driver-check-procedure.md | 4 +- .../dynamic-information.md | 0 .../2020-10-01-teo-cognitive-architecture.svg | 0 {fig => docs/fig}/CAN.png | Bin {fig => docs/fig}/Directions.png | Bin {fig => docs/fig}/Ftsensors.png | Bin {fig => docs/fig}/Joints_(can).png | Bin {fig => docs/fig}/Joints_(yarp).png | Bin {fig => docs/fig}/Jr3_50M31_corregido.pdf | Bin {fig => docs/fig}/Lengths.png | Bin {fig => docs/fig}/Masses.png | Bin {fig => docs/fig}/README.md | 0 {fig => docs/fig}/TEO_by_links.jpg | Bin {fig => docs/fig}/cui-absolute-circuit.jpg | Bin {fig => docs/fig}/dh-drawing.png | Bin ...0-10-01-teo-cognitive-architecture.graphml | 0 {fig => docs/fig}/editable/CAN.svg | 0 {fig => docs/fig}/editable/Directions.svg | 0 {fig => docs/fig}/editable/Joints_(can).svg | 0 {fig => docs/fig}/editable/Joints_(yarp).svg | 0 {fig => docs/fig}/editable/Lengths.svg | 0 {fig => docs/fig}/editable/Masses.svg | 0 {fig => docs/fig}/editable/README.md | 0 {fig => docs/fig}/editable/Rekha.ttf | Bin .../fig}/editable/SixCaps-license.txt | 0 {fig => docs/fig}/editable/SixCaps.ttf | Bin {fig => docs/fig}/editable/dh-drawing.svg | 0 {fig => docs/fig}/editable/teo-template.svg | 0 {fig => docs/fig}/editable/teo.mermaid | 0 .../fig}/emergency-buttons-connectors.jpg | Bin {fig => docs/fig}/emergency-buttons.jpg | Bin {fig => docs/fig}/fetch-hand.pdf | Bin {fig => docs/fig}/fetch-proximal-falange.pdf | Bin {fig => docs/fig}/ipos-rs232-connector.jpg | Bin {fig => docs/fig}/jr3-circuit-connectors.jpg | Bin {fig => docs/fig}/kinfu.png | Bin {fig => docs/fig}/main-switches.jpg | Bin {fig => docs/fig}/pc-switches.jpg | Bin {fig => docs/fig}/power-supply.jpg | Bin .../fig}/roboticslab-banner-350px.png | Bin {fig => docs/fig}/router-internal.jpg | Bin .../fig}/technosoft-ipos-connectors.jpg | Bin {fig => docs/fig}/teo-follow-me-app.svg | 0 {fig => docs/fig}/teo-link-names.pdf | Bin {fig => docs/fig}/teo-yarpmanager.png | Bin {fig => docs/fig}/teo-yarpmotorgui.png | Bin {fig => docs/fig}/teoSim-depth.png | Bin {fig => docs/fig}/teoSim-floor-iron.png | Bin {fig => docs/fig}/teoSim-ft.png | Bin {fig => docs/fig}/teoSim-mesh.png | Bin {fig => docs/fig}/teoSim.png | Bin gitbook-cover.md => docs/index.md | 2 +- introduction.md => docs/introduction.md | 0 .../network-information.md | 4 +- {overview => docs/overview}/README.md | 0 {overview => docs/overview}/demonstration.md | 0 {overview => docs/overview}/development.md | 0 {overview => docs/overview}/firmware.md | 0 {overview => docs/overview}/pc.md | 2 + {overview => docs/overview}/research.md | 0 .../switches-and-power.md | 0 docs/tables.md | 155 ++++++++++++++++++ {tutorial => docs/tutorial}/README.md | 10 +- {tutorial => docs/tutorial}/ft.md | 1 + {tutorial => docs/tutorial}/kinfu.md | 0 {tutorial => docs/tutorial}/mesh.md | 0 {tutorial => docs/tutorial}/motor.md | 3 +- {tutorial => docs/tutorial}/rgbd.md | 1 + {tutorial => docs/tutorial}/trajectories.md | 4 +- js/scripts.js | 14 -- mkdocs.yml | 108 ++++++++++++ requirements.txt | 9 + styles/website.css | 52 ------ tables.md | 134 --------------- 110 files changed, 344 insertions(+), 318 deletions(-) create mode 100644 .github/workflows/gh-pages.yml delete mode 100644 .github/workflows/gitbook.yml delete mode 100644 SUMMARY.md delete mode 100644 book.json rename additional-resources.md => docs/additional-resources.md (100%) rename architecture.md => docs/architecture.md (100%) create mode 100644 docs/assets/roboticslab.png rename connectors.md => docs/connectors.md (100%) rename {csv => docs/csv}/bom.csv (100%) rename {csv => docs/csv}/deprecated/dh-transformations.csv (100%) rename {csv => docs/csv}/deprecated/dh-trunk.csv (100%) rename {csv => docs/csv}/dh-fetch.csv (100%) rename {csv => docs/csv}/dh-head-transformations.csv (100%) rename {csv => docs/csv}/dh-head.csv (100%) rename {csv => docs/csv}/dh-leftArm.csv (100%) rename {csv => docs/csv}/dh-leftLeg.csv (100%) rename {csv => docs/csv}/dh-rightArm.csv (100%) rename {csv => docs/csv}/dh-rightLeg.csv (100%) rename {csv => docs/csv}/dh-root-head.csv (100%) rename {csv => docs/csv}/dh-root-leftArm.csv (100%) rename {csv => docs/csv}/dh-root-leftLeg.csv (100%) rename {csv => docs/csv}/dh-root-rightArm.csv (100%) rename {csv => docs/csv}/dh-root-rightLeg.csv (100%) rename {csv => docs/csv}/dynamic_info_absolute.csv (100%) rename {csv => docs/csv}/dynamic_info_relative.csv (100%) rename {csv => docs/csv}/editable/motores.ods (100%) rename {csv => docs/csv}/lengths.csv (100%) rename {csv => docs/csv}/motores-motores.csv (100%) rename {csv => docs/csv}/motores-protecciones-brazos.csv (100%) rename {csv => docs/csv}/motores-protecciones-piernas.csv (100%) rename {csv => docs/csv}/motores-transmision.csv (100%) rename {csv => docs/csv}/teo-center-of-masses.csv (100%) rename demo-procedure.md => docs/demo-procedure.md (76%) rename diagrams.md => docs/diagrams.md (64%) rename driver-check-procedure.md => docs/driver-check-procedure.md (92%) rename dynamic-information.md => docs/dynamic-information.md (100%) rename {fig => docs/fig}/2020-10-01-teo-cognitive-architecture.svg (100%) rename {fig => docs/fig}/CAN.png (100%) rename {fig => docs/fig}/Directions.png (100%) rename {fig => docs/fig}/Ftsensors.png (100%) rename {fig => docs/fig}/Joints_(can).png (100%) rename {fig => docs/fig}/Joints_(yarp).png (100%) rename {fig => docs/fig}/Jr3_50M31_corregido.pdf (100%) rename {fig => docs/fig}/Lengths.png (100%) rename {fig => docs/fig}/Masses.png (100%) rename {fig => docs/fig}/README.md (100%) rename {fig => docs/fig}/TEO_by_links.jpg (100%) rename {fig => docs/fig}/cui-absolute-circuit.jpg (100%) rename {fig => docs/fig}/dh-drawing.png (100%) rename {fig => docs/fig}/editable/2020-10-01-teo-cognitive-architecture.graphml (100%) rename {fig => docs/fig}/editable/CAN.svg (100%) rename {fig => docs/fig}/editable/Directions.svg (100%) rename {fig => docs/fig}/editable/Joints_(can).svg (100%) rename {fig => docs/fig}/editable/Joints_(yarp).svg (100%) rename {fig => docs/fig}/editable/Lengths.svg (100%) rename {fig => docs/fig}/editable/Masses.svg (100%) rename {fig => docs/fig}/editable/README.md (100%) rename {fig => docs/fig}/editable/Rekha.ttf (100%) rename {fig => docs/fig}/editable/SixCaps-license.txt (100%) rename {fig => docs/fig}/editable/SixCaps.ttf (100%) rename {fig => docs/fig}/editable/dh-drawing.svg (100%) rename {fig => docs/fig}/editable/teo-template.svg (100%) rename {fig => docs/fig}/editable/teo.mermaid (100%) rename {fig => docs/fig}/emergency-buttons-connectors.jpg (100%) rename {fig => docs/fig}/emergency-buttons.jpg (100%) rename {fig => docs/fig}/fetch-hand.pdf (100%) rename {fig => docs/fig}/fetch-proximal-falange.pdf (100%) rename {fig => docs/fig}/ipos-rs232-connector.jpg (100%) rename {fig => docs/fig}/jr3-circuit-connectors.jpg (100%) rename {fig => docs/fig}/kinfu.png (100%) rename {fig => docs/fig}/main-switches.jpg (100%) rename {fig => docs/fig}/pc-switches.jpg (100%) rename {fig => docs/fig}/power-supply.jpg (100%) rename {fig => docs/fig}/roboticslab-banner-350px.png (100%) rename {fig => docs/fig}/router-internal.jpg (100%) rename {fig => docs/fig}/technosoft-ipos-connectors.jpg (100%) rename {fig => docs/fig}/teo-follow-me-app.svg (100%) rename {fig => docs/fig}/teo-link-names.pdf (100%) rename {fig => docs/fig}/teo-yarpmanager.png (100%) rename {fig => docs/fig}/teo-yarpmotorgui.png (100%) rename {fig => docs/fig}/teoSim-depth.png (100%) rename {fig => docs/fig}/teoSim-floor-iron.png (100%) rename {fig => docs/fig}/teoSim-ft.png (100%) rename {fig => docs/fig}/teoSim-mesh.png (100%) rename {fig => docs/fig}/teoSim.png (100%) rename gitbook-cover.md => docs/index.md (88%) rename introduction.md => docs/introduction.md (100%) rename network-information.md => docs/network-information.md (97%) rename {overview => docs/overview}/README.md (100%) rename {overview => docs/overview}/demonstration.md (100%) rename {overview => docs/overview}/development.md (100%) rename {overview => docs/overview}/firmware.md (100%) rename {overview => docs/overview}/pc.md (99%) rename {overview => docs/overview}/research.md (100%) rename switches-and-power.md => docs/switches-and-power.md (100%) create mode 100644 docs/tables.md rename {tutorial => docs/tutorial}/README.md (93%) rename {tutorial => docs/tutorial}/ft.md (99%) rename {tutorial => docs/tutorial}/kinfu.md (100%) rename {tutorial => docs/tutorial}/mesh.md (100%) rename {tutorial => docs/tutorial}/motor.md (95%) rename {tutorial => docs/tutorial}/rgbd.md (99%) rename {tutorial => docs/tutorial}/trajectories.md (96%) delete mode 100644 js/scripts.js create mode 100644 mkdocs.yml create mode 100644 requirements.txt delete mode 100644 styles/website.css delete mode 100644 tables.md diff --git a/.github/workflows/gh-pages.yml b/.github/workflows/gh-pages.yml new file mode 100644 index 0000000..40f410c --- /dev/null +++ b/.github/workflows/gh-pages.yml @@ -0,0 +1,29 @@ +name: GitHub Pages + +on: + push: + branches: + - mkdocs # temporary + paths-ignore: + - README.md + - CONTRIBUTING.md + - CMakeLists.txt + workflow_dispatch: + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: fkirc/skip-duplicate-actions@v5 + with: + cancel_others: 'true' + - uses: actions/checkout@v4 + - name: Run MkDocs + run: | + pip install -r requirements.txt + mkdocs build + - uses: crazy-max/ghaction-github-pages@v4 + with: + build_dir: site + env: + GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} diff --git a/.github/workflows/gitbook.yml b/.github/workflows/gitbook.yml deleted file mode 100644 index c195aad..0000000 --- a/.github/workflows/gitbook.yml +++ /dev/null @@ -1,30 +0,0 @@ -name: GitBook - -on: - push: - branches: - - master - paths-ignore: - - README.md - - CONTRIBUTING.md - - CMakeLists.txt - workflow_dispatch: - -jobs: - deploy: - runs-on: ubuntu-latest - steps: - - uses: fkirc/skip-duplicate-actions@master - with: - cancel_others: 'true' - - uses: actions/checkout@v2 - - name: Run GitBook - run: | - docker run --rm -v $GITHUB_WORKSPACE:/gitbook ghcr.io/roboticslab-uc3m/gitbook:latest gitbook install - docker run --rm -v $GITHUB_WORKSPACE:/gitbook ghcr.io/roboticslab-uc3m/gitbook:latest gitbook build - sudo chmod -R a+rx _book # https://github.com/roboticslab-uc3m/teo-developer-manual/issues/69 - - uses: crazy-max/ghaction-github-pages@v2 - with: - build_dir: _book - env: - GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} diff --git a/.gitignore b/.gitignore index af2ea8e..8065b97 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ -# .gitignore ## Files we want to have locally, but do not want to push to remote ## Editor swap files @@ -6,17 +5,8 @@ *.swp *.orig -## CMake and C/C++ +## CMake build system **/build*/ -CMakeLists.txt.user -*.cproject -*.project -tags -## doxygen -doc/html -doc/doxygen_sqlite3.db - -## gitbook generated -/_book/ -/node_modules/ +## mkdocs generated +/site/ diff --git a/README.md b/README.md index af5357d..acd2d67 100644 --- a/README.md +++ b/README.md @@ -22,18 +22,19 @@ Please read the Developer Manual's [Asking Questions](https://robots.uc3m.es/dev It is useful to serve on `localhost` to modify the website and see changes locally. -1. From the root of the project, run the following command (which is universal for all [Gitbook (legacy)](https://github.com/GitbookIO/gitbook)-based projects): +1. From the root of the project, run the following command: ```bash - gitbook serve # command builds and serves; for installing required plugins, before first run please: gitbook install + pip install -r requirements.txt + mkdocs serve ``` -1. You can now browse the site at the default location: +1. You can now browse the site at the default location: ### How to upload changes to GitHub -This project is managed as any project on [GitHub](https://www.github.com). You may use [Git](https://git-scm.com) or even the GitHub web interface, both on which you can find many tutorials online. The following points are specific to the [Gitbook (legacy)](https://github.com/asrob-uc3m/actas/issues/148#issuecomment-449748350) mechanism used: +This project is managed as any project on [GitHub](https://www.github.com). You may use [Git](https://git-scm.com) or even the GitHub web interface, both on which you can find many tutorials online. The following points are specific to the MkDocs mechanism used: -1. Please **do not upload** the `_book/` folder. It is auto-generated locally, and the same should happen on the Gitbook (legacy) servers. +1. Please **do not upload** the `site/` folder. It is auto-generated locally, and the same should happen on the MkDocs servers. 1. It is safe to `git push` to any upstream branch, just remember that what is on `master` is what will be actually rendered as the website. diff --git a/SUMMARY.md b/SUMMARY.md deleted file mode 100644 index 10854ae..0000000 --- a/SUMMARY.md +++ /dev/null @@ -1,27 +0,0 @@ -# Summary - -* [TEO Developer Manual](gitbook-cover.md) -* [Introduction](introduction.md) -* [Cognitive Architecture](architecture.md) -* [Software Repositories](overview/README.md) - * [PC Software](overview/pc.md) - * [Firmware](overview/firmware.md) - * [Demonstration](overview/demonstration.md) - * [Research](overview/research.md) - * [Development](overview/development.md) -* [Tutorial](tutorial/README.md) - * [Motor Control](tutorial/motor.md) - * [Trajectory Execution](tutorial/trajectories.md) - * [RGB-D Sensor](tutorial/rgbd.md) - * [Mesh From Real Depth](tutorial/mesh.md) - * [Scene Reconstruction](tutorial/kinfu.md) - * [Force/Torque Sensors](tutorial/ft.md) -* [Diagrams](diagrams.md) -* [Tables](tables.md) -* [Dynamic information](dynamic-information.md) -* [Switches and Power](switches-and-power.md) -* [Connectors](connectors.md) -* [Network information](network-information.md) -* [Driver Check Procedure](driver-check-procedure.md) -* [Demo Procedure](demo-procedure.md) -* [Additional Resources](additional-resources.md) diff --git a/book.json b/book.json deleted file mode 100644 index 1c98466..0000000 --- a/book.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "structure": { - "readme": "gitbook-cover.md" - }, - "plugins": ["include-csv","embed-pdf","mermaid-gb3","include","page-toc","scripts"], - "pluginsConfig": { - "page-toc": { - "selector": ".markdown-section h2, .markdown-section h3, .markdown-section h4", - "position": "before-first", - "showByDefault": true - }, - "scripts": { - "files": [ - "./js/scripts.js" - ] - } - } -} diff --git a/additional-resources.md b/docs/additional-resources.md similarity index 100% rename from additional-resources.md rename to docs/additional-resources.md diff --git a/architecture.md b/docs/architecture.md similarity index 100% rename from architecture.md rename to docs/architecture.md diff --git a/docs/assets/roboticslab.png b/docs/assets/roboticslab.png new file mode 100644 index 0000000000000000000000000000000000000000..30c9298341cfef56c5359c9528e846b5634c0f88 GIT binary patch literal 32270 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 Ml2?-}gPI2a59$Zw4*&oF literal 0 HcmV?d00001 diff --git a/connectors.md b/docs/connectors.md similarity index 100% rename from connectors.md rename to docs/connectors.md diff --git a/csv/bom.csv b/docs/csv/bom.csv similarity index 100% rename from csv/bom.csv rename to docs/csv/bom.csv diff --git a/csv/deprecated/dh-transformations.csv b/docs/csv/deprecated/dh-transformations.csv similarity index 100% rename from csv/deprecated/dh-transformations.csv rename to docs/csv/deprecated/dh-transformations.csv diff --git a/csv/deprecated/dh-trunk.csv b/docs/csv/deprecated/dh-trunk.csv similarity index 100% rename from csv/deprecated/dh-trunk.csv rename to docs/csv/deprecated/dh-trunk.csv diff --git a/csv/dh-fetch.csv b/docs/csv/dh-fetch.csv similarity index 100% rename from csv/dh-fetch.csv rename to docs/csv/dh-fetch.csv diff --git a/csv/dh-head-transformations.csv b/docs/csv/dh-head-transformations.csv similarity index 100% rename from csv/dh-head-transformations.csv rename to docs/csv/dh-head-transformations.csv diff --git a/csv/dh-head.csv b/docs/csv/dh-head.csv similarity index 100% rename from csv/dh-head.csv rename to docs/csv/dh-head.csv diff --git a/csv/dh-leftArm.csv b/docs/csv/dh-leftArm.csv similarity index 100% rename from csv/dh-leftArm.csv rename to docs/csv/dh-leftArm.csv diff --git a/csv/dh-leftLeg.csv b/docs/csv/dh-leftLeg.csv similarity index 100% rename from csv/dh-leftLeg.csv rename to docs/csv/dh-leftLeg.csv diff --git a/csv/dh-rightArm.csv b/docs/csv/dh-rightArm.csv similarity index 100% rename from csv/dh-rightArm.csv rename to docs/csv/dh-rightArm.csv diff --git a/csv/dh-rightLeg.csv b/docs/csv/dh-rightLeg.csv similarity index 100% rename from csv/dh-rightLeg.csv rename to docs/csv/dh-rightLeg.csv diff --git a/csv/dh-root-head.csv b/docs/csv/dh-root-head.csv similarity index 100% rename from csv/dh-root-head.csv rename to docs/csv/dh-root-head.csv diff --git a/csv/dh-root-leftArm.csv b/docs/csv/dh-root-leftArm.csv similarity index 100% rename from csv/dh-root-leftArm.csv rename to docs/csv/dh-root-leftArm.csv diff --git a/csv/dh-root-leftLeg.csv b/docs/csv/dh-root-leftLeg.csv similarity index 100% rename from csv/dh-root-leftLeg.csv rename to docs/csv/dh-root-leftLeg.csv diff --git a/csv/dh-root-rightArm.csv b/docs/csv/dh-root-rightArm.csv similarity index 100% rename from csv/dh-root-rightArm.csv rename to docs/csv/dh-root-rightArm.csv diff --git a/csv/dh-root-rightLeg.csv b/docs/csv/dh-root-rightLeg.csv similarity index 100% rename from csv/dh-root-rightLeg.csv rename to docs/csv/dh-root-rightLeg.csv diff --git a/csv/dynamic_info_absolute.csv b/docs/csv/dynamic_info_absolute.csv similarity index 100% rename from csv/dynamic_info_absolute.csv rename to docs/csv/dynamic_info_absolute.csv diff --git a/csv/dynamic_info_relative.csv b/docs/csv/dynamic_info_relative.csv similarity index 100% rename from csv/dynamic_info_relative.csv rename to docs/csv/dynamic_info_relative.csv diff --git a/csv/editable/motores.ods b/docs/csv/editable/motores.ods similarity index 100% rename from csv/editable/motores.ods rename to docs/csv/editable/motores.ods diff --git a/csv/lengths.csv b/docs/csv/lengths.csv similarity index 100% rename from csv/lengths.csv rename to docs/csv/lengths.csv diff --git a/csv/motores-motores.csv b/docs/csv/motores-motores.csv similarity index 100% rename from csv/motores-motores.csv rename to docs/csv/motores-motores.csv diff --git a/csv/motores-protecciones-brazos.csv b/docs/csv/motores-protecciones-brazos.csv similarity index 100% rename from csv/motores-protecciones-brazos.csv rename to docs/csv/motores-protecciones-brazos.csv diff --git a/csv/motores-protecciones-piernas.csv b/docs/csv/motores-protecciones-piernas.csv similarity index 100% rename from csv/motores-protecciones-piernas.csv rename to docs/csv/motores-protecciones-piernas.csv diff --git a/csv/motores-transmision.csv b/docs/csv/motores-transmision.csv similarity index 100% rename from csv/motores-transmision.csv rename to docs/csv/motores-transmision.csv diff --git a/csv/teo-center-of-masses.csv b/docs/csv/teo-center-of-masses.csv similarity index 100% rename from csv/teo-center-of-masses.csv rename to docs/csv/teo-center-of-masses.csv diff --git a/demo-procedure.md b/docs/demo-procedure.md similarity index 76% rename from demo-procedure.md rename to docs/demo-procedure.md index 7b3550b..9e57c2c 100644 --- a/demo-procedure.md +++ b/docs/demo-procedure.md @@ -6,11 +6,11 @@ 1. Place the robot in a position where it can have space and cannot hit any obstacle. 1. Make sure all emergency stop buttons (main and per robot part) are closed. 1. Turn on both [42V power supplies](fig/power-supply.jpg) (check they are actually at 42V before proceeding further) and open the main emergency button. -1. On the [rear panel](/fig/main-switches.jpg) of the robot, press the "General" red button first. The button should light up. +1. On the [rear panel](fig/main-switches.jpg) of the robot, press the "General" red button first. The button should light up. 1. Press other relevant buttons and make sure they light up: manipulation PC and the robot parts you want to use. 1. Turn on the manipulation PC. 1. Wait until the manipulation PC has finished booting. You can monitor this through `ping manipulation` issued from another PC connected to the robot's local network. -1. Open the [emergency buttons](/fig/emergency-buttons.jpg) for the robot parts you need. Keep these buttons close and ready to be used. +1. Open the [emergency buttons](fig/emergency-buttons.jpg) for the robot parts you need. Keep these buttons close and ready to be used. ## Demonstration Instructions @@ -24,4 +24,4 @@ Refer to the specific instructions of the demo you want to launch: ## See also - [driver check procedure](driver-check-procedure.md) -- +- wiki: [Qué llevar a Demos (TEO)](https://apps-robots.uc3m.es/robots/wiki/Qu%C3%A9_llevar_a_Demos_(TEO)) diff --git a/diagrams.md b/docs/diagrams.md similarity index 64% rename from diagrams.md rename to docs/diagrams.md index 87ce402..bac2cd2 100644 --- a/diagrams.md +++ b/docs/diagrams.md @@ -24,11 +24,12 @@ ## Link Names ```mermaid -!INCLUDE "./fig/editable/teo.mermaid" +{% include "fig/editable/teo.mermaid" %} ``` -- Github: [teo-link-names.pdf](fig/teo-link-names.pdf) -- Gitbook: {% pdf src="fig/teo-link-names.pdf", width="100%", height="1100" %}{% endpdf %} +[teo-link-names.pdf](fig/teo-link-names.pdf) + +![TEO link names](fig/teo-link-names.pdf){ type=application/pdf style="width: 100%; height: 967px;" } ## COGs @@ -46,8 +47,9 @@ ### F/T sensors (Mechanical) -- Github: [Jr3 50M31 corregido.pdf](fig/Jr3_50M31_corregido.pdf) -- Gitbook: {% pdf src="fig/Jr3_50M31_corregido.pdf", width="100%", height="590" %}{% endpdf %} +[Jr3 50M31 corregido.pdf](fig/Jr3_50M31_corregido.pdf) + +![Jr3 50M31 corregido](fig/Jr3_50M31_corregido.pdf){ type=application/pdf style="width: 100%; height: 509px;" } ## Lacquey Fetch @@ -55,10 +57,12 @@ This sketches were made with SolidWorks in order to provide the position of the ### Lacquey Fetch (Hand) -- Github: [fetch-hand.pdf](fig/fetch-hand.pdf) -- Gitbook: {% pdf src="fig/fetch-hand.pdf", width="100%", height="590" %}{% endpdf %} +[fetch-hand.pdf](fig/fetch-hand.pdf) + +![fetch-hand](fig/fetch-hand.pdf){ type=application/pdf style="width: 100%; height: 509px;" } ### Lacquey Fetch (Proximal Falange) -- Github: [fetch-proximal-falange.pdf](fig/fetch-proximal-falange.pdf) -- Gitbook: {% pdf src="fig/fetch-proximal-falange.pdf", width="100%", height="590" %}{% endpdf %} +[fetch-proximal-falange.pdf](fig/fetch-proximal-falange.pdf) + +![fetch-proximal-falange](fig/fetch-proximal-falange.pdf){ type=application/pdf style="width: 100%; height: 509px;" } diff --git a/driver-check-procedure.md b/docs/driver-check-procedure.md similarity index 92% rename from driver-check-procedure.md rename to docs/driver-check-procedure.md index 957135f..1cf581a 100644 --- a/driver-check-procedure.md +++ b/docs/driver-check-procedure.md @@ -6,7 +6,7 @@ Basic steps to power things up and check the drivers of the robot: 1. Make sure all emergency stop buttons (main and per robot part) are closed. 1. Turn on both [42V power supplies](fig/power-supply.jpg) (check they are actually at 42V before proceeding further) and open the main emergency button. -1. On the [rear panel](/fig/main-switches.jpg) of the robot, press the "General" red button first. The button should light up. +1. On the [rear panel](fig/main-switches.jpg) of the robot, press the "General" red button first. The button should light up. 1. Press other relevant buttons and make sure they light up: manipulation PC and the desired robot part. 1. Turn on the manipulation PC. 1. Wait until the manipulation PC has finished booting. You can monitor this through `ping manipulation` issued from another PC connected to the robot's local network. @@ -25,7 +25,7 @@ Once all connection issues (if present) have been sorted out, you can proceed to 1. Assuming we want to send joint commands to the right arm, while still logged in via SSH to the manipulation PC: `launchCanBus --from manipulation-rightArm.ini`. 1. Identify any errors, if present. The controller has restart mechanisms that may attempt to recover from errors and may or may not succeed. -1. [Absolute encoders](/fig/cui-absolute-circuit.jpg) are prone to fail. They are given a fixed number of retries. If it is not possible to establish communication, the YARP plugin related to this iPOS drive and encoder also fails on initialization. Terminate the `launchCanBus` process and try again. +1. [Absolute encoders](fig/cui-absolute-circuit.jpg) are prone to fail. They are given a fixed number of retries. If it is not possible to establish communication, the YARP plugin related to this iPOS drive and encoder also fails on initialization. Terminate the `launchCanBus` process and try again. 1. On either the robot's PC through another SSH session or on an external PC connected to the robot's local network, issue `yarp rpc /teo/rightArm/rpc:i`. 1. On startup, robot joints should be set in position control mode. Within the RPC session, issue `get icmd cmds`. This should return a list of `pos` vocabs. 1. If any vocab is not equal to `pos` (usually in case of failure its value is `cfgn`, which means "not configured"), identify the error in the console output. diff --git a/dynamic-information.md b/docs/dynamic-information.md similarity index 100% rename from dynamic-information.md rename to docs/dynamic-information.md diff --git a/fig/2020-10-01-teo-cognitive-architecture.svg b/docs/fig/2020-10-01-teo-cognitive-architecture.svg similarity index 100% rename from fig/2020-10-01-teo-cognitive-architecture.svg rename to docs/fig/2020-10-01-teo-cognitive-architecture.svg diff --git a/fig/CAN.png b/docs/fig/CAN.png similarity index 100% rename from fig/CAN.png rename to docs/fig/CAN.png diff --git a/fig/Directions.png b/docs/fig/Directions.png similarity index 100% rename from fig/Directions.png rename to docs/fig/Directions.png diff --git a/fig/Ftsensors.png b/docs/fig/Ftsensors.png similarity index 100% rename from fig/Ftsensors.png rename to docs/fig/Ftsensors.png diff --git a/fig/Joints_(can).png b/docs/fig/Joints_(can).png similarity index 100% rename from fig/Joints_(can).png rename to docs/fig/Joints_(can).png diff --git a/fig/Joints_(yarp).png b/docs/fig/Joints_(yarp).png similarity index 100% rename from fig/Joints_(yarp).png rename to docs/fig/Joints_(yarp).png diff --git a/fig/Jr3_50M31_corregido.pdf b/docs/fig/Jr3_50M31_corregido.pdf similarity index 100% rename from fig/Jr3_50M31_corregido.pdf rename to docs/fig/Jr3_50M31_corregido.pdf diff --git a/fig/Lengths.png b/docs/fig/Lengths.png similarity index 100% rename from fig/Lengths.png rename to docs/fig/Lengths.png diff --git a/fig/Masses.png b/docs/fig/Masses.png similarity index 100% rename from fig/Masses.png rename to docs/fig/Masses.png diff --git a/fig/README.md b/docs/fig/README.md similarity index 100% rename from fig/README.md rename to docs/fig/README.md diff --git a/fig/TEO_by_links.jpg b/docs/fig/TEO_by_links.jpg similarity index 100% rename from fig/TEO_by_links.jpg rename to docs/fig/TEO_by_links.jpg diff --git a/fig/cui-absolute-circuit.jpg b/docs/fig/cui-absolute-circuit.jpg similarity index 100% rename from fig/cui-absolute-circuit.jpg rename to docs/fig/cui-absolute-circuit.jpg diff --git a/fig/dh-drawing.png b/docs/fig/dh-drawing.png similarity index 100% rename from fig/dh-drawing.png rename to docs/fig/dh-drawing.png diff --git a/fig/editable/2020-10-01-teo-cognitive-architecture.graphml b/docs/fig/editable/2020-10-01-teo-cognitive-architecture.graphml similarity index 100% rename from fig/editable/2020-10-01-teo-cognitive-architecture.graphml rename to docs/fig/editable/2020-10-01-teo-cognitive-architecture.graphml diff --git a/fig/editable/CAN.svg b/docs/fig/editable/CAN.svg similarity index 100% rename from fig/editable/CAN.svg rename to docs/fig/editable/CAN.svg diff --git a/fig/editable/Directions.svg b/docs/fig/editable/Directions.svg similarity index 100% rename from fig/editable/Directions.svg rename to docs/fig/editable/Directions.svg diff --git a/fig/editable/Joints_(can).svg b/docs/fig/editable/Joints_(can).svg similarity index 100% rename from fig/editable/Joints_(can).svg rename to docs/fig/editable/Joints_(can).svg diff --git a/fig/editable/Joints_(yarp).svg b/docs/fig/editable/Joints_(yarp).svg similarity index 100% rename from fig/editable/Joints_(yarp).svg rename to docs/fig/editable/Joints_(yarp).svg diff --git a/fig/editable/Lengths.svg b/docs/fig/editable/Lengths.svg similarity index 100% rename from fig/editable/Lengths.svg rename to docs/fig/editable/Lengths.svg diff --git a/fig/editable/Masses.svg b/docs/fig/editable/Masses.svg similarity index 100% rename from fig/editable/Masses.svg rename to docs/fig/editable/Masses.svg diff --git a/fig/editable/README.md b/docs/fig/editable/README.md similarity index 100% rename from fig/editable/README.md rename to docs/fig/editable/README.md diff --git a/fig/editable/Rekha.ttf b/docs/fig/editable/Rekha.ttf similarity index 100% rename from fig/editable/Rekha.ttf rename to docs/fig/editable/Rekha.ttf diff --git a/fig/editable/SixCaps-license.txt b/docs/fig/editable/SixCaps-license.txt similarity index 100% rename from fig/editable/SixCaps-license.txt rename to docs/fig/editable/SixCaps-license.txt diff --git a/fig/editable/SixCaps.ttf b/docs/fig/editable/SixCaps.ttf similarity index 100% rename from fig/editable/SixCaps.ttf rename to docs/fig/editable/SixCaps.ttf diff --git a/fig/editable/dh-drawing.svg b/docs/fig/editable/dh-drawing.svg similarity index 100% rename from fig/editable/dh-drawing.svg rename to docs/fig/editable/dh-drawing.svg diff --git a/fig/editable/teo-template.svg b/docs/fig/editable/teo-template.svg similarity index 100% rename from fig/editable/teo-template.svg rename to docs/fig/editable/teo-template.svg diff --git a/fig/editable/teo.mermaid b/docs/fig/editable/teo.mermaid similarity index 100% rename from fig/editable/teo.mermaid rename to docs/fig/editable/teo.mermaid diff --git a/fig/emergency-buttons-connectors.jpg b/docs/fig/emergency-buttons-connectors.jpg similarity index 100% rename from fig/emergency-buttons-connectors.jpg rename to docs/fig/emergency-buttons-connectors.jpg diff --git a/fig/emergency-buttons.jpg b/docs/fig/emergency-buttons.jpg similarity index 100% rename from fig/emergency-buttons.jpg rename to docs/fig/emergency-buttons.jpg diff --git a/fig/fetch-hand.pdf b/docs/fig/fetch-hand.pdf similarity index 100% rename from fig/fetch-hand.pdf rename to docs/fig/fetch-hand.pdf diff --git a/fig/fetch-proximal-falange.pdf b/docs/fig/fetch-proximal-falange.pdf similarity index 100% rename from fig/fetch-proximal-falange.pdf rename to docs/fig/fetch-proximal-falange.pdf diff --git a/fig/ipos-rs232-connector.jpg b/docs/fig/ipos-rs232-connector.jpg similarity index 100% rename from fig/ipos-rs232-connector.jpg rename to docs/fig/ipos-rs232-connector.jpg diff --git a/fig/jr3-circuit-connectors.jpg b/docs/fig/jr3-circuit-connectors.jpg similarity index 100% rename from fig/jr3-circuit-connectors.jpg rename to docs/fig/jr3-circuit-connectors.jpg diff --git a/fig/kinfu.png b/docs/fig/kinfu.png similarity index 100% rename from fig/kinfu.png rename to docs/fig/kinfu.png diff --git a/fig/main-switches.jpg b/docs/fig/main-switches.jpg similarity index 100% rename from fig/main-switches.jpg rename to docs/fig/main-switches.jpg diff --git a/fig/pc-switches.jpg b/docs/fig/pc-switches.jpg similarity index 100% rename from fig/pc-switches.jpg rename to docs/fig/pc-switches.jpg diff --git a/fig/power-supply.jpg b/docs/fig/power-supply.jpg similarity index 100% rename from fig/power-supply.jpg rename to docs/fig/power-supply.jpg diff --git a/fig/roboticslab-banner-350px.png b/docs/fig/roboticslab-banner-350px.png similarity index 100% rename from fig/roboticslab-banner-350px.png rename to docs/fig/roboticslab-banner-350px.png diff --git a/fig/router-internal.jpg b/docs/fig/router-internal.jpg similarity index 100% rename from fig/router-internal.jpg rename to docs/fig/router-internal.jpg diff --git a/fig/technosoft-ipos-connectors.jpg b/docs/fig/technosoft-ipos-connectors.jpg similarity index 100% rename from fig/technosoft-ipos-connectors.jpg rename to docs/fig/technosoft-ipos-connectors.jpg diff --git a/fig/teo-follow-me-app.svg b/docs/fig/teo-follow-me-app.svg similarity index 100% rename from fig/teo-follow-me-app.svg rename to docs/fig/teo-follow-me-app.svg diff --git a/fig/teo-link-names.pdf b/docs/fig/teo-link-names.pdf similarity index 100% rename from fig/teo-link-names.pdf rename to docs/fig/teo-link-names.pdf diff --git a/fig/teo-yarpmanager.png b/docs/fig/teo-yarpmanager.png similarity index 100% rename from fig/teo-yarpmanager.png rename to docs/fig/teo-yarpmanager.png diff --git a/fig/teo-yarpmotorgui.png b/docs/fig/teo-yarpmotorgui.png similarity index 100% rename from fig/teo-yarpmotorgui.png rename to docs/fig/teo-yarpmotorgui.png diff --git a/fig/teoSim-depth.png b/docs/fig/teoSim-depth.png similarity index 100% rename from fig/teoSim-depth.png rename to docs/fig/teoSim-depth.png diff --git a/fig/teoSim-floor-iron.png b/docs/fig/teoSim-floor-iron.png similarity index 100% rename from fig/teoSim-floor-iron.png rename to docs/fig/teoSim-floor-iron.png diff --git a/fig/teoSim-ft.png b/docs/fig/teoSim-ft.png similarity index 100% rename from fig/teoSim-ft.png rename to docs/fig/teoSim-ft.png diff --git a/fig/teoSim-mesh.png b/docs/fig/teoSim-mesh.png similarity index 100% rename from fig/teoSim-mesh.png rename to docs/fig/teoSim-mesh.png diff --git a/fig/teoSim.png b/docs/fig/teoSim.png similarity index 100% rename from fig/teoSim.png rename to docs/fig/teoSim.png diff --git a/gitbook-cover.md b/docs/index.md similarity index 88% rename from gitbook-cover.md rename to docs/index.md index c8fd906..bb62a12 100644 --- a/gitbook-cover.md +++ b/docs/index.md @@ -4,7 +4,7 @@ [TEO](http://roboticslab.uc3m.es/roboticslab/robot/teo-humanoid) Developer Manual @ [roboticslab-uc3m](https://github.com/roboticslab-uc3m) -Click on the option you want, or use the arrows to move sequentially +Click on the option you want, or use the `P` and `N` keys to navigate through the sections (Previous, Next). ## Additional notes diff --git a/introduction.md b/docs/introduction.md similarity index 100% rename from introduction.md rename to docs/introduction.md diff --git a/network-information.md b/docs/network-information.md similarity index 97% rename from network-information.md rename to docs/network-information.md index 2b09339..77d6d8e 100644 --- a/network-information.md +++ b/docs/network-information.md @@ -155,9 +155,9 @@ yarprun --server /head - [speech](https://github.com/roboticslab-uc3m/speech) - `YARP_COLORED_OUTPUT=1` -## Mapping hostnames to IP addreses in your computer +## Mapping hostnames to IP addresses in your computer -You can edit the `/etc/hosts` file of your system for mapping some hostnames to IP addreses. Now, you can associate the name of teo pc's +You can edit the `/etc/hosts` file of your system for mapping some hostnames to IP addresses. Now, you can associate the name of teo pc's with their IPs: ```bash diff --git a/overview/README.md b/docs/overview/README.md similarity index 100% rename from overview/README.md rename to docs/overview/README.md diff --git a/overview/demonstration.md b/docs/overview/demonstration.md similarity index 100% rename from overview/demonstration.md rename to docs/overview/demonstration.md diff --git a/overview/development.md b/docs/overview/development.md similarity index 100% rename from overview/development.md rename to docs/overview/development.md diff --git a/overview/firmware.md b/docs/overview/firmware.md similarity index 100% rename from overview/firmware.md rename to docs/overview/firmware.md diff --git a/overview/pc.md b/docs/overview/pc.md similarity index 99% rename from overview/pc.md rename to docs/overview/pc.md index 91b8c1c..b1483df 100644 --- a/overview/pc.md +++ b/docs/overview/pc.md @@ -3,6 +3,7 @@ The main TEO software repository intended for installing on any PC is called [teo-main](https://github.com/roboticslab-uc3m/teo-main). It pulls contents from the following general repositories: + * [developer-manual](https://github.com/roboticslab-uc3m/developer-manual): Developer Manual for [roboticslab-uc3m](https://github.com/roboticslab-uc3m). * [project-generator](https://github.com/roboticslab-uc3m/project-generator): Project structure and file generation for [roboticslab-uc3m](https://github.com/roboticslab-uc3m), using templates and user CLI input. * [installation-guides](https://github.com/roboticslab-uc3m/installation-guides): Centralized administration of dependency installation guides. @@ -13,6 +14,7 @@ It pulls contents from the following general repositories: * [tools](https://github.com/roboticslab-uc3m/tools): Additional software tools. As well as the following TEO-specific repositories: + * [teo-developer-manual](https://github.com/roboticslab-uc3m/teo-developer-manual): This TEO developer manual. * [teo-configuration-files](https://github.com/roboticslab-uc3m/teo-configuration-files): TEO configuration files, ranging from kinematic description files to scripts such as `teoSim`. * [teo-openrave-models](https://github.com/roboticslab-uc3m/teo-openrave-models): TEO OpenRAVE models. diff --git a/overview/research.md b/docs/overview/research.md similarity index 100% rename from overview/research.md rename to docs/overview/research.md diff --git a/switches-and-power.md b/docs/switches-and-power.md similarity index 100% rename from switches-and-power.md rename to docs/switches-and-power.md diff --git a/docs/tables.md b/docs/tables.md new file mode 100644 index 0000000..42bec0c --- /dev/null +++ b/docs/tables.md @@ -0,0 +1,155 @@ +# Tables + +## Joint Limits + +Can be found at [Motores: motores](#motores-motores) + +## DH Parameters + +### Group: head + +#### trunk for head (root to neck) + +[dh-root-head.csv](csv/dh-root-head.csv) + +{{ read_csv('docs/csv/dh-root-head.csv') }} + +#### head + +[dh-head.csv](csv/dh-head.csv) + +{{ read_csv('docs/csv/dh-head.csv') }} + +#### head additional transformations + +[dh-head-transformations.csv](csv/dh-head-transformations.csv) + +{{ read_csv('docs/csv/dh-head-transformations.csv') }} + +### Group: rightArm + +#### trunk for rightArm (root to rightArm) + +[dh-root-rightArm.csv](csv/dh-root-rightArm.csv) + +{{ read_csv('docs/csv/dh-root-rightArm.csv') }} + +#### rightArm + +[dh-rightArm.csv](csv/dh-rightArm.csv) + +{{ read_csv('docs/csv/dh-rightArm.csv') }} + +#### fetch (right) + +[dh-fetch.csv](csv/dh-fetch.csv) + +{{ read_csv('docs/csv/dh-fetch.csv') }} + +### Group: leftArm + +#### trunk for leftArm (root to leftArm) + +[dh-root-leftArm.csv](csv/dh-root-leftArm.csv) + +{{ read_csv('docs/csv/dh-root-leftArm.csv') }} + +#### leftArm + +[dh-leftArm.csv](csv/dh-leftArm.csv) + +{{ read_csv('docs/csv/dh-leftArm.csv') }} + +#### fetch (left) + +[dh-fetch.csv](csv/dh-fetch.csv) + +{{ read_csv('docs/csv/dh-fetch.csv') }} + +### Group: rightLeg + +#### root to rightLeg + +[dh-root-rightLeg.csv](csv/dh-root-rightLeg.csv) + +{{ read_csv('docs/csv/dh-root-rightLeg.csv') }} + +#### rightLeg + +[dh-rightLeg.csv](csv/dh-rightLeg.csv) + +{{ read_csv('docs/csv/dh-rightLeg.csv') }} + +### Group: leftLeg + +#### root to leftLeg + +[dh-root-leftLeg.csv](csv/dh-root-leftLeg.csv) + +{{ read_csv('docs/csv/dh-root-leftLeg.csv') }} + +#### leftLeg + +[dh-leftLeg.csv](csv/dh-leftLeg.csv) + +{{ read_csv('docs/csv/dh-leftLeg.csv') }} + +### Group: Deprecated transformations + +The below are not required at time of writing, and may become outdated with time. + +#### Deprecated trunk (root to hip) + +This is the original `trunk`, but the three variants (for `head`, `rightArm`, `leftArm`; respectively, above) seem to be more useful. + +[deprecated/dh-trunk.csv](csv/deprecated/dh-trunk.csv) + +{{ read_csv('docs/csv/deprecated/dh-trunk.csv') }} + +#### Deprecated additional transformations + +Some not required, redundant or may be derived from from existing `dh-root-*.csv` contents (above). + +[deprecated/dh-transformations.csv](csv/deprecated/dh-transformations.csv) + +{{ read_csv('docs/csv/deprecated/dh-transformations.csv') }} + +## Link Lengths + +[lengths.csv](csv/lengths.csv) + +{{ read_csv('docs/csv/lengths.csv') }} + +## Bill of materials (BOM) + +[bom.csv](csv/bom.csv) + +{{ read_csv('docs/csv/bom.csv') }} + +### Motores + +- Original with formulas: [editable/motores.ods](csv/editable/motores.ods) + +### Motores: motores + +[motores-motores.csv](csv/motores-motores.csv) + +{{ read_csv('docs/csv/motores-motores.csv') }} + +### Motores: protecciones-brazos + +[motores-protecciones-brazos.csv](csv/motores-protecciones-brazos.csv) + +{{ read_csv('docs/csv/motores-protecciones-brazos.csv') }} + +### Motores: protecciones-piernas + +[motores-protecciones-piernas.csv](csv/motores-protecciones-piernas.csv) + +{{ read_csv('docs/csv/motores-protecciones-piernas.csv') }} + +### Motores: transmision + +[motores-transmision.csv](csv/motores-transmision.csv) + +{{ read_csv('docs/csv/motores-transmision.csv') }} diff --git a/tutorial/README.md b/docs/tutorial/README.md similarity index 93% rename from tutorial/README.md rename to docs/tutorial/README.md index e69044c..446c411 100644 --- a/tutorial/README.md +++ b/docs/tutorial/README.md @@ -7,10 +7,11 @@ Read the Introduction section of the Developer manual: [Developer Manual (Introd ## Minimum installation for simulator As a bare minimum to try the simulator, install the following (note: there is a shortcut via the superbuild https://github.com/roboticslab-uc3m/teo-main but let's follow this minimalistic procedure instead), each with their own dependencies: -- https://github.com/roboticslab-uc3m/openrave-yarp-plugins -- https://github.com/roboticslab-uc3m/teo-openrave-models -- https://github.com/roboticslab-uc3m/teo-configuration-files -- https://github.com/roboticslab-uc3m/tools + +- [openrave-yarp-plugins](https://github.com/roboticslab-uc3m/openrave-yarp-plugins) +- [teo-openrave-models](https://github.com/roboticslab-uc3m/teo-openrave-models) +- [teo-configuration-files](https://github.com/roboticslab-uc3m/teo-configuration-files) +- [tools](https://github.com/roboticslab-uc3m/tools) ## Now what can I do? @@ -75,6 +76,7 @@ Note that you can directly interface with the world port. While this is consider Great news! Interfacing with the robot in simulation will be exactly the same as with the real robot! 2x1! Yay! It in fact shares common interfaces with all YARP-speaking robots! Nx1!! Essentially, we can interact with the robot: + 1. Directly talking to ports. This is considered a **bad practice when APIs are available**, but use cases include: fumbling around on a day just like today, speaking with a port with no API (e.g. no client network wrapper), debugging, or just plain laziness. Our own set of hacks (it's hackish because protocols may be subject to change) can be found at: [yarp-tricks (from developer-manual)](https://robots.uc3m.es/developer-manual/appendix/yarp-tricks.html) 2. Via GUI. In certain cases, we have GUIs! 3. **Best practice:** Within our programs and scripts, using the APIs provided by YARP. They are available in many programming languages (C++, Python, MATLAB...). Our own set of examples can be found at: [examples (from yarp-devices)](https://github.com/roboticslab-uc3m/yarp-devices/tree/master/examples) diff --git a/tutorial/ft.md b/docs/tutorial/ft.md similarity index 99% rename from tutorial/ft.md rename to docs/tutorial/ft.md index 5dd48f4..59566ab 100644 --- a/tutorial/ft.md +++ b/docs/tutorial/ft.md @@ -5,6 +5,7 @@ Requires at least YARP 3.4. First, activate the `teoSim` Force/Torque Sensors: I ## Via GUIs To view the force/torque signals, perform the sequence: + 1. In the YARP application manager instance, navigate through `Applications` > `teoSimTools_App` > right-click on the corresponding `yarpscope` > `Run` 2. In the YARP application manager instance, navigate through `Applications` > `teoSimTools_App` > right-click on the corresponding (bottom frame) connection > `Connect` diff --git a/tutorial/kinfu.md b/docs/tutorial/kinfu.md similarity index 100% rename from tutorial/kinfu.md rename to docs/tutorial/kinfu.md diff --git a/tutorial/mesh.md b/docs/tutorial/mesh.md similarity index 100% rename from tutorial/mesh.md rename to docs/tutorial/mesh.md diff --git a/tutorial/motor.md b/docs/tutorial/motor.md similarity index 95% rename from tutorial/motor.md rename to docs/tutorial/motor.md index c92f92a..b5947c6 100644 --- a/tutorial/motor.md +++ b/docs/tutorial/motor.md @@ -1,6 +1,6 @@ # Tutorial: Motor Control -Throughout this section, refer to the [Joint Indexes (YARP ports)](diagrams.html#joint-indexes) diagram to see port names and joint indexes, as well as the [Joint Directions of Rotation](diagrams.html#joint-directions-of-rotation) diagram. +Throughout this section, refer to the [Joint Indexes (YARP ports)](../diagrams.md#joint-indexes) diagram to see port names and joint indexes, as well as the [Joint Directions of Rotation](../diagrams.md#joint-directions-of-rotation) diagram. ## Directly talking to ports @@ -29,7 +29,6 @@ In line with the hacks mentioned above, refer to a more exhaustive list at: [yar Two options to launch the YARP motor GUI for `teoSim`: - Via terminal: - ```bash yarpmotorgui --from yarpmotorgui/teoSim.ini ``` diff --git a/tutorial/rgbd.md b/docs/tutorial/rgbd.md similarity index 99% rename from tutorial/rgbd.md rename to docs/tutorial/rgbd.md index c03038f..2e80e0f 100644 --- a/tutorial/rgbd.md +++ b/docs/tutorial/rgbd.md @@ -5,6 +5,7 @@ First, activate the `teoSim` RGB-D Sensor: In the YARP application manager insta ## Via GUIs To view the depth image, perform the sequence: + 1. In the YARP application manager instance, navigate through `Applications` > `teoSimTools_App` > right-click on the `yarpview` corresponding to the `depthImage` > `Run` 2. In the YARP application manager instance, navigate through `Applications` > `teoSimTools_App` > right-click on the connection (bottom frame) corresponding to the `depthImage` > `Connect` diff --git a/tutorial/trajectories.md b/docs/tutorial/trajectories.md similarity index 96% rename from tutorial/trajectories.md rename to docs/tutorial/trajectories.md index 63100ad..8869d92 100644 --- a/tutorial/trajectories.md +++ b/docs/tutorial/trajectories.md @@ -1,6 +1,6 @@ # Tutorial: Trajectory Execution -Now that you should know how to instruct your robot to go from point A to point B in a simple motion instruction (see [Tutorial: Motor Control](./tutorial/motor.md)), this tutorial will cover more complex, arbitrary multi-setpoint trajectories. +Now that you should know how to instruct your robot to go from point A to point B in a simple motion instruction (see [Tutorial: Motor Control](motor.md)), this tutorial will cover more complex, arbitrary multi-setpoint trajectories. ## Position-controlled high frequency trajectories @@ -13,7 +13,7 @@ In short, this is your preferred control mode if you need to: 2. translate a "live" source of targets (i.e. **online-based**) into robot motion, acquired through a controller device such as a joystick, fetched from a visual servoing system, or generated with a time-parameterized formula, for instance. However, it is **not** a good choice whenever the distance between points is too high and/or the expected time step per instruction is close to the order of one second or more (most usually, we want to issue position commands every 10-50 milliseconds, hence the "high frequency"). -In that case, stick to [Tutorial: Motor Control](./tutorial/motor.md) and the [`yarp::dev::IPositionControl`](http://www.yarp.it/git-master/classyarp_1_1dev_1_1IPositionControl.html) interface. +In that case, stick to [Tutorial: Motor Control](motor.md) and the [`yarp::dev::IPositionControl`](http://www.yarp.it/git-master/classyarp_1_1dev_1_1IPositionControl.html) interface. The adequate YARP interface to achieve position-controlled high frequency trajectories is [`yarp::dev::IPositionDirect`](http://www.yarp.it/git-master/classyarp_1_1dev_1_1IPositionDirect.html). diff --git a/js/scripts.js b/js/scripts.js deleted file mode 100644 index 4e0b08b..0000000 --- a/js/scripts.js +++ /dev/null @@ -1,14 +0,0 @@ -// Enables horizontal scroll on tables (in conjunction with its CSS counterpart) -// Thank you -// Also see original by -require(["gitbook", "jQuery"], function(gitbook, $) { - gitbook.events.bind("page.change", function() { - [].slice.call(document.querySelectorAll('table')).forEach(function(el){ - var wrapper = document.createElement('div'); - wrapper.className = 'table-area'; - el.parentNode.insertBefore(wrapper, el); - el.parentNode.removeChild(el); - wrapper.appendChild(el); - }); - }); -}); diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000..ef4a0df --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,108 @@ +site_name: TEO Developer Manual + +repo_name: roboticslab-uc3m/teo-developer-manual +repo_url: https://github.com/roboticslab-uc3m/teo-developer-manual +edit_uri: blob/master/docs/ + +theme: + name: material + language: en + logo: assets/roboticslab.png + favicon: assets/roboticslab.png + features: + - content.action.edit + - content.action.view + - navigation.expand + - navigation.footer + - navigation.indexes + - navigation.instant + - navigation.sections + - navigation.top + - navigation.tracking + - search.highlight + - search.suggest + icon: + repo: fontawesome/brands/github + palette: + # Palette toggle for dark mode + - media: "(prefers-color-scheme: dark)" + scheme: slate + primary: light-blue + accent: light-blue + toggle: + icon: material/brightness-4 + name: Switch to light mode + + # Palette toggle for light mode + - media: "(prefers-color-scheme: light)" + scheme: default + primary: light-blue + accent: light-blue + toggle: + icon: material/brightness-7 + name: Switch to dark mode + +extra: + social: + - icon: material/web + link: http://roboticslab.uc3m.es/ + - icon: fontawesome/brands/github + link: https://github.com/roboticslab-uc3m + - icon: fontawesome/brands/x-twitter + link: https://twitter.com/uc3mRoboticsLab + - icon: fontawesome/brands/youtube + link: https://twitter.com/RoboticsLabUC3M + +exclude_docs: | + README.md + docs/fig/editable/README.md + +nav: +- index.md +- introduction.md +- Cognitive architecture: architecture.md +- Software repositories: + - overview/README.md + - PC Software: overview/pc.md + - overview/firmware.md + - overview/demonstration.md + - overview/research.md + - overview/development.md +- Tutorial: + - tutorial/README.md + - Motor Control: tutorial/motor.md + - Trajectory Execution: tutorial/trajectories.md + - RGB-D Sensor: tutorial/rgbd.md + - Mesh From Real Depth: tutorial/mesh.md + - Scene Reconstruction: tutorial/kinfu.md + - Force/Torque Sensors: tutorial/ft.md +- diagrams.md +- tables.md +- dynamic-information.md +- switches-and-power.md +- connectors.md +- network-information.md +- driver-check-procedure.md +- demo-procedure.md +- additional-resources.md + +use_directory_urls: false + +markdown_extensions: + - attr_list # for mkdocs-pdf + - toc: + permalink: '#' + - pymdownx.superfences: + custom_fences: + - name: mermaid + class: mermaid + format: !!python/name:pymdownx.superfences.fence_code_format + +plugins: + - search + - open-in-new-tab + - git-revision-date-localized + - table-reader + - include-markdown + - mermaid2 + - mkdocs-pdf diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..5072908 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,9 @@ +mkdocs +mkdocs-material +mkdocs-material-extensions +mkdocs-open-in-new-tab +mkdocs-git-revision-date-localized-plugin +mkdocs-table-reader-plugin +mkdocs-include-markdown-plugin +mkdocs-mermaid2-plugin +pymdown-extensions diff --git a/styles/website.css b/styles/website.css deleted file mode 100644 index 610c7d5..0000000 --- a/styles/website.css +++ /dev/null @@ -1,52 +0,0 @@ -.page-toc { - float: none; -} - -.page-toc li:before { - content: "\00a0"; - margin-left: -24px; -} - -/* Enables horizontal scroll on tables (in conjunction with its JavaScript counterpart) */ -/* Thank you */ -/* Also see original by */ -table { - width: 100%; /*表格宽度*/ - max-width: 65em; /*表格最大宽度,避免表格过宽*/ - border: 1px solid #dedede; /*表格外边框设置*/ - margin: 15px auto; /*外边距*/ - border-collapse: collapse; /*使用单一线条的边框*/ - empty-cells: show; /*单元格无内容依旧绘制边框*/ -} -table th, -table td { - height: 35px; /*统一每一行的默认高度*/ - border: 1px solid #dedede; /*内部边框样式*/ - padding: 0 10px; /*内边距*/ -} - -table th { - font-weight: bold; /*加粗*/ - text-align: center !important; /*内容居中,加上 !important 避免被 Markdown 样式覆盖*/ - background: rgba(158,188,226,0.2); /*背景色*/ -} - -table tbody tr:nth-child(2n) { - background: rgba(158,188,226,0.12); -} - -table tr:hover { - background: #efefef; -} - -table th { - white-space: nowrap; /*表头内容强制在一行显示*/ -} - -table td:nth-child(1) { - white-space: nowrap; -} - -.table-area { - overflow: auto; -} diff --git a/tables.md b/tables.md deleted file mode 100644 index 35f4ef4..0000000 --- a/tables.md +++ /dev/null @@ -1,134 +0,0 @@ -# Tables - -## Joint Limits - -Can be found at [Motores: motores](#motores-motores) - -## DH Parameters - -### Group: head - -#### trunk for head (root to neck) - -- Github: [dh-root-head.csv](csv/dh-root-head.csv) -- Gitbook: {% includeCsv src="csv/dh-root-head.csv", useHeader="true" %}{% endincludeCsv %} - -#### head - -- Github: [dh-head.csv](csv/dh-head.csv) -- Gitbook: {% includeCsv src="csv/dh-head.csv", useHeader="true" %}{% endincludeCsv %} - -#### head additional transformations - -- Github: [dh-head-transformations.csv](csv/dh-head-transformations.csv) -- Gitbook: {% includeCsv src="csv/dh-head-transformations.csv", useHeader="true" %}{% endincludeCsv %} - -### Group: rightArm - -#### trunk for rightArm (root to rightArm) - -- Github: [dh-root-rightArm.csv](csv/dh-root-rightArm.csv) -- Gitbook: {% includeCsv src="csv/dh-root-rightArm.csv", useHeader="true" %}{% endincludeCsv %} - -#### rightArm - -- Github: [dh-rightArm.csv](csv/dh-rightArm.csv) -- Gitbook: {% includeCsv src="csv/dh-rightArm.csv", useHeader="true" %}{% endincludeCsv %} - -#### fetch (right) - -- Github: [dh-fetch.csv](csv/dh-fetch.csv) -- Gitbook: {% includeCsv src="csv/dh-fetch.csv", useHeader="true" %}{% endincludeCsv %} - -### Group: leftArm - -#### trunk for leftArm (root to leftArm) - -- Github: [dh-root-leftArm.csv](csv/dh-root-leftArm.csv) -- Gitbook: {% includeCsv src="csv/dh-root-leftArm.csv", useHeader="true" %}{% endincludeCsv %} - -#### leftArm - -- Github: [dh-leftArm.csv](csv/dh-leftArm.csv) -- Gitbook: {% includeCsv src="csv/dh-leftArm.csv", useHeader="true" %}{% endincludeCsv %} - -#### fetch (left) - -- Github: [dh-fetch.csv](csv/dh-fetch.csv) -- Gitbook: {% includeCsv src="csv/dh-fetch.csv", useHeader="true" %}{% endincludeCsv %} - -### Group: rightLeg - -#### root to rightLeg - -- Github: [dh-root-rightLeg.csv](csv/dh-root-rightLeg.csv) -- Gitbook: {% includeCsv src="csv/dh-root-rightLeg.csv", useHeader="true" %}{% endincludeCsv %} - -#### rightLeg - -- Github: [dh-rightLeg.csv](csv/dh-rightLeg.csv) -- Gitbook: {% includeCsv src="csv/dh-rightLeg.csv", useHeader="true" %}{% endincludeCsv %} - -### Group: leftLeg - -#### root to leftLeg - -- Github: [dh-root-leftLeg.csv](csv/dh-root-leftLeg.csv) -- Gitbook: {% includeCsv src="csv/dh-root-leftLeg.csv", useHeader="true" %}{% endincludeCsv %} - -#### leftLeg - -- Github: [dh-leftLeg.csv](csv/dh-leftLeg.csv) -- Gitbook: {% includeCsv src="csv/dh-leftLeg.csv", useHeader="true" %}{% endincludeCsv %} - -### Group: Deprecated transformations - -The below are not required at time of writing, and may become outdated with time. - -#### Deprecated trunk (root to hip) - -This is the original `trunk`, but the three variants (for `head`, `rightArm`, `leftArm`; respectively, above) seem to be more useful. - -- Github: [deprecated/dh-trunk.csv](csv/deprecated/dh-trunk.csv) -- Gitbook: {% includeCsv src="csv/deprecated/dh-trunk.csv", useHeader="true" %}{% endincludeCsv %} - -#### Deprecated additional transformations - -Some not required, redundant or may be derived from from existing `dh-root-*.csv` contents (above). - -- Github: [deprecated/dh-transformations.csv](csv/deprecated/dh-transformations.csv) -- Gitbook: {% includeCsv src="csv/deprecated/dh-transformations.csv", useHeader="true" %}{% endincludeCsv %} - -## Link Lengths - -- Github: [lengths.csv](csv/lengths.csv) -- Gitbook: {% includeCsv src="csv/lengths.csv", useHeader="true" %}{% endincludeCsv %} - -## Bill of materials (BOM) - -- Github: [bom.csv](csv/bom.csv) -- Gitbook: {% includeCsv src="csv/bom.csv", useHeader="true" %}{% endincludeCsv %} - -### Motores - -- Original with formulas: [editable/motores.ods](csv/editable/motores.ods) - -### Motores: motores - -- Github: [motores-motores.csv](csv/motores-motores.csv) -- Gitbook: {% includeCsv src="csv/motores-motores.csv", useHeader="true" %}{% endincludeCsv %} - -### Motores: protecciones-brazos - -- Github: [motores-protecciones-brazos.csv](csv/motores-protecciones-brazos.csv) -- Gitbook: {% includeCsv src="csv/motores-protecciones-brazos.csv", useHeader="true" %}{% endincludeCsv %} - -### Motores: protecciones-piernas - -- Github: [motores-protecciones-piernas.csv](csv/motores-protecciones-piernas.csv) -- Gitbook: {% includeCsv src="csv/motores-protecciones-piernas.csv", useHeader="true" %}{% endincludeCsv %} - -### Motores: transmision - -- Github: [motores-transmision.csv](csv/motores-transmision.csv) -- Gitbook: {% includeCsv src="csv/motores-transmision.csv", useHeader="true" %}{% endincludeCsv %}