diff --git a/config/shortcodes/og-image/index.js b/config/shortcodes/og-image/index.js new file mode 100644 index 00000000000..11719f51908 --- /dev/null +++ b/config/shortcodes/og-image/index.js @@ -0,0 +1,126 @@ +import fsExtra from 'fs-extra'; +import createImage from "node-html-to-image"; + + +export const getOGImage = async (...args) => { + + const OUTPUT_DIR = "./src/assets/images/og-images"; + + const templateOgImage = (titleImg, fontFamily) => { + return ` + + + + +
+

ROBONOMICS WIKI

+

${titleImg}

+
+ + + `; + } + + let title = args[1].title && args[1].title; + let locale = args[1].locale ? args[1].locale : 'default'; + let slug = args[1].slug ? args[1].slug : 'default-slug'; + + let fontFamily = 'defaultFont'; + + switch(locale) { + case 'ar': + fontFamily = 'arFont'; + break; + // case 'el': + // fontFamily = 'elFont'; + // break; + // case 'ko': + // fontFamily = 'koFont'; + // break; + // case 'zh': + // fontFamily = 'zgFont'; + // break; + default: + fontFamily = 'defaultFont'; + } + + const output = locale === 'en' ? `${OUTPUT_DIR}/docs-${slug}.png` : `${OUTPUT_DIR}/${locale}-docs-${slug}.png`; + // Only generate images for files that don't exist already + fsExtra.access(output, (error) => { + if (error) { + console.log("Generating Missing Cover Images"); + + createImage({ + output, + html: templateOgImage(title, 'Roboto'), + }).then(() => { + console.log('The image was created successfully!') + }) + .catch(e => console.log(e.message)); + } else { + console.log(`The image ${slug} already exists!`) + } + }); +} \ No newline at end of file diff --git a/eleventy.config.js b/eleventy.config.js index 32048dcb89b..168a0d5bc06 100644 --- a/eleventy.config.js +++ b/eleventy.config.js @@ -41,6 +41,8 @@ import {roboWikiTitle} from './config/shortcodes/robo-wiki-title/index.js'; import {roboWikiGridWrapper} from './config/shortcodes/robo-wiki-grid-wrapper/index.js'; import {roboWikiGrid} from './config/shortcodes/robo-wiki-grid/index.js'; +import {getOGImage} from './config/shortcodes/og-image/index.js'; + import { readableDate, htmlDateString, @@ -238,6 +240,7 @@ export default async function(eleventyConfig) { eleventyConfig.addPairedShortcode('roboWikiTitle', roboWikiTitle); eleventyConfig.addPairedShortcode('roboWikiGridWrapper', roboWikiGridWrapper); eleventyConfig.addPairedShortcode('roboWikiGrid', roboWikiGrid); + eleventyConfig.addPairedShortcode('getOGImage', getOGImage); // Add support for YAML data files with .yaml extension diff --git a/package-lock.json b/package-lock.json index 4e12ae26991..a57452dec25 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,7 @@ "chalk": "^4.1.2", "dotenv": "^16.4.5", "eleventy-plugin-metagen": "^1.8.3", + "fs-extra": "^10.1.0", "glob": "^11.0.0", "gpt-tokenizer": "^2.2.1", "markdown-it": "^14.0.0", @@ -26,6 +27,7 @@ "markdown-it-link-attributes": "^4.0.1", "markdown-it-mark": "^4.0.0", "markdown-it-prism": "^2.3.0", + "node-html-to-image": "3.2.4", "ping-ipfs-gateway": "^1.0.1", "svgo": "^3.3.2" }, @@ -403,27 +405,27 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", - "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", - "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.7.tgz", - "integrity": "sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.9.tgz", + "integrity": "sha512-aI3jjAAO1fh7vY/pBGsn1i9LDbRP43+asrRlkPuTXW5yHXtd1NgTEMudbBoDDxrf1daEEfPJqR+JBMakzrR4Dg==", "dependencies": { - "@babel/types": "^7.25.7" + "@babel/types": "^7.25.9" }, "bin": { "parser": "bin/babel-parser.js" @@ -433,22 +435,21 @@ } }, "node_modules/@babel/types": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", - "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.9.tgz", + "integrity": "sha512-OwS2CM5KocvQ/k7dFJa8i5bNGJP0hXWfVCfDkqRFP1IreH1JDC7wG6eCYCi0+McbfT8OR/kNqsI0UU0xP9H6PQ==", "dependencies": { - "@babel/helper-string-parser": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@dotenvx/dotenvx": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/@dotenvx/dotenvx/-/dotenvx-1.14.2.tgz", - "integrity": "sha512-88lviNO27WUGpZ/ya1VF7AseiWsCl1YRnm9pNYp7pIOZyu/gXM11wpJ8/DViV6oxSkrF4mi3ZalmaukHj5F8Ow==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/@dotenvx/dotenvx/-/dotenvx-1.20.0.tgz", + "integrity": "sha512-Zepr4dxvbTw1PKVa5i0HFP59wy1L6LXD+I9HcXnvugDevLOIA8mwwIH1ZqKDF6TrwRS4AHZy2lP9hKLBqib1EQ==", "dependencies": { "commander": "^11.1.0", "dotenv": "^16.4.5", @@ -468,6 +469,19 @@ "url": "https://dotenvx.com" } }, + "node_modules/@ecies/ciphers": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@ecies/ciphers/-/ciphers-0.2.0.tgz", + "integrity": "sha512-dqQk3HbyuXSdflgRMrXjEcCohKeBZQl2rm0lOcYnEC4Oue90irVMwVJ0GiM/nhjP0zzGimH8mVFF/pOzQcv+Lg==", + "engines": { + "bun": ">=1", + "deno": ">=2", + "node": ">=16" + }, + "peerDependencies": { + "@noble/ciphers": "^1.0.0" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", @@ -1079,15 +1093,33 @@ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" }, + "node_modules/@types/node": { + "version": "22.7.8", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.8.tgz", + "integrity": "sha512-a922jJy31vqR5sk+kAdIENJjHblqcZ4RmERviFsER4WJcEONqxKcjNOlk0q7OUfrF5sddT+vng070cdfMlrPLg==", + "optional": true, + "dependencies": { + "undici-types": "~6.19.2" + } + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/a-sync-waterfall": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==" }, "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.13.0.tgz", + "integrity": "sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==", "bin": { "acorn": "bin/acorn" }, @@ -1106,6 +1138,17 @@ "node": ">=0.4.0" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/ansi-regex": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", @@ -1335,6 +1378,25 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/bcp-47": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/bcp-47/-/bcp-47-2.1.0.tgz", @@ -1385,6 +1447,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -1410,9 +1482,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", - "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", "dev": true, "funding": [ { @@ -1429,10 +1501,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001663", - "electron-to-chromium": "^1.5.28", + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -1441,6 +1513,37 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "engines": { + "node": "*" + } + }, "node_modules/call-bind": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", @@ -1470,9 +1573,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001667", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001667.tgz", - "integrity": "sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw==", + "version": "1.0.30001669", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001669.tgz", + "integrity": "sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==", "dev": true, "funding": [ { @@ -1583,6 +1686,11 @@ "fsevents": "~2.3.2" } }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, "node_modules/clean-css": { "version": "5.3.3", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", @@ -1662,6 +1770,33 @@ "yarn": ">=1" } }, + "node_modules/cross-fetch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", + "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", + "dependencies": { + "node-fetch": "2.6.7" + } + }, + "node_modules/cross-fetch/node_modules/node-fetch": { + "version": "2.6.7", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", + "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -1675,6 +1810,11 @@ "node": ">= 8" } }, + "node_modules/cross-spawn/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, "node_modules/cross-spawn/node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -1913,6 +2053,11 @@ "node": ">= 0.8.0" } }, + "node_modules/devtools-protocol": { + "version": "0.0.981744", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.981744.tgz", + "integrity": "sha512-0cuGS8+jhR67Fy7qG3i3Pc7Aw494sb9yG9QgpG97SFVWwolgYjlhJg7n+UaHxOQT30d1TYu/EYe9k01ivLErIg==" + }, "node_modules/doctypes": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", @@ -1997,10 +2142,11 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, "node_modules/eciesjs": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.8.tgz", - "integrity": "sha512-U2wAn6yEOVBP9lOVh3nryufg3hQTKVicG+qjEfqB/70m/mU9DzwWNdK0mC5zuxlJH42EGAezFlHVWI0snwg1nw==", + "version": "0.4.9", + "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.9.tgz", + "integrity": "sha512-PYbXFMOKtzJMlQ+IXinjsM6p2jnQCf7/lyBKu8/ZqzJ/jyRrb+O/E64iv0ZApl/64oBDZEUIwyYp/2I3wHbAZQ==", "dependencies": { + "@ecies/ciphers": "^0.2.0", "@noble/ciphers": "^1.0.0", "@noble/curves": "^1.6.0", "@noble/hashes": "^1.5.0" @@ -2029,9 +2175,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.32", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.32.tgz", - "integrity": "sha512-M+7ph0VGBQqqpTT2YrabjNKSQ2fEl9PVx6AK3N558gDH9NO8O6XN9SXXFWRo9u9PbEg/bWq+tjXQr+eXmxubCw==", + "version": "1.5.42", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.42.tgz", + "integrity": "sha512-gIfKavKDw1mhvic9nbzA5lZw8QSHpdMwLwXc0cWidQz9B15pDoDdDH4boIatuFfeoCatb3a/NGL6CYRVFxGZ9g==", "dev": true }, "node_modules/eleventy-i18n": { @@ -2283,6 +2429,14 @@ "node": ">=6.0" } }, + "node_modules/eleventy-plugin-metagen/node_modules/linkify-it": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", + "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", + "dependencies": { + "uc.micro": "^1.0.1" + } + }, "node_modules/eleventy-plugin-metagen/node_modules/markdown-it": { "version": "13.0.2", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.2.tgz", @@ -2298,6 +2452,11 @@ "markdown-it": "bin/markdown-it.js" } }, + "node_modules/eleventy-plugin-metagen/node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" + }, "node_modules/eleventy-plugin-metagen/node_modules/minipass": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", @@ -2320,6 +2479,11 @@ "node": ">= 8" } }, + "node_modules/eleventy-plugin-metagen/node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" + }, "node_modules/eleventy-plugin-nesting-toc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/eleventy-plugin-nesting-toc/-/eleventy-plugin-nesting-toc-1.3.0.tgz", @@ -2341,6 +2505,11 @@ "string-replace-async": "^3.0.2" } }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", @@ -2362,6 +2531,14 @@ "url": "https://github.com/fb55/encoding-sniffer?sponsor=1" } }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/entities": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/entities/-/entities-5.0.0.tgz", @@ -2657,6 +2834,39 @@ "node": ">=0.10.0" } }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", @@ -2680,10 +2890,18 @@ "reusify": "^1.0.4" } }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dependencies": { + "pend": "~1.2.0" + } + }, "node_modules/fdir": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.0.tgz", - "integrity": "sha512-3oB133prH1o4j/L5lLW7uOCF1PlD+/It2L0eL/iAqWMB91RBbqTewABqxhj0ibBd90EEmWZq7ntIWzVaWcXTGQ==", + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz", + "integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==", "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -2762,6 +2980,18 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/flat-cache": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", @@ -2775,6 +3005,15 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/flat-cache/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/flat-cache/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -2795,6 +3034,17 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/flat-cache/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/flat-cache/node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -2870,9 +3120,9 @@ } }, "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -2904,6 +3154,24 @@ "node": ">= 0.6" } }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -3041,20 +3309,6 @@ "node": ">= 6" } }, - "node_modules/glob/node_modules/minimatch": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", - "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/globalthis": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", @@ -3083,9 +3337,9 @@ } }, "node_modules/gpt-tokenizer": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/gpt-tokenizer/-/gpt-tokenizer-2.4.0.tgz", - "integrity": "sha512-UmipHgPmzOVSj1Nu0bajJt7eZYnIttoaUSfgsXs77jFlpKGFBodM0fpa7989rl/pUEONKjye9WqAhlerHKux9Q==" + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/gpt-tokenizer/-/gpt-tokenizer-2.5.1.tgz", + "integrity": "sha512-26zNjvGrIf+a6yWg5l2DvNT4LXAmotHyx7IomHVhXiUs62BwKVFLv/l8yRQQrkUDc2XDtzCdjcNuJqzOjxxiPA==" }, "node_modules/graceful-fs": { "version": "4.2.11", @@ -3336,6 +3590,18 @@ "node": ">= 0.8" } }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -3356,6 +3622,25 @@ "node": ">=0.10.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -3749,9 +4034,12 @@ "dev": true }, "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", + "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", + "engines": { + "node": ">=16" + } }, "node_modules/iso-639-1": { "version": "3.1.3", @@ -3793,6 +4081,26 @@ "node": ">=10" } }, + "node_modules/jake/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/jake/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/js-stringify": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", @@ -3821,6 +4129,17 @@ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/jstransformer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz", @@ -3863,17 +4182,17 @@ } }, "node_modules/linkify-it": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", - "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", "dependencies": { - "uc.micro": "^1.0.1" + "uc.micro": "^2.0.0" } }, "node_modules/liquidjs": { - "version": "10.17.0", - "resolved": "https://registry.npmjs.org/liquidjs/-/liquidjs-10.17.0.tgz", - "integrity": "sha512-M4MC5/nencttIJHirl5jFTkl7Yu+grIDLn3Qgl7BPAD3BsbTCQknDxlG5VXWRwslWIjk8lSZZjVq9LioILDk1Q==", + "version": "10.18.0", + "resolved": "https://registry.npmjs.org/liquidjs/-/liquidjs-10.18.0.tgz", + "integrity": "sha512-gCJPmpmZ3oi2rMMHo/c+bW1LaRF+ZAKYTWQmKXPp0uK9EkWMFRmgbk3+Io4LSJGAOnpCZSgHJbNzcygx3kfAAQ==", "dependencies": { "commander": "^10.0.0" }, @@ -3932,6 +4251,17 @@ "node": ">=4" } }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/lodash.deburr": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-4.1.0.tgz", @@ -4027,28 +4357,10 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/markdown-it/node_modules/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", - "dependencies": { - "uc.micro": "^2.0.0" - } - }, - "node_modules/markdown-it/node_modules/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==" - }, - "node_modules/markdown-it/node_modules/uc.micro": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==" - }, - "node_modules/maximatch": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/maximatch/-/maximatch-0.1.0.tgz", - "integrity": "sha512-9ORVtDUFk4u/NFfo0vG/ND/z7UQCVZBL539YW0+U1I7H1BkZwizcPx5foFv7LCPcBnm2U6RjFnQOsIvN4/Vm2A==", + "node_modules/maximatch": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/maximatch/-/maximatch-0.1.0.tgz", + "integrity": "sha512-9ORVtDUFk4u/NFfo0vG/ND/z7UQCVZBL539YW0+U1I7H1BkZwizcPx5foFv7LCPcBnm2U6RjFnQOsIvN4/Vm2A==", "dependencies": { "array-differ": "^1.0.0", "array-union": "^1.0.1", @@ -4059,15 +4371,35 @@ "node": ">=0.10.0" } }, + "node_modules/maximatch/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/maximatch/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/mdn-data": { "version": "2.0.30", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==" }, "node_modules/mdurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", - "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==" }, "node_modules/memorystream": { "version": "0.3.1", @@ -4161,23 +4493,17 @@ } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz", + "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" - } - }, - "node_modules/minimatch/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/minimist": { @@ -4211,6 +4537,11 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, "node_modules/moo": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", @@ -4268,6 +4599,26 @@ "node": ">=8" } }, + "node_modules/multimatch/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/multimatch/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/mustache": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", @@ -4332,6 +4683,16 @@ } } }, + "node_modules/node-html-to-image": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/node-html-to-image/-/node-html-to-image-3.2.4.tgz", + "integrity": "sha512-5ittk3okJzYqGyctgIzCw20XeUGWe5ai4n0ngYd8NRLKvCrzEujX0zmwZYakxrgCZLMgPfOg3w/3XxUwPVSDlw==", + "dependencies": { + "handlebars": "^4.5.3", + "puppeteer": "^13.1.1", + "puppeteer-cluster": "^0.23.0" + } + }, "node_modules/node-releases": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", @@ -4424,6 +4785,16 @@ "node": ">=4" } }, + "node_modules/npm-run-all/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/npm-run-all/node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -4487,6 +4858,24 @@ "node": ">=4" } }, + "node_modules/npm-run-all/node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/npm-run-all/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/npm-run-all/node_modules/path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", @@ -4714,6 +5103,31 @@ "node": ">=4" } }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/p-queue": { "version": "6.6.2", "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz", @@ -4740,6 +5154,14 @@ "node": ">=8" } }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, "node_modules/package-json-from-dist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", @@ -4789,23 +5211,23 @@ "integrity": "sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==" }, "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.0.tgz", + "integrity": "sha512-ZkDsAOcxsUMZ4Lz5fVciOehNcJ+Gb8gTzcA4yl3wnc273BAybYWrQ+Ks/OjCjSEpjvQkDSeZbybK9qj2VHHdGA==", "dependencies": { - "entities": "^4.4.0" + "entities": "^4.5.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" } }, "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", - "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", "dev": true, "dependencies": { - "domhandler": "^5.0.2", + "domhandler": "^5.0.3", "parse5": "^7.0.0" }, "funding": { @@ -4843,6 +5265,14 @@ "node": ">= 0.8" } }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -4905,10 +5335,15 @@ "node": ">=4" } }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" + }, "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "node_modules/picomatch": { "version": "4.0.2", @@ -4946,6 +5381,17 @@ "resolved": "https://registry.npmjs.org/ping-ipfs-gateway/-/ping-ipfs-gateway-1.0.1.tgz", "integrity": "sha512-VxAwN+Dv1tvSp5L7C4j+BYvJqrmDxzFZ9yAvQbxsFWlHwmKUFJ1N11qrifAnpJCuAzCtjOrWW8H7i3ZbmKqJ7g==" }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/please-upgrade-node": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", @@ -5213,6 +5659,14 @@ "node": ">=6" } }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", @@ -5351,6 +5805,15 @@ "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-2.0.0.tgz", "integrity": "sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==" }, + "node_modules/pump": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", + "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode.js": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", @@ -5359,6 +5822,137 @@ "node": ">=6" } }, + "node_modules/puppeteer": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-13.7.0.tgz", + "integrity": "sha512-U1uufzBjz3+PkpCxFrWzh4OrMIdIb2ztzCu0YEPfRHjHswcSwHZswnK+WdsOQJsRV8WeTg3jLhJR4D867+fjsA==", + "deprecated": "< 22.8.2 is no longer supported", + "hasInstallScript": true, + "dependencies": { + "cross-fetch": "3.1.5", + "debug": "4.3.4", + "devtools-protocol": "0.0.981744", + "extract-zip": "2.0.1", + "https-proxy-agent": "5.0.1", + "pkg-dir": "4.2.0", + "progress": "2.0.3", + "proxy-from-env": "1.1.0", + "rimraf": "3.0.2", + "tar-fs": "2.1.1", + "unbzip2-stream": "1.4.3", + "ws": "8.5.0" + }, + "engines": { + "node": ">=10.18.1" + } + }, + "node_modules/puppeteer-cluster": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/puppeteer-cluster/-/puppeteer-cluster-0.23.0.tgz", + "integrity": "sha512-108terIWDzPrQopmoYSPd5yDoy3FGJ2dNnoGMkGYPs6xtkdhgaECwpfZkzaRToMQPZibUOz0/dSSGgPEdXEhkQ==", + "dependencies": { + "debug": "^4.3.3" + }, + "peerDependencies": { + "puppeteer": ">=1.5.0" + } + }, + "node_modules/puppeteer/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/puppeteer/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/puppeteer/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/puppeteer/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/puppeteer/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/puppeteer/node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/puppeteer/node_modules/ws": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", + "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -5410,6 +6004,19 @@ "node": ">=4" } }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -5448,6 +6055,15 @@ "slash": "^1.0.0" } }, + "node_modules/recursive-copy/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/recursive-copy/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -5468,6 +6084,17 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/recursive-copy/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/recursive-copy/node_modules/mkdirp": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", @@ -5670,6 +6297,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/safe-regex-test": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz", @@ -5722,15 +6368,15 @@ "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==" }, "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.1.tgz", + "integrity": "sha512-p4rRk4f23ynFEfcD9LA0xRYngj+IyGiEYyqqOak8kaN0TvNmuxC2dcVeBn62GpCeR2CpWqyHCNScTP91QbAVFg==", "dev": true, "dependencies": { "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", @@ -5760,15 +6406,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/send/node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -5958,6 +6595,14 @@ "node": ">= 0.8" } }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/string-replace-async": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/string-replace-async/-/string-replace-async-3.0.2.tgz", @@ -5992,6 +6637,9 @@ "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, "node_modules/string-width-cjs/node_modules/ansi-regex": { @@ -6018,11 +6666,6 @@ "node": ">=8" } }, - "node_modules/string-width/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" - }, "node_modules/string.prototype.padend": { "version": "3.1.6", "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz", @@ -6111,6 +6754,9 @@ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dependencies": { "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { @@ -6200,14 +6846,37 @@ "node": ">= 10" } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, "engines": { - "node": ">=4" + "node": ">=6" } }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -6312,9 +6981,9 @@ } }, "node_modules/uc.micro": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", - "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==" }, "node_modules/uglify-js": { "version": "3.19.3", @@ -6343,15 +7012,38 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, "node_modules/undici": { - "version": "6.19.8", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.19.8.tgz", - "integrity": "sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==", + "version": "6.20.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.20.1.tgz", + "integrity": "sha512-AjQF1QsmqfJys+LXfGTNum+qw4S88CojRInG/6t31W/1fk6G59s92bnAvGz5Cmur+kQv2SURXEvvudLmbrE8QA==", "dev": true, "engines": { "node": ">=18.17" } }, + "node_modules/undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", + "optional": true + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -6402,6 +7094,11 @@ "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", "dev": true }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -6504,14 +7201,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "engines": { - "node": ">=16" - } - }, "node_modules/with": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz", @@ -6556,6 +7245,12 @@ "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { @@ -6635,6 +7330,15 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } } } } diff --git a/package.json b/package.json index e2be59d27ad..eb7bb320f44 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,7 @@ "clean": "rimraf dist", "debug": "cross-env DEBUG=Eleventy* npx @11ty/eleventy", "dev:11ty": "cross-env ELEVENTY_ENV=development eleventy --serve --watch --incremental", - "build:11ty": "cross-env ELEVENTY_ENV=production eleventy", - "build-image": "cross-env ELEVENTY_ENV=image eleventy --watch", + "build:11ty": "cross-env ELEVENTY_ENV=production eleventy --serve --watch --incremental", "translate-md": "node translations/prompt-md.js", "translate": "node translations/prompt.js", "start": "run-p dev:*", @@ -57,6 +56,7 @@ "chalk": "^4.1.2", "dotenv": "^16.4.5", "eleventy-plugin-metagen": "^1.8.3", + "fs-extra": "^10.1.0", "glob": "^11.0.0", "gpt-tokenizer": "^2.2.1", "markdown-it": "^14.0.0", @@ -65,6 +65,7 @@ "markdown-it-link-attributes": "^4.0.1", "markdown-it-mark": "^4.0.0", "markdown-it-prism": "^2.3.0", + "node-html-to-image": "3.2.4", "ping-ipfs-gateway": "^1.0.1", "svgo": "^3.3.2" } diff --git a/src/_layouts/page-doc.njk b/src/_layouts/page-doc.njk index 3e1fba6a5b6..6f700f899a9 100644 --- a/src/_layouts/page-doc.njk +++ b/src/_layouts/page-doc.njk @@ -8,6 +8,12 @@ {% include 'sidebar.njk' %} +
+ {% if title %} + {% getOGImage {title: title, locale: page.lang, slug: page.fileSlug} %}{% endgetOGImage%} + {% endif %} +
+
{% if page.url %} {% include '../_includes/components/doc/breadcrumbs.njk' %} diff --git a/src/ar/docs/ros2-about-wrapper.md b/src/ar/docs/ros2-about-wrapper.md new file mode 100644 index 00000000000..d3b4065e6e8 --- /dev/null +++ b/src/ar/docs/ros2-about-wrapper.md @@ -0,0 +1,78 @@ +--- +title: حول Robonomics ROS 2 Wrapper +contributors: [Fingerling42] +tools: + - أوبونتو 22.04.4 + https://releases.ubuntu.com/jammy/ + - ROS 2 Humble + https://docs.ros.org/en/humble/Installation.html + - IPFS Kubo 0.26.0 + https://docs.ipfs.tech/install/command-line/ + - Python 3.10.12 + https://www.python.org/downloads/ +--- + +**في هذه المقالة، ستتعرف على حزمة Robonomics ROS 2 Wrapper، التي تتيح لك استخدام جميع ميزات سلسلة الكتل Robonomics لأي روبوت متوافق مع ROS 2.** + +فكرة الحزمة هي لف الواجهة البرمجية لسلسلة الكتل Robonomics المقدمة من خلال [robonomics-interface](https://github.com/airalab/robonomics-interface) في عقدات ROS 2. الهدف هو توفير وسيلة ملائمة لمطوري ROS 2 لدمج روبوتاتهم أو أجهزتهم مع ميزات السلسلة الفرعية. المنطق وراء دمج جهاز روبوتي هو إنشاء عنوان فريد له في سلسلة الكتل Robonomics، الذي يُستخدم للتحكم في الجهاز أو استقبال بيانات الاستشعار الخاصة به. + +تتضمن الميزات المتاحة: + +* **وظيفة الإطلاق** — تشغيل جهاز لتنفيذ أي أمر مع مجموعة محددة من المعلمات الممررة كسلسلة نصية أو ملف. +* **وظيفة تسجيل البيانات** — نشر بيانات الجهازتلميتري بشكل تجريدي إلى باراشين. +* **استخدام اشتراك Robonomics** — القدرة على إرسال المعاملات دون رسوم. +* **تخزين الملفات الآمن** — لتعبئة وفك تشفير البيانات، يتم استخدام [نظام ملفات الإنتربلانتاري](https://ipfs.tech/)، الذي يسمح بالوصول إلى الملفات من خلال تعريفها الفريد. لتسهيل استخدام IPFS، تم تضمين دعم [Pinata](https://www.pinata.cloud/)، الذي يسمح بتثبيت ملفات IPFS للتنزيل السريع. +* **تشفير وفك تشفير الملفات** — حماية الملفات بتشفير المفتاح العام. + +حاليًا، يتوفر الغلاف في [تنفيذ Python](https://github.com/airalab/robonomics-ros2/). + +## هندسة الغلاف + +من الناحية المعمارية، يتكون الغلاف من عقد عامل (مع المواضيع والخدمات اللازمة) وفئة عقد أساسية يمكن استخدامها لروبوتاتك الخاصة. + +{% roboWikiPicture {src:"docs/robotics/robonomics-ros2-wrapper.png", alt:"هندسة غلاف ROS 2"} %}{% endroboWikiPicture %} + +* `robonomics_ros2_pubsub` — عقد فريد لكل روبوت يعمل كنقطة دخول إلى Web3. يلف الخدمات لإرسال سجلات البيانات واستقبال الإطلاقات عبر Robonomics ويسمح بتنزيل/رفع الملفات إلى IPFS. يتم تكوين هذا العقد بواسطة ملف خاص، الذي يتم وصفه أدناه. يمكن أن يكون تعلق العقد بروبوت معينمحددة عبر مساحة الاسم ROS. +* `robonomics_ros2_robot_handler` — عقدة محددة للروبوت تعتمد على فئة أساسية `basic_robonomics_handler` لتنسيق النشر والاشتراك والروبوت. يقوم بمعالجة الإطلاقات ويقرر متى يجب إرسال سجلات البيانات للتحكم في الروبوت. + +## تثبيت الحزمة + +للعمل مع الحزمة، تحتاج إلى البرامج التالية: + +* توزيع نظام تشغيل Linux (عادةً ما يكون Ubuntu) +* توزيع ROS 2 +* عقدة IPFS +* Python 3 (لتنفيذ Python للحزمة) + +يرجى اتباع دليل التثبيت المتاح [هنا](https://github.com/airalab/robonomics-ros2/?tab=readme-ov-file#getting-started) والتحقق من الإصدارات المطلوبة للبرنامج. بعد تنزيل المكونات المطلوبة، ستحتاج [إلى بناء](https://github.com/airalab/robonomics-ros2/?tab=readme-ov-file#installation-and-building) الحزمة كحزمة ROS 2 عادية باستخدام أداة `colcon`. + +## تكوين الاتصالات مع سحابة Web3 + +قبل بدء الحزمة، تحتاج إلى إعداد كيف سيتصل الروبوت الخاص بك بسحابة Robonomics اللامركزية وخدمات Web3 الداعمة. للقيام بذلك، تحتاج إلى تحرير ملف يسمى ملف تكوين يسمى `robonomics_pubsub_params_template.yaml`، والذي يجب أن يكون فريدًا لكل روبوت يتم تشغيله ويحتاج إلى الوصول إلى Robonomics. + +يحتوي الملف على الحقول التكوينية التالية: + +| الحقل | الوصف | +|-----------------------|------------------------------------------------------------------------------------------------------------| +| account_seed | بذرة الحساب لشبكة Robonomics الفرعية | +| crypto_type | نوع حسابك، `ED25519` أو `SR25519` | +| remote_node_url | عنوان العقدة الخارجية لـ Robonomics، الافتراضي هو `wss://kusama.rpc.robonomics.network`، للعقدة المحلية `ws://127.0.0.1:9944`| +| rws_owner_address | عنوان مالك اشتراك Robonomics لاستخدام وحدة RWS | +| ipfs_dir_path | مسار الدليل الذي يحتوي على ملفات IPFS | +| ipfs_gateway | بوابة IPFS لتنزيل الملفات، على سبيل المثال `https://ipfs.io` | +| pinata_api_key | مفتاح API من [Pinata](https://www.pinata.cloud/) لخدمة تعليق الملفات على IPFS | +| pinata_api_secret_key | مفتاح API سري من [Pinata](https://www.pinata.cloud/) لخدمة تعليق الملفات على IPFS | + +لإنشاء حساب على شبكة Robonomics الفرعية، يرجى استخدام [الدليل التالي](https://wiki.robonomics.network/docs/create-account-in-dapp/) على ويكيبيديا الخاصة بنا. يرجى إيلاء اهتمام خاص لنوع الحساب الذي تقوم بإنشائه، حيث أن الحسابات ذات النوع SR25519 لا يمكنها استخدام تشفير الملفات. + +{% roboWikiNote {type: "warning", title: "تحذير"}%} + + عبارة البذرة هي معلومات حساسة تسمح لأي شخص باستخدم حسابك. تأكد من عدم رفع ملف تكوين معه إلى GitHub أو أي مكان آخر. + +{% endroboWikiNote %} + +Pay attention to the `remote_node_url` field, as it allows you to choose how exactly to connect to the Robonomics parachain, including locally. You can deploy your local Robonomics instance for testing and development. Instructions on how to do this are available in [this article](https://wiki.robonomics.network/docs/run-dev-node/) on our wiki. + +If you have a Robonomics subscription that allows you to send transactions without fees, please insert the address of the subscription owner to the `rws_owner_address` field. Don't forget that your account must be added to your subscription. Instructions on how to activate your Robonomics subscription are available in two guides: via [Robonomics dapp](https://wiki.robonomics.network/docs/sub-activate/) with user-friendly interface or via [Robonomics Substrate portal](https://wiki.robonomics.network/docs/get-subscription/). + +The `ipfs_gateway` parameter allows you to specify the gateway through which IPFS files will be downloaded. These can be either [public gateways](https://ipfs.github.io/public-gateway-checker/) or specialized private ones (for example, those obtained on Pinata) \ No newline at end of file diff --git a/src/ar/docs/ros2-launch-robot-cloud.md b/src/ar/docs/ros2-launch-robot-cloud.md new file mode 100644 index 00000000000..be953786dda --- /dev/null +++ b/src/ar/docs/ros2-launch-robot-cloud.md @@ -0,0 +1,243 @@ +--- +title: إطلاق روبوت من السحابة +contributors: [Fingerling42] +tools: + - Robonomics ROS 2 Wrapper 3.1.0 + https://github.com/airalab/robonomics-ros2/releases +--- + +**في هذا المقال، ستتعلم كيفية استخدام وظيفة الإطلاق في Robonomics في ROS 2 من خلال أمثلة متنوعة** + +الميزة الرئيسية لسلسلة الكتل Robonomics لإرسال الأوامر إلى الأجهزة هي الوظيفة الخارجية للإطلاق. تسمح هذه الوظيفة لك بإرسال سلسلة تحتوي على معلمة (بشكل قيمة سداسية عشرية طويلة بطول 32 بايت) إلى عنوان محدد ضمن سلسلة الكتل. عادةً، تمثل السلسلة تجزء IPFS يشير إلى ملف يحتوي على المعلمات اللازمة لتنفيذ الأمر. يمكنك العثور على مزيد من التفاصيل حول وظيفة الإطلاق [في هذا المقال](https://wiki.robonomics.network/docs/launch/). + +في Robonomics ROS 2 Wrapper، تم تنفيذ وظيفة الإطلاق كخدمة لإرسال الأوامر وكموضوع لاستقبال الأوامر. + +## إرسال الإطلاق + +الخدمة، تسمى `robonomics/send_launch`، تبدو كما يلي: + +{% codeHelper { additionalLine: "RobonomicsROS2SendLaunch.srv"}%} + +```YAML +string param # سلسلة المعلمة أو اسم الملف الذي تحتوي على المعلمات التي يجب تحميلها إلى IPFS +string target_address # العنوان الذي سيتم تنشيطه بالإطلاق +bool is_file True # هل هو معلمة إطلاقيحتاج ملف يجب رفعه إلى IPFS (الافتراضي هو صحيح)؟ +bool encrypt_status True # تحقق مما إذا كان يجب تشفير ملف المعلمة بالعنوان المستهدف، الافتراضي هو صحيح +--- +string launch_hash # هاش لصفقة الإطلاق +``` + +{% endcodeHelper %} + +يقبل الخدمة المعلمات التالية كجزء من الطلب: معلمة الأمر (إما سلسلة بسيطة أو اسم ملف يحتوي على معلمات الأمر)، العنوان المستهدف في شبكة Robonomics parachain لإرسال الإطلاق، وعلمين: أحدهما يشير إلى ما إذا كانت المعلمة ملفًا، والآخر يحدد ما إذا كان يجب تشفير الملف (كلاهما مضبوطان على صحيح افتراضيًا). سيتم رفع الملف إلى IPFS، وسيتم تمرير هاشه كمعلمة إطلاق. لذا، يجب وضع الملف في الدليل المخصص لملفات IPFS، كما هو محدد في ملف التكوين لعقدة `robonomics_ros2_pubsub`. + +افتراضيًا، يتم تشفير الملف باستخدام العنوان العام لمستلم الإطلاق. الطريقة المستخدمة للتشفير هي التشفير العام بناءً على تشفير المنحنى البيضاوي Curve25519. في التنفيذ الحالي، يتم دعم التشفير فقط لعناوين الحساب من نوع ED25519 (Edwards) (يمكنك قراءة المزيد حول هذا في [هذه المقالة](http://localhost:8080/docs/create-account-in-dapp/#22-create-account)). + +بعد إرسال الإطلاق، تُرجع الخدمة هاش الصفقة. + +## استقبال الإطلاق + +استقباليتم تنظيم الإطلاقات في شكل موضوع مقابل. من الناحية التقنية، يستخدم العقد وظيفة robonomics-interface للاشتراك في حالة عنوانه الخاص وينتظر ظهور حدث `NewLaunch`. بمجرد حدوث الحدث، يقوم العقد بنشر رسالة إلى موضوع `robonomics/received_launch`. تتبع الرسالة الصيغة التالية: + +{% codeHelper { additionalLine: "RobonomicsROS2ReceivedLaunch.msg"}%} + +```YAML +string launch_sender_address # عنوان الحساب الذي أرسل أمر الإطلاق +string param # سلسلة نصية تحتوي على المعلمة أو اسم الملف الذي يحتوي على المعلمات +``` + +{% endcodeHelper %} + +تحتوي حقول الرسالة على العنوان الذي تم منه إرسال الإطلاق والمعلمة نفسها: إما سلسلة بسيطة أو اسم الملف الذي يحتوي على المعلمات التي تم تنزيلها من IPFS ووضعها في دليل العمل IPFS. إذا كان الملف مشفرًا، يتم فك تشفيره خلال هذه العملية. + + +## مثال مع Turtlesim + +بعد ذلك، سنقدم كيفية استخدام وظيفة الإطلاق مع [Turtlesim](https://docs.ros.org/en/humble/Tutorials/Beginner-CLI-Tools/Introducing-Turtlesim/Introducing-Turtlesim.html) كمثال. Turtlesim هو محاكي خفيف مصمم لتعلم ROS 2. يمكنك تثبيته باستخدام الأمر التالي: + +{% codeHelper { copy: true}%} + +```shell +sudo apt install ros-$ROS_DISTRO-turtlesim +``` + +{% endcodeHelper %} + +يتضمن حزمة Robonomics ROS 2 Wrapper حزمة مُعدة مُسبقًا تسمى `turtlesim_robonomics`، مُكيفة خصيصًا لـ Turtlesim. تُتيح لك هذه الحزمة اختبار جميع ميزات الواجهة. دعنا نجرب تشغيلها. + +{% roboWikiNote {type: "warning", title: "تحذير"}%} + + يُرجى التأكد من وجود رصيد كافٍ في حسابك أو اشتراك نشط لأداء المعاملات. + +{% endroboWikiNote %} + +1. للبدء، قم بإنشاء ملف تكوين لنسخة pubsub من `turtlesim_robonomics` باستخدام القالب `config/robonomics_pubsub_params_template.yaml`. قم بملء الحقول المناسبة ببيانات اعتماد Robonomics الخاصة بك (بذرة الحساب، نوع العملة المشفرة، عنوان مالك الاشتراك). كما يجب تحديد دليل لملفات IPFS. بمجرد الانتهاء، قم بإعادة تسمية الملف، على سبيل المثال، `first_pubsub_params.yaml`. + +2. قم بتشغيل IPFS Daemon: + +{% codeHelper { copy: true}%} + +```shell +ipfs daemon +``` + +{% endcodeHelper %} + +3. قم بتشغيل ملف ROS 2 launch التالي. سيبدأ جميع العقد اللازمة: Turtlesim نفسه، تنفيذ الواجهة لـ Turtlesim، و Robonomics pubsub: + +{% codeHelper { copy: true}%} + +```shell +ros2 launch turtlesim_robonomics turtlesim_robonomics_launch.py pubsub_params_path:=./first_pubsub_params```.yaml النطاق:='turtlesim1' +``` + +{% endcodeHelper %} + +سترى المحاكي مع السلحفاة، جنبًا إلى جنب مع سجلات ROS 2 في وحدة التحكم تعرض معرف IPFS، والمسار إلى الدليل الذي يحتوي على ملفات IPFS، وعنوان Robonomics، ومعلومات أخرى ذات صلة. + +### تشغيل Turtlesim من بوابة Polkadot + +1. يتم التحكم في Turtlesim عبر موضوع `/cmd_vel`، لذا تحتاج إلى تحضير الرسائل المقابلة وتضمينها في ملف، الذي سيتم استخدامه كمعلمة تشغيل. للراحة، تم تحضير هذه الرسائل في ملف JSON. أنشئ ملفًا (على سبيل المثال، `turtle_cmd_vel.json`) والصق ما يلي: + + {% codeHelper { copy: true}%} + + ```json + [ + { + "linear": { + "x": 5.0, + "y": 0.0, + "z": 0.0 + }, + "angular": { + "x": 0.0, + "y": 0.0, + "z": 1.5 + } + }, + { + "linear": { + "x": 2.0, + "y": 0.0, + "z": 0.0 + }, + "angular": { + "x": 0.0, + "y": 0.0, + "z": 2.5 + } +``` } + ] + ``` + + {% endcodeHelper %} + + هذا المثال JSON سيأمر السلحفاة بالتحرك مرتين. + +2. بعد ذلك، يجب رفع الملف إلى IPFS. يمكنك اختيار أي طريقة، ولكن لهذا المثال، سنستخدم IPFS Kubo. افتح نافذة الأوامر في الدليل الذي يحتوي على ملف JSON وقم برفعه إلى IPFS: + +{% codeHelper { copy: true}%} + +```shell +ipfs add turtle_cmd_vel.json +``` + +{% endcodeHelper %} + + ستتلقى تجزئة IPFS للملف. تأكد من حفظها للاستخدام لاحقًا. + +3. قبل إرسال الإطلاق، يجب تحويل تجزئة IPFS إلى سلسلة تتألف من 32 بايتًا. يمكن القيام بذلك باستخدام بعض الأوامر في Python. افتح نافذة الأوامر، قم بتشغيل مترجم Python 3، وقم بتشغيل الأوامر التالية: + +{% codeHelper { copy: true}%} + +```python +from robonomicsinterface.utils import ipfs_qm_hash_to_32_bytes +ipfs_qm_hash_to_32_bytes('IPFS_FILE_HASH') +``` + +{% endcodeHelper %} + + احفظ السلسلة الناتجة للاستخدام لاحقًا. + +4. افتح بوابة Robonomics [Polkadot/Substrate portal](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fkusama.rpc.robonomics.network%2F#/extrinsics) وانتقلانتقل إلى علامة **المطورين** -> **الخارجيات**. حدد الخارجية `launch` -> `launch(robot, param)`. في حقل `robot`، ضع عنوان الروبوت الخاص بك، وفي حقل `param`، ضع السلسلة التي تحتوي على تحويل هاش IPFS. قم بإرسال المعاملة. + +5. انتقل إلى محاكي Turtlesim. بعد إرسال المعاملة بنجاح، يجب أن يبدأ السلحفاة في التحرك. + +### تشغيل Turtlesim من أدوات سطر الأوامر ROS 2 + +1. الآن دعنا نحاول إرسال إطلاق لـ Turtlesim من عقدة ROS 2 pubsub أخرى. أولاً، قم بإنشاء ملف تكوين آخر (على سبيل المثال، `second_pubsub_params.yaml`) ببيانات اعتماد Robonomics مختلفة ودليل IPFS منفصل. + +2. في نافذة الطرفية الفرعية، قم بتشغيل عقدة `robonomics_ros2_pubsub` جديدة باستخدام ملف التكوين الجديد: + +{% codeHelper { copy: true}%} + +```shell +ros2 run robonomics_ros2_pubsub robonomics_ros2_pubsub --ros-args -r __ns:=/test -p pubsub_params_path:=./second_pubsub_params.yaml +``` + +{% endcodeHelper %} + +3. ضع ملف JSON الذي يحتوي على الأوامر لـ Turtlesim (`turtle_cmd_vel.json`) في دليل IPFS للنشر الجديد. + +4. قبل إرسال الإطلاق، دعنا نقوم بإعداد الرصد لمراقبة كيفية استقبال `turtlesim_robonomics`.البيانات عند الوصول. للقيام بذلك، في نافذة الطرفية المستقلة، اشترك في الموضوع المقابل: + +{% codeHelper { copy: true}%} + + ```shell + ros2 topic echo /turtlesim1/robonomics/received_launch + ``` + +{% endcodeHelper %} + +{% roboWikiNote {type: "warning", title: "Launch Param as String"}%} +يتوجب بشكل افتراضي على معالج الإطلاق توقع تجزئة IPFS لملف كمعلمة. إذا كنت بحاجة إلى أن يتعامل النشر والاشتراك مع المعلمة كسلسلة نصية عادية، يجب عليك تغيير معلمة العقدة ROS 2 المقابلة `launch_is_ipfs` من `True` إلى `False`. يمكنك القيام بذلك باستخدام الأمر `ros2 param set`. +{% endroboWikiNote %} + +الآن، نحتاج إلى استدعاء خدمة.5 ROS 2 لإرسال الإطلاق. في نافذة الطرفية المستقلة، استخدم الأمر التالي: + +{% codeHelper { copy: true}%} + +```shell +ros2 service call /test/robonomics/send_launch robonomics_ros2_interfaces/srv/RobonomicsROS2SendLaunch {"param: 'turtle_cmd_vel.json', target_address: 'YOUR_TURTLESIM_ADDRESS'"} +``` + +{% endcodeHelper %} + +سترى سجلات النشر والاشتراك تعرض تفاصيل تقديم الإطلاق. + +انتقل إلى محاكي.6 Turtlesim. بعد إرسال المعاملة بنجاح، يجب أن تبدأ السلحفاة. + +### تشغيل Turtlesim من خلال عقدة أخرى + +1. الآن، دعنا نحاول إنشاء عقدة اختبارية ستنتظر وصول الإطلاق ثم تقوم بإعادته إلى Turtlesim. يمكنك استخدام حزمة الاختبار الجاهزة `test_robot_robonomics`. انسخ هذه الحزمة إلى مساحة العمل الخاصة بك في ROS 2. + +2. افتح ملف العقدة الموجود في `test_robot_robonomics/test_robot_robonomics/test_robot_robonomics_node.py` في أي محرر نصوص، وأضف الكود التالي بعد دالة `__init__`: + + {% codeHelper { copy: true}%} + + ```python + def launch_file_subscriber_callback(self, msg) -> None: + super().launch_file_subscriber_callback(msg) + + transaction_hash = self.send_launch_request(self.param, target_address='YOUR_TURTLESIM_ADDRESS', is_file=True, encrypt_status=True) + + self.get_logger().info('Sent launch to the turtle with hash: %s ' % str(transaction_hash)) + ``` + +{% endcodeHelper %} + + هذه الدالة ستقوم أولاً بمعالجة الإطلاق الذي تم استلامه ثم ستستخدم معلمته لإرسال إطلاق جديد إلى Turtlesim. + +3. قم ببناء الحزمة باستخدام `colcon`، ثم قم بتفعيل ملفات الإعداد الخاصة بها. + +4. قم بتشغيل ملف إطلاق ROS 2 للحزمة الاختبارية باستخدام بيانات اعتماد pubsub الثانية: + +{% codeHelper { copy: true}%} + + ```shell + ros2 launch test_robot_robonomics test_robot_robonomics_launch.py pubsub_params_path:=./second_pubsub_params.yaml namespace:='test' + ``` + +{% endcodeHelper %} + +5. الآن، قم بإرسال إطلاق بمعلمات `turtle_cmd_vel.json` إلى عنوان العقدة الاختبارية، على سبيل المثال، عبر بوابة Polkadot/Substrate. قبل القيام بذلك، تأكد من أن Turtlesim ما زالت تعمل. يجب أن تتلقى العقدة الاختبارية الإطلاق ثم ترسل واحدة جديدة بنفس المعلمات، مما يجعل السلحفاة في Turtlesim تبدأ في التحرك. diff --git a/src/assets/css/components/code.css b/src/assets/css/components/code.css index 044cd53bce0..e7c44c26edc 100644 --- a/src/assets/css/components/code.css +++ b/src/assets/css/components/code.css @@ -82,6 +82,10 @@ pre{ color: #e2777a; } +.code-helper { + margin: calc(var(--space)* 0.6) 0; +} + .code__additionalLine { position: relative; width: 100%; diff --git a/src/assets/images/og-images/ar-docs-ros2-about-wrapper.png b/src/assets/images/og-images/ar-docs-ros2-about-wrapper.png new file mode 100644 index 00000000000..a61bdebcded Binary files /dev/null and b/src/assets/images/og-images/ar-docs-ros2-about-wrapper.png differ diff --git a/src/assets/images/og-images/ar-docs-ros2-launch-robot-cloud.png b/src/assets/images/og-images/ar-docs-ros2-launch-robot-cloud.png new file mode 100644 index 00000000000..982b6152b8c Binary files /dev/null and b/src/assets/images/og-images/ar-docs-ros2-launch-robot-cloud.png differ diff --git a/src/assets/images/og-images/de-docs-ros2-about-wrapper.png b/src/assets/images/og-images/de-docs-ros2-about-wrapper.png new file mode 100644 index 00000000000..001cf1f1c91 Binary files /dev/null and b/src/assets/images/og-images/de-docs-ros2-about-wrapper.png differ diff --git a/src/assets/images/og-images/de-docs-ros2-launch-robot-cloud.png b/src/assets/images/og-images/de-docs-ros2-launch-robot-cloud.png new file mode 100644 index 00000000000..00aad8a90a0 Binary files /dev/null and b/src/assets/images/og-images/de-docs-ros2-launch-robot-cloud.png differ diff --git a/src/assets/images/og-images/docs-docs.11tydata.png b/src/assets/images/og-images/docs-docs.11tydata.png new file mode 100644 index 00000000000..049760ff7e6 Binary files /dev/null and b/src/assets/images/og-images/docs-docs.11tydata.png differ diff --git a/src/assets/images/og-images/docs-ros2-about-wrapper.png b/src/assets/images/og-images/docs-ros2-about-wrapper.png new file mode 100644 index 00000000000..268f54c1084 Binary files /dev/null and b/src/assets/images/og-images/docs-ros2-about-wrapper.png differ diff --git a/src/assets/images/og-images/docs-ros2-launch-robot-cloud.png b/src/assets/images/og-images/docs-ros2-launch-robot-cloud.png new file mode 100644 index 00000000000..4ad0f5c6662 Binary files /dev/null and b/src/assets/images/og-images/docs-ros2-launch-robot-cloud.png differ diff --git a/src/assets/images/og-images/el-docs-ros2-about-wrapper.png b/src/assets/images/og-images/el-docs-ros2-about-wrapper.png new file mode 100644 index 00000000000..494152b2e19 Binary files /dev/null and b/src/assets/images/og-images/el-docs-ros2-about-wrapper.png differ diff --git a/src/assets/images/og-images/el-docs-ros2-launch-robot-cloud.png b/src/assets/images/og-images/el-docs-ros2-launch-robot-cloud.png new file mode 100644 index 00000000000..ee3863deaff Binary files /dev/null and b/src/assets/images/og-images/el-docs-ros2-launch-robot-cloud.png differ diff --git a/src/assets/images/og-images/es-docs-ros2-about-wrapper.png b/src/assets/images/og-images/es-docs-ros2-about-wrapper.png new file mode 100644 index 00000000000..20d65c71be3 Binary files /dev/null and b/src/assets/images/og-images/es-docs-ros2-about-wrapper.png differ diff --git a/src/assets/images/og-images/es-docs-ros2-launch-robot-cloud.png b/src/assets/images/og-images/es-docs-ros2-launch-robot-cloud.png new file mode 100644 index 00000000000..06199ec22a7 Binary files /dev/null and b/src/assets/images/og-images/es-docs-ros2-launch-robot-cloud.png differ diff --git a/src/assets/images/og-images/fr-docs-ros2-about-wrapper.png b/src/assets/images/og-images/fr-docs-ros2-about-wrapper.png new file mode 100644 index 00000000000..0e33b3f2f91 Binary files /dev/null and b/src/assets/images/og-images/fr-docs-ros2-about-wrapper.png differ diff --git a/src/assets/images/og-images/fr-docs-ros2-launch-robot-cloud.png b/src/assets/images/og-images/fr-docs-ros2-launch-robot-cloud.png new file mode 100644 index 00000000000..1ce33967892 Binary files /dev/null and b/src/assets/images/og-images/fr-docs-ros2-launch-robot-cloud.png differ diff --git a/src/assets/images/og-images/it-docs-ros2-about-wrapper.png b/src/assets/images/og-images/it-docs-ros2-about-wrapper.png new file mode 100644 index 00000000000..d42acf809fd Binary files /dev/null and b/src/assets/images/og-images/it-docs-ros2-about-wrapper.png differ diff --git a/src/assets/images/og-images/it-docs-ros2-launch-robot-cloud.png b/src/assets/images/og-images/it-docs-ros2-launch-robot-cloud.png new file mode 100644 index 00000000000..9720d6165ec Binary files /dev/null and b/src/assets/images/og-images/it-docs-ros2-launch-robot-cloud.png differ diff --git a/src/assets/images/og-images/ja-docs-ros2-about-wrapper.png b/src/assets/images/og-images/ja-docs-ros2-about-wrapper.png new file mode 100644 index 00000000000..9790c48314b Binary files /dev/null and b/src/assets/images/og-images/ja-docs-ros2-about-wrapper.png differ diff --git a/src/assets/images/og-images/ja-docs-ros2-launch-robot-cloud.png b/src/assets/images/og-images/ja-docs-ros2-launch-robot-cloud.png new file mode 100644 index 00000000000..6cd7eb17b69 Binary files /dev/null and b/src/assets/images/og-images/ja-docs-ros2-launch-robot-cloud.png differ diff --git a/src/assets/images/og-images/ko-docs-ros2-about-wrapper.png b/src/assets/images/og-images/ko-docs-ros2-about-wrapper.png new file mode 100644 index 00000000000..4d68587a48f Binary files /dev/null and b/src/assets/images/og-images/ko-docs-ros2-about-wrapper.png differ diff --git a/src/assets/images/og-images/ko-docs-ros2-launch-robot-cloud.png b/src/assets/images/og-images/ko-docs-ros2-launch-robot-cloud.png new file mode 100644 index 00000000000..f2ac0e0c3b3 Binary files /dev/null and b/src/assets/images/og-images/ko-docs-ros2-launch-robot-cloud.png differ diff --git a/src/assets/images/og-images/pt-docs-ros2-about-wrapper.png b/src/assets/images/og-images/pt-docs-ros2-about-wrapper.png new file mode 100644 index 00000000000..cfccdc510d6 Binary files /dev/null and b/src/assets/images/og-images/pt-docs-ros2-about-wrapper.png differ diff --git a/src/assets/images/og-images/pt-docs-ros2-launch-robot-cloud.png b/src/assets/images/og-images/pt-docs-ros2-launch-robot-cloud.png new file mode 100644 index 00000000000..ec8aa642991 Binary files /dev/null and b/src/assets/images/og-images/pt-docs-ros2-launch-robot-cloud.png differ diff --git a/src/assets/images/og-images/ru-docs-ros2-about-wrapper.png b/src/assets/images/og-images/ru-docs-ros2-about-wrapper.png new file mode 100644 index 00000000000..ac028a8873f Binary files /dev/null and b/src/assets/images/og-images/ru-docs-ros2-about-wrapper.png differ diff --git a/src/assets/images/og-images/ru-docs-ros2-launch-robot-cloud.png b/src/assets/images/og-images/ru-docs-ros2-launch-robot-cloud.png new file mode 100644 index 00000000000..ffd600474ad Binary files /dev/null and b/src/assets/images/og-images/ru-docs-ros2-launch-robot-cloud.png differ diff --git a/src/assets/images/og-images/uk-docs-ros2-about-wrapper.png b/src/assets/images/og-images/uk-docs-ros2-about-wrapper.png new file mode 100644 index 00000000000..fccc851f09f Binary files /dev/null and b/src/assets/images/og-images/uk-docs-ros2-about-wrapper.png differ diff --git a/src/assets/images/og-images/uk-docs-ros2-launch-robot-cloud.png b/src/assets/images/og-images/uk-docs-ros2-launch-robot-cloud.png new file mode 100644 index 00000000000..144e6019ead Binary files /dev/null and b/src/assets/images/og-images/uk-docs-ros2-launch-robot-cloud.png differ diff --git a/src/assets/images/og-images/zh-docs-ros2-about-wrapper.png b/src/assets/images/og-images/zh-docs-ros2-about-wrapper.png new file mode 100644 index 00000000000..a2dbbae2c69 Binary files /dev/null and b/src/assets/images/og-images/zh-docs-ros2-about-wrapper.png differ diff --git a/src/assets/images/og-images/zh-docs-ros2-launch-robot-cloud.png b/src/assets/images/og-images/zh-docs-ros2-launch-robot-cloud.png new file mode 100644 index 00000000000..9701579776a Binary files /dev/null and b/src/assets/images/og-images/zh-docs-ros2-launch-robot-cloud.png differ diff --git a/src/de/docs/ros2-about-wrapper.md b/src/de/docs/ros2-about-wrapper.md new file mode 100644 index 00000000000..2906eafe466 --- /dev/null +++ b/src/de/docs/ros2-about-wrapper.md @@ -0,0 +1,78 @@ +--- +title: Über Robonomics ROS 2 Wrapper +contributors: [Fingerling42] +tools: + - Ubuntu 22.04.4 + https://releases.ubuntu.com/jammy/ + - ROS 2 Humble + https://docs.ros.org/en/humble/Installation.html + - IPFS Kubo 0.26.0 + https://docs.ipfs.tech/install/command-line/ + - Python 3.10.12 + https://www.python.org/downloads/ +--- + +**In diesem Artikel erfahren Sie mehr über das Robonomics ROS 2 Wrapper-Paket, das es Ihnen ermöglicht, alle Funktionen der Robonomics-Parachain für jeden ROS 2-kompatiblen Roboter zu nutzen.** + +Die Idee des Pakets besteht darin, die von [robonomics-interface](https://github.com/airalab/robonomics-interface) bereitgestellte Robonomics-Parachain-API in Knoten von ROS 2 zu integrieren. Das Ziel ist es, ROS 2-Entwicklern eine bequeme Möglichkeit zu bieten, ihre Roboter oder Geräte mit Parachain-Funktionen zu integrieren. Die Logik hinter der Integration eines Robotikgeräts besteht darin, dass eine eindeutige Adresse für dieses Gerät in der Robonomics-Parachain erstellt wird, die zur Steuerung des Geräts oder zum Empfang seiner Telemetrie verwendet wird. + +Verfügbare Funktionen sind: + +* **Startfunktion** — Starten eines Geräts zur Ausführung eines beliebigen Befehls mit einem festgelegten Satz von Parametern, die als Zeichenfolge oder Datei übergeben werden. +* **Datenprotokollfunktion** — Veröffentlichen von Gerätedatentelemetrie in Form eines Hashes an die Parachain. +* **Nutzung des Robonomics-Abonnements** — die Möglichkeit, Transaktionen ohne Gebühr zu senden. +* **Sichere Dateispeicherung** — zum Verpacken und Entpacken von Daten wird das [InterPlanetary File System](https://ipfs.tech/) verwendet, das den Zugriff auf Dateien über ihren eindeutigen Hash ermöglicht. Zur bequemen Nutzung von IPFS ist die Unterstützung von [Pinata](https://www.pinata.cloud/) enthalten, die das Anheften von IPFS-Dateien für schnelles Herunterladen ermöglicht. +* **Dateiverschlüsselung und -entschlüsselung** — Schutz von Dateien mit Public-Key-Verschlüsselung. + +Der Wrapper ist derzeit in der [Python-Implementierung](https://github.com/airalab/robonomics-ros2/) verfügbar. + +## Architektur des Wrappers + +Architektonisch besteht der Wrapper aus einem Worker-Knoten (mit den erforderlichen Themen und Diensten) und einer grundlegenden Knotenklasse, die für Ihre spezifischen Roboter verwendet werden kann. + +{% roboWikiPicture {src:"docs/robotics/robonomics-ros2-wrapper.png", alt:"ROS 2 Wrapper-Architektur"} %}{% endroboWikiPicture %} + +* `robonomics_ros2_pubsub` — ein eindeutiger Knoten für jeden Roboter, der als Einstiegspunkt zu Web3 dient. Er umhüllt die Dienste zum Senden von Datalogs und zum Empfangen von Starts über Robonomics und ermöglicht das Herunterladen/Hochladen von Dateien auf IPFS. Dieser Knoten wird durch eine spezielle Datei konfiguriert, die unten beschrieben wird. Die Zugehörigkeit eines Knotens zu einem bestimmten Roboter kann sein.spezifiziert über den ROS-Namensraum. +* `robonomics_ros2_robot_handler` — ein roboterspezifischer Knoten basierend auf einer grundlegenden Klasse `basic_robonomics_handler` zur Koordination von Pubsub und dem Roboter. Es verarbeitet Starts und entscheidet, wann Datalogs zur Steuerung des Roboters gesendet werden sollen. + +## Installation des Wrappers + +Um mit dem Wrapper zu arbeiten, benötigen Sie die folgende Software: + +* Linux-Betriebssystemverteilung (normalerweise Ubuntu) +* ROS 2-Verteilung +* IPFS-Knoten +* Python 3 (für die Python-Implementierung des Wrappers) + +Bitte folgen Sie der Installationsanleitung, die [hier](https://github.com/airalab/robonomics-ros2/?tab=readme-ov-file#getting-started) verfügbar ist, und überprüfen Sie die benötigten Versionen der Software. Nach dem Herunterladen der erforderlichen Komponenten müssen Sie [den Wrapper als übliches ROS 2-Paket mit dem `colcon`-Dienstprogramm](https://github.com/airalab/robonomics-ros2/?tab=readme-ov-file#installation-and-building) erstellen. + +## Konfigurieren von Verbindungen zur Web3-Cloud + +Bevor Sie den Wrapper starten, müssen Sie festlegen, wie genau Ihr Roboter eine Verbindung zur dezentralen Robonomics-Cloud und den unterstützenden Web3-Diensten herstellen wird. Dazu müssen Sie die Datei einer Konfigurationsdatei namens `robonomics_pubsub_params_template.yaml` bearbeiten, die für jeden gestarteten Roboter, der auf Robonomics zugreifen muss, eindeutig sein muss. + +Die Datei enthält die folgenden Konfigurationsfelder: + +| Feld | Beschreibung | +|-----------------------|------------------------------------------------------------------------------------------------------------| +| account_seed | Kontosamen der Robonomics-Parachain | +| crypto_type | Art Ihres Kontos, `ED25519` oder `SR25519` | +| remote_node_url | Robonomics-Node-URL, Standardwert ist `wss://kusama.rpc.robonomics.network`, für lokalen Knoten `ws://127.0.0.1:9944`| +| rws_owner_address | Eine Adresse des Robonomics-Abonnementbesitzers zur Verwendung des RWS-Moduls | +| ipfs_dir_path | Ein Pfad des Verzeichnisses, das IPFS-Dateien enthält | +| ipfs_gateway | IPFS-Gateway zum Herunterladen von Dateien, z. B. `https://ipfs.io` | +| pinata_api_key | API-Schlüssel von [Pinata](https://www.pinata.cloud/) Pinning-Service für IPFS | +| pinata_api_secret_key | Geheimer API-Schlüssel von [Pinata](https://www.pinata.cloud/) Pinning-Service für IPFS | + +Um ein Konto auf der Robonomics-Parachain zu erstellen, verwenden Sie bitte [die folgende Anleitung](https://wiki.robonomics.network/docs/create-account-in-dapp/) in unserem Wiki. Achten Sie bitte auf den Typ des Kontos, den Sie erstellen, da Konten mit dem Typ SR25519 keine Dateiverschlüsselung verwenden können. + +{% roboWikiNote {type: "warning", title: "Warnung"}%} + + Die Seed-Phrase ist eine sensible Information, die es jedem ermöglicht,Verwenden Sie Ihr Konto. Stellen Sie sicher, dass Sie keine Konfigurationsdatei damit auf GitHub oder an anderer Stelle hochladen. + +{% endroboWikiNote %} + +Achten Sie auf das `remote_node_url`-Feld, da es Ihnen ermöglicht, genau festzulegen, wie Sie sich mit der Robonomics-Parachain verbinden, einschließlich lokal. Sie können Ihre lokale Robonomics-Instanz für Tests und Entwicklung bereitstellen. Anleitungen dazu finden Sie in [diesem Artikel](https://wiki.robonomics.network/docs/run-dev-node/) in unserem Wiki. + +Wenn Sie über ein Robonomics-Abonnement verfügen, das es Ihnen ermöglicht, Transaktionen ohne Gebühren zu senden, fügen Sie bitte die Adresse des Abonnementinhabers in das `rws_owner_address`-Feld ein. Vergessen Sie nicht, dass Ihr Konto zu Ihrem Abonnement hinzugefügt werden muss. Anleitungen dazu, wie Sie Ihr Robonomics-Abonnement aktivieren können, finden Sie in zwei Anleitungen: über die [Robonomics-Dapp](https://wiki.robonomics.network/docs/sub-activate/) mit benutzerfreundlicher Oberfläche oder über das [Robonomics-Substrat-Portal](https://wiki.robonomics.network/docs/get-subscription/). + +Der Parameter `ipfs_gateway` ermöglicht es Ihnen, das Gateway anzugeben, über das IPFS-Dateien heruntergeladen werden. Diese können entweder [öffentliche Gateways](https://ipfs.github.io/public-gateway-checker/) oder spezialisierte private Gateways sein (zum Beispiel solche, die bei Pinata erhalten wurden). \ No newline at end of file diff --git a/src/de/docs/ros2-launch-robot-cloud.md b/src/de/docs/ros2-launch-robot-cloud.md new file mode 100644 index 00000000000..8079b02aa8c --- /dev/null +++ b/src/de/docs/ros2-launch-robot-cloud.md @@ -0,0 +1,244 @@ +--- +title: Starten Sie den Roboter aus der Cloud +contributors: [Fingerling42] +tools: + - Robonomics ROS 2 Wrapper 3.1.0 + https://github.com/airalab/robonomics-ros2/releases +--- + +**In diesem Artikel erfahren Sie, wie Sie die Robonomics-Startfunktion in ROS 2 anhand verschiedener Beispiele verwenden können** + +Das Schlüsselmerkmal der Robonomics-Parachain zum Senden von Befehlen an Geräte ist die Start-Extrinsik. Diese Funktion ermöglicht es Ihnen, einen String zu senden, der einen Parameter enthält (in Form eines 32-Byte langen Hex-Werts), an eine bestimmte Adresse innerhalb der Parachain. Typischerweise repräsentiert der String einen IPFS-Hash, der auf eine Datei mit den erforderlichen Parametern verweist, um den Befehl auszuführen. Weitere Details zur Startfunktion finden Sie [in diesem Artikel](https://wiki.robonomics.network/docs/launch/). + +Im Robonomics ROS 2 Wrapper ist die Startfunktion als Dienst zum Senden von Befehlen und als Thema zum Empfangen von Befehlen implementiert. + +## Starten des Starts + +Der Dienst namens `robonomics/send_launch` sieht wie folgt aus: + +{% codeHelper { additionalLine: "RobonomicsROS2SendLaunch.srv"}%} + +```YAML +string param # Nur Parameter-String oder Dateiname mit Parametern, die auf IPFS hochgeladen werden müssen +string target_address # Adresse, die mit dem Start ausgelöst werden soll +bool is_file True # Ist ein Startparametereine Datei, die auf IPFS hochgeladen werden muss (Standardwert ist True)? +bool encrypt_status True # Überprüfen, ob die Parameterdatei mit der Zieladresse verschlüsselt werden muss, Standardwert ist True +--- +string launch_hash # Hash der Starttransaktion +``` + +{% endcodeHelper %} + +Der Dienst akzeptiert die folgenden Parameter als Teil der Anfrage: ein Befehlsparameter (entweder ein einfacher String oder der Name einer Datei, die die Befehlsparameter enthält), die Zieladresse im Robonomics-Parachain für den Startversand und zwei Flags: eines, das angibt, ob der Parameter eine Datei ist, und das andere, das angibt, ob die Datei verschlüsselt werden soll (beide sind standardmäßig auf true gesetzt). Die Datei wird auf IPFS hochgeladen, und ihr Hash wird als Startparameter übergeben. Daher muss die Datei im Verzeichnis platziert werden, das für IPFS-Dateien vorgesehen ist, wie im Konfigurationsfile für den `robonomics_ros2_pubsub`-Knoten angegeben. + +Standardmäßig wird die Datei mit der öffentlichen Adresse des Startempfängers verschlüsselt. Die angewendete Verschlüsselungsmethode basiert auf der Public-Key-Verschlüsselung mit elliptischer Kurve Curve25519. In der aktuellen Implementierung wird die Verschlüsselung nur für Kontoadressen des Typs ED25519 (Edwards) unterstützt (mehr dazu finden Sie in [diesem Artikel](http://localhost:8080/docs/create-account-in-dapp/#22-create-account)). + +Nach dem Versenden des Starts gibt der Dienst den Transaktionshash zurück. + +## Empfangen des Starts + +Empfangenstarts wird in Form eines entsprechenden Themas organisiert. Technisch gesehen nutzt der Knoten die Funktionalität der robonomics-Schnittstelle, um sich für den Zustand seiner eigenen Adresse zu abonnieren und auf das Erscheinen des `NewLaunch`-Ereignisses zu warten. Sobald das Ereignis eintritt, veröffentlicht der Knoten eine Nachricht im Thema `robonomics/received_launch`. Das Nachrichtenformat lautet wie folgt: + +{% codeHelper { additionalLine: "RobonomicsROS2ReceivedLaunch.msg"}%} + +```YAML +string launch_sender_address # Adresse des Kontos, das den Startbefehl gesendet hat +string param # Zeichenfolge mit Parameter oder Name der Datei mit Parametern +``` + +{% endcodeHelper %} + +Die Nachrichtenfelder enthalten die Adresse, von der aus der Start gesendet wurde, und den Parameter selbst: entweder eine einfache Zeichenfolge oder den Namen der Datei mit Parametern, die von IPFS heruntergeladen und im IPFS-Arbeitsverzeichnis abgelegt wurde. Wenn die Datei verschlüsselt war, wird sie während dieses Prozesses entschlüsselt. + + +## Beispiel mit Turtlesim + +Als nächstes zeigen wir, wie die Startfunktion am Beispiel von [Turtlesim](https://docs.ros.org/en/humble/Tutorials/Beginner-CLI-Tools/Introducing-Turtlesim/Introducing-Turtlesim.html) verwendet wird. Turtlesim ist ein leichtgewichtiger Simulator, der für das Erlernen von ROS 2 entwickelt wurde. Sie können es mit dem folgenden Befehl installieren: + +{% codeHelper { copy: true}%} + +```shell +sudo apt install ros-$ROS_DISTRO-turtlesim +``` + +{% endcodeHelper %} + +Das Robonomics ROS 2 Wrapper-Paket enthält ein vorkonfiguriertes Paket namens `turtlesim_robonomics`, das speziell für Turtlesim angepasst ist. Dieses Paket ermöglicht es Ihnen, alle Funktionen des Wrappers zu testen. Lassen Sie uns versuchen, es auszuführen. + +{% roboWikiNote {type: "warning", title: "Warnung"}%} + + Stellen Sie bitte sicher, dass Sie über ausreichendes Guthaben auf Ihrem Konto oder ein aktives Abonnement verfügen, um Transaktionen durchzuführen. + +{% endroboWikiNote %} + +1. Erstellen Sie zunächst eine Konfigurationsdatei für die Pubsub-Instanz von `turtlesim_robonomics` mithilfe der Vorlage `config/robonomics_pubsub_params_template.yaml`. Füllen Sie die entsprechenden Felder mit Ihren Robonomics-Anmeldeinformationen (Kontosamen, Kryptotyp, Abonnementinhaberadresse) aus. Geben Sie außerdem ein Verzeichnis für IPFS-Dateien an. Nach Abschluss benennen Sie die Datei beispielsweise in `first_pubsub_params.yaml` um. + +2. Starten Sie den IPFS-Daemon: + +{% codeHelper { copy: true}%} + +```shell +ipfs daemon +``` + +{% endcodeHelper %} + +3. Führen Sie die folgende ROS 2-Startdatei aus. Sie wird alle erforderlichen Knoten starten: Turtlesim selbst, die Implementierung des Wrappers für Turtlesim und den Robonomics-Pubsub: + +{% codeHelper { copy: true}%} + +```shell +ros2 launch turtlesim_robonomics turtlesim_robonomics_launch.py pubsub_params_path:=./first_pubsub_params +```.yaml namespace:='turtlesim1' +``` + +{% endcodeHelper %} + +Sie sehen den Simulator mit der Schildkröte sowie ROS 2-Protokolle in der Konsole, die die IPFS-ID, den Pfad zum Verzeichnis mit IPFS-Dateien, die Robonomics-Adresse und andere relevante Informationen anzeigen. + +### Starten Sie Turtlesim vom Polkadot-Portal aus + +1. Turtlesim wird über das Thema `/cmd_vel` gesteuert, daher müssen Sie die entsprechenden Nachrichten vorbereiten und in einer Datei einfügen, die als Startparameter verwendet wird. Diese Nachrichten sind zur einfacheren Handhabung in einer JSON-Datei vorbereitet. Erstellen Sie eine Datei (z. B. `turtle_cmd_vel.json`) und fügen Sie Folgendes ein: + + {% codeHelper { copy: true}%} + + ```json + [ + { + "linear": { + "x": 5.0, + "y": 0.0, + "z": 0.0 + }, + "angular": { + "x": 0.0, + "y": 0.0, + "z": 1.5 + } + }, + { + "linear": { + "x": 2.0, + "y": 0.0, + "z": 0.0 + }, + "angular": { + "x": 0.0, + "y": 0.0, + "z": 2.5 + } +``` } + ] + ``` + + {% endcodeHelper %} + + Dieses JSON-Beispiel wird die Schildkröte anweisen, sich zweimal zu bewegen. + +2. Als nächstes muss die Datei auf IPFS hochgeladen werden. Sie können jede Methode wählen, aber für dieses Beispiel verwenden wir IPFS Kubo. Öffnen Sie ein Terminal im Verzeichnis, in dem sich die JSON-Datei befindet, und laden Sie sie auf IPFS hoch: + + {% codeHelper { copy: true}%} + + ```shell + ipfs add turtle_cmd_vel.json + ``` + + {% endcodeHelper %} + + Sie erhalten den IPFS-Hash der Datei. Stellen Sie sicher, dass Sie ihn für spätere Verwendung speichern. + +3. Bevor der Start gesendet wird, muss der IPFS-Hash in einen 32-Byte langen String umgewandelt werden. Dies kann mit einigen Python-Befehlen erfolgen. Öffnen Sie ein Terminal, starten Sie den Python 3-Interpreter und führen Sie die folgenden Befehle aus: + + {% codeHelper { copy: true}%} + + ```python + from robonomicsinterface.utils import ipfs_qm_hash_to_32_bytes + ipfs_qm_hash_to_32_bytes('IPFS_FILE_HASH') + ``` + + {% endcodeHelper %} + + Speichern Sie den resultierenden String für die spätere Verwendung. + +4. Öffnen Sie das Robonomics [Polkadot/Substrate-Portal](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fkusama.rpc.robonomics.network%2F#/extrinsics) und navigieren SieZum **Entwickler** -> **Extrinsisches** Registerkarte. Wählen Sie das extrinsische `launch` -> `launch(robot, param)`. Geben Sie die Adresse Ihres Roboters im Feld `robot` ein und fügen Sie im Feld `param` den String mit dem konvertierten IPFS-Hash ein. Senden Sie die Transaktion ab. + +5. Gehen Sie zum Turtlesim-Simulator. Nach erfolgreichem Senden der Transaktion sollte die Schildkröte anfangen sich zu bewegen. + +### Starten von Turtlesim von den ROS 2-Befehlszeilentools aus + +1. Versuchen wir nun, einen Start an Turtlesim von einem anderen ROS 2-Pubsub-Knoten aus zu senden. Erstellen Sie zunächst eine weitere Konfigurationsdatei (z. B. `second_pubsub_params.yaml`) mit unterschiedlichen Robonomics-Anmeldeinformationen und einem separaten IPFS-Verzeichnis. + +2. Führen Sie in einem separaten Terminal einen neuen `robonomics_ros2_pubsub`-Knoten mit der neuen Konfigurationsdatei aus: + +{% codeHelper { copy: true}%} + +```shell +ros2 run robonomics_ros2_pubsub robonomics_ros2_pubsub --ros-args -r __ns:=/test -p pubsub_params_path:=./second_pubsub_params.yaml +``` + +{% endcodeHelper %} + +3. Platzieren Sie die JSON-Datei mit den Befehlen für Turtlesim (`turtle_cmd_vel.json`) in das IPFS-Verzeichnis des neuen Pubsub. + +4. Bevor Sie den Start senden, richten wir eine Überwachung ein, um zu beobachten, wie `turtlesim_robonomics` empfängt.data upon arrival. To do this, in a separate terminal, subscribe to the corresponding topic: + +{% codeHelper { copy: true}%} + + ```shell + ros2 topic echo /turtlesim1/robonomics/received_launch + ``` + +{% endcodeHelper %} + +{% roboWikiNote {type: "warning", title: "Launch Param as String"}%} + Standardmäßig erwartet der Launch-Handler einen IPFS-Hash einer Datei als Parameter. Wenn Pubsub den Parameter als reguläre Zeichenfolge behandeln soll, müssen Sie den entsprechenden ROS 2-Knotenparameter `launch_is_ipfs` von `True` in `False` ändern. Sie können dies mit dem Befehl `ros2 param set` tun. +{% endroboWikiNote %} + +5. Jetzt müssen wir den ROS 2-Dienst aufrufen, um den Start zu senden. Verwenden Sie in einem separaten Terminal den folgenden Befehl: + +{% codeHelper { copy: true}%} + + ```shell + ros2 service call /test/robonomics/send_launch robonomics_ros2_interfaces/srv/RobonomicsROS2SendLaunch {"param: 'turtle_cmd_vel.json', target_address: 'YOUR_TURTLESIM_ADDRESS'"} + ``` + +{% endcodeHelper %} + +Sie sehen die Pubsub-Protokolle mit den Details der Startübermittlung. + +6. Gehen Sie zum Turtlesim-Simulator. Nach dem erfolgreichen Senden der Transaktion sollte die Schildkröte starten. + +### Starten von Turtlesim von einem anderen Knoten aus + +1. Versuchen wir nun, einen Testknoten zu erstellen, der auf den Start wartet und ihn dann an Turtlesim weiterleitet. Sie können das vorgefertigte Testpaket `test_robot_robonomics` verwenden. Kopieren Sie dieses Paket in Ihr ROS 2-Arbeitsbereich. + +2. Öffnen Sie die Knotendatei unter `test_robot_robonomics/test_robot_robonomics/test_robot_robonomics_node.py` in einem beliebigen Texteditor und fügen Sie den folgenden Code nach der `__init__`-Funktion hinzu: + +{% codeHelper { copy: true}%} + + ```python + def launch_file_subscriber_callback(self, msg) -> None: + super().launch_file_subscriber_callback(msg) + + transaction_hash = self.send_launch_request(self.param, target_address='IHRE_TURTLESIM_ADRESSE', is_file=True, encrypt_status=True) + + self.get_logger().info('Start an die Schildkröte gesendet mit Hash: %s ' % str(transaction_hash)) + ``` + +{% endcodeHelper %} + + Diese Funktion wird zuerst den empfangenen Start verarbeiten und dann dessen Parameter verwenden, um einen neuen Start an Turtlesim zu senden. + +3. Bauen Sie das Paket mit `colcon` und aktivieren Sie dann dessen Einrichtungsdateien. + +4. Starten Sie die ROS 2-Startdatei des Testpakets mit den zweiten Pub/Sub-Anmeldeinformationen: + +{% codeHelper { copy: true}%} + +```shell + ros2 launch test_robot_robonomics test_robot_robonomics_launch.py pubsub_params_path:=./second_pubsub_params.yaml namespace:='test' +``` + +{% endcodeHelper %} + +5. Jetzt senden Sie einen Start mit den Parametern `turtle_cmd_vel.json` an die Adresse des Testknotens, zum Beispiel über das Polkadot/Substrate-Portal. Stellen Sie sicher, dass Turtlesim noch läuft, bevor Sie dies tun. Der Testknoten sollte den Start empfangen und dann einen neuen mit denselben Parametern senden, wodurch die Schildkröte in Turtlesim zu bewegen beginnt. \ No newline at end of file diff --git a/src/el/docs/ros2-about-wrapper.md b/src/el/docs/ros2-about-wrapper.md new file mode 100644 index 00000000000..f3e33b00f9c --- /dev/null +++ b/src/el/docs/ros2-about-wrapper.md @@ -0,0 +1,78 @@ +--- +title: Σχετικά με το Robonomics ROS 2 Wrapper +contributors: [Fingerling42] +tools: + - Ubuntu 22.04.4 + https://releases.ubuntu.com/jammy/ + - ROS 2 Humble + https://docs.ros.org/en/humble/Installation.html + - IPFS Kubo 0.26.0 + https://docs.ipfs.tech/install/command-line/ + - Python 3.10.12 + https://www.python.org/downloads/ +--- + +**Σε αυτό το άρθρο, θα μάθετε για το πακέτο Robonomics ROS 2 Wrapper, το οποίο σάς επιτρέπει να χρησιμοποιήσετε όλες τις λειτουργίες της αλυσίδας Robonomics για οποιοδήποτε ρομπότ συμβατό με το ROS 2.** + +Η ιδέα του πακέτου είναι να τυλίξει το API της αλυσίδας Robonomics που παρέχεται από το [robonomics-interface](https://github.com/airalab/robonomics-interface) σε κόμβους του ROS 2. Ο στόχος είναι να παρέχει στους προγραμματιστές του ROS 2 έναν βολικό τρόπο να ενσωματώσουν τα ρομπότ ή τις συσκευές τους με τις λειτουργίες της αλυσίδας. Η λογική πίσω από την ενσωμάτωση μιας ρομποτικής συσκευής είναι ότι δημιουργείται ένα μοναδικό διεύθυνση γι' αυτήν στην αλυσίδα Robonomics, η οποία χρησιμοποιείται για τον έλεγχο της συσκευής ή τη λήψη της τηλεμετρίας της. + +Οι διαθέσιμες λειτουργίες περιλαμβάνουν: + +* **Λειτουργία εκκίνησης** — εκκίνηση μιας συσκευής για την εκτέλεση οποιασδήποτε εντολής με ένα συγκεκριμένο σύνολο παραμέτρων που περνούν ως συμβολοσειρά ή αρχείο. +* **Λειτουργία καταγραφής δεδομένων** — δημοσίευση δεδομένων συσκευήςτηλεμετρία σε μορφή hash στην parachain. +* **Χρήση συνδρομής Robonomics** — η δυνατότητα αποστολής συναλλαγών χωρίς χρέωση. +* **Ασφαλής αποθήκευση αρχείων** — για τη συσκευασία και αποσυσκευασία δεδομένων, χρησιμοποιείται το [InterPlanetary File System](https://ipfs.tech/), το οποίο επιτρέπει την πρόσβαση σε αρχεία με βάση το μοναδικό τους hash. Για την εύκολη χρήση του IPFS, περιλαμβάνεται υποστήριξη από το [Pinata](https://www.pinata.cloud/), το οποίο επιτρέπει την ακριβή λήψη αρχείων IPFS. +* **Κρυπτογράφηση και αποκρυπτογράφηση αρχείων** — προστασία αρχείων με κρυπτογράφηση δημόσιου κλειδιού. + +Προς το παρόν, ο περιτύλιγμα είναι διαθέσιμο σε [υλοποίηση Python](https://github.com/airalab/robonomics-ros2/). + +## Αρχιτεκτονική Περιτυλίγματος + +Αρχιτεκτονικά, το περίβλημα αποτελείται από έναν κόμβο εργαζομένου (με τα απαραίτητα θέματα και υπηρεσίες) και ένα βασικό κλάσμα κόμβου που μπορεί να χρησιμοποιηθεί για τους συγκεκριμένους ρομπότ σας. + +{% roboWikiPicture {src:"docs/robotics/robonomics-ros2-wrapper.png", alt:"Αρχιτεκτονική Περιτυλίγματος ROS 2"} %}{% endroboWikiPicture %} + +* `robonomics_ros2_pubsub` — ένας μοναδικός κόμβος για κάθε ρομπότ που λειτουργεί ως σημείο εισόδου στο Web3. Περικλείει τις υπηρεσίες για την αποστολή αρχείων καταγραφής δεδομένων και τη λήψη εκτοξεύσεων μέσω του Robonomics και επιτρέπει τη λήψη/αποστολή αρχείων στο IPFS. Αυτός ο κόμβος ρυθμίζεται από ένα ειδικό αρχείο, το οποίο περιγράφεται παρακάτω. Η συσχέτιση ενός κόμβου με ένα συγκεκριμένο ρομπότ μπορεί νακαθορίζεται μέσω του ROS namespace. +* `robonomics_ros2_robot_handler` — ένας κόμβος που είναι ειδικός για ρομπότ βασισμένος σε μια βασική κλάση `basic_robonomics_handler` για τον συντονισμό του pubsub και του ρομπότ. Επεξεργάζεται τις εκκινήσεις και αποφασίζει πότε να στείλει datalogs για τον έλεγχο του ρομπότ. + +## Εγκατάσταση του Περιτυλικού + +Για να δουλέψετε με το περιτύλιγμα, χρειάζεστε το παρακάτω λογισμικό: + +* Διανομή λειτουργικού συστήματος Linux (συνήθως Ubuntu) +* Διανομή ROS 2 +* Κόμβο IPFS +* Python 3 (για την υλοποίηση του περιτυλίγματος σε Python) + +Παρακαλώ ακολουθήστε τον οδηγό εγκατάστασης που είναι διαθέσιμος [εδώ](https://github.com/airalab/robonomics-ros2/?tab=readme-ov-file#getting-started) και ελέγξτε τις απαιτούμενες εκδόσεις του λογισμικού. Μετά τη λήψη των απαιτούμενων στοιχείων, θα χρειαστεί [να κατασκευάσετε](https://github.com/airalab/robonomics-ros2/?tab=readme-ov-file#installation-and-building) το περιτύλιγμα ως ένα συνηθισμένο πακέτο ROS 2 χρησιμοποιώντας το εργαλείο `colcon`. + +## Ρύθμιση Συνδέσεων με τον Νέφος Web3 + +Πριν ξεκινήσετε το περιτύλιγμα, πρέπει να ρυθμίσετε πώς ακριβώς το ρομπότ σας θα συνδεθεί με το αποκεντρωμένο νέφος Robonomics και τις υπηρεσίες υποστήριξης Web3. Για να το κάνετε αυτό, πρέπει να επεξεργαστείτε το αρχείο ρυθμίσεων που ονομάζεται `robonomics_pubsub_params_template.yaml`, το οποίο πρέπει να είναι μοναδικό για κάθε εκκινούμενο ρομπότ που χρειάζεται πρόσβαση στο Robonomics. + +Το αρχείο περιέχει τα ακόλουθα πεδία ρύθμισης: + +| Πεδίο | Περιγραφή | +|-----------------------|------------------------------------------------------------------------------------------------------------| +| account_seed | Σπόρος λογαριασμού του Robonomics parachain | +| crypto_type | Τύπος του λογαριασμού σας, `ED25519` ή `SR25519` | +| remote_node_url | Διεύθυνση URL κόμβου Robonomics, η προεπιλεγμένη είναι `wss://kusama.rpc.robonomics.network`, για τον τοπικό κόμβο `ws://127.0.0.1:9944`| +| rws_owner_address | Διεύθυνση του ιδιοκτήτη συνδρομής Robonomics για χρήση του ενότητας RWS | +| ipfs_dir_path | Διαδρομή καταλόγου που περιέχει αρχεία IPFS | +| ipfs_gateway | IPFS πύλη για λήψη αρχείων, π.χ. `https://ipfs.io` | +| pinata_api_key | Κλειδί API από την υπηρεσία αποθήκευσης Pinata (https://www.pinata.cloud/) για το IPFS | +| pinata_api_secret_key | Μυστικό κλειδί API από την υπηρεσία αποθήκευσης Pinata (https://www.pinata.cloud/) για το IPFS | + +Για να δημιουργήσετε έναν λογαριασμό στο Robonomics parachain, παρακαλούμε χρησιμοποιήστε [τον ακόλουθο οδηγό](https://wiki.robonomics.network/docs/create-account-in-dapp/) στο wiki μας. Παρακαλούμε εστιάστε στον τύπο του λογαριασμού που δημιουργείτε, καθώς οι λογαριασμοί με τύπο SR25519 δεν μπορούν να χρησιμοποιήσουν κρυπτογράφηση αρχείων. + +{% roboWikiNote {type: "warning", title: "Προειδοποίηση"}%} + + Η φράση σπόρου είναι ευαίσθητη πληροφορία που επιτρέπει σε οποιονδήποτε ναΧρησιμοποιήστε το λογαριασμό σας. Βεβαιωθείτε ότι δεν ανεβάζετε ένα αρχείο ρύθμισης μαζί του στο GitHub ή οπουδήποτε αλλού. + +{% endroboWikiNote %} + +Προσέξτε το πεδίο `remote_node_url`, καθώς σας επιτρέπει να επιλέξετε πώς ακριβώς θα συνδεθείτε στο Robonomics parachain, συμπεριλαμβανομένης και της τοπικής σύνδεσης. Μπορείτε να αναπτύξετε τη δική σας τοπική εκδοχή του Robonomics για δοκιμές και ανάπτυξη. Οδηγίες για το πώς να το κάνετε αυτό είναι διαθέσιμες σε [αυτό το άρθρο](https://wiki.robonomics.network/docs/run-dev-node/) στο wiki μας. + +Αν έχετε μια συνδρομή Robonomics που σας επιτρέπει να στέλνετε συναλλαγές χωρίς χρεώσεις, παρακαλούμε εισάγετε τη διεύθυνση του ιδιοκτήτη της συνδρομής στο πεδίο `rws_owner_address`. Μην ξεχάσετε ότι ο λογαριασμός σας πρέπει να προστεθεί στη συνδρομή σας. Οδηγίες για το πώς να ενεργοποιήσετε τη συνδρομή σας στο Robonomics είναι διαθέσιμες σε δύο οδηγούς: μέσω [Robonomics dapp](https://wiki.robonomics.network/docs/sub-activate/) με φιλικό προς τον χρήστη περιβάλλον ή μέσω [Robonomics Substrate portal](https://wiki.robonomics.network/docs/get-subscription/). + +Η παράμετρος `ipfs_gateway` σάς επιτρέπει να καθορίσετε την πύλη μέσω της οποίας θα γίνεται η λήψη αρχείων IPFS. Αυτές μπορεί να είναι είτε [δημόσιες πύλες](https://ipfs.github.io/public-gateway-checker/) είτε εξειδικευμένες ιδιωτικές (για παράδειγμα, αυτές που αποκτώνται στο Pinata) \ No newline at end of file diff --git a/src/el/docs/ros2-launch-robot-cloud.md b/src/el/docs/ros2-launch-robot-cloud.md new file mode 100644 index 00000000000..f4a97e9b322 --- /dev/null +++ b/src/el/docs/ros2-launch-robot-cloud.md @@ -0,0 +1,245 @@ +--- +title: Εκκίνηση ρομπότ από το Cloud +contributors: [Fingerling42] +tools: + - Περιτύλιγμα Robonomics ROS 2 3.1.0 + https://github.com/airalab/robonomics-ros2/releases +--- + +**Σε αυτό το άρθρο, θα μάθετε πώς να χρησιμοποιήσετε τη λειτουργία εκκίνησης του Robonomics στο ROS 2 μέσω διαφόρων παραδειγμάτων** + +Η κύρια λειτουργία της παρακαταθήκης Robonomics για την αποστολή εντολών σε συσκευές είναι η εξωτερική εκκίνηση. Αυτή η λειτουργία σάς επιτρέπει να στείλετε ένα string που περιέχει ένα παράμετρο (σε μορφή 32-byte μακρού δεκαεξαδικού αριθμού) σε μια συγκεκριμένη διεύθυνση εντός της παρακαταθήκης. Συνήθως, το string αντιπροσωπεύει ένα IPFS hash που δείχνει σε ένα αρχείο με τις απαραίτητες παραμέτρους για την εκτέλεση της εντολής. Μπορείτε να βρείτε περισσότερες λεπτομέρειες σχετικά με τη λειτουργία εκκίνησης [σε αυτό το άρθρο](https://wiki.robonomics.network/docs/launch/). + +Στο Περιτύλιγμα Robonomics ROS 2, η λειτουργία εκκίνησης υλοποιείται ως ένας υπηρεσία για την αποστολή εντολών και ως ένα θέμα για τη λήψη εντολών. + +## Αποστολή Εκκίνησης + +Η υπηρεσία, που ονομάζεται `robonomics/send_launch`, φαίνεται ως εξής: + +{% codeHelper { additionalLine: "RobonomicsROS2SendLaunch.srv"}%} + +```YAML +string param # Απλό string παράμετρος ή όνομα αρχείου με παραμέτρους που πρέπει να μεταφορτωθούν στο IPFS +string target_address # Διεύθυνση που θα ενεργοποιηθεί με την εκκίνηση +bool is_file True # Είναι μια παράμετρος εκκίνησηςΈνα αρχείο που χρειάζεται να μεταφορτωθεί στο IPFS (προεπιλογή είναι True)? +bool encrypt_status True # Ελέγξτε εάν το παράμετρο αρχείο χρειάζεται να κρυπτογραφηθεί με τη διεύθυνση στόχο, η προεπιλογή είναι True +--- +string launch_hash # Κατακερματισμός της συναλλαγής εκκίνησης +``` + +{% endcodeHelper %} + +Το σύστημα δέχεται τις ακόλουθες παραμέτρους ως μέρος του αιτήματος: μια παράμετρο εντολής (είτε απλή συμβολοσειρά είτε το όνομα ενός αρχείου που περιέχει τις παραμέτρους της εντολής), η διεύθυνση στόχος στο Robonomics parachain για την αποστολή της εκκίνησης και δύο σημαίες: μία που υποδηλώνει εάν η παράμετρος είναι ένα αρχείο και η άλλη προσδιορίζει εάν το αρχείο πρέπει να είναι κρυπτογραφημένο (και τα δύο έχουν οριστεί σε True από προεπιλογή). Το αρχείο θα μεταφορτωθεί στο IPFS, και ο κατακερματισμός του θα περάσει ως παράμετρος εκκίνησης. Συνεπώς, το αρχείο πρέπει να τοποθετηθεί στον κατάλογο που έχει οριστεί για τα αρχεία IPFS, όπως προσδιορίζεται στο αρχείο ρύθμισης για τον κόμβο `robonomics_ros2_pubsub`. + +Από προεπιλογή, το αρχείο είναι κρυπτογραφημένο χρησιμοποιώντας τη δημόσια διεύθυνση του παραλήπτη της εκκίνησης. Η μέθοδος κρυπτογράφησης που εφαρμόζεται είναι η κρυπτογράφηση με δημόσιο κλειδί βασισμένη στην κρυπτογραφία καμπύλης ελλειπτικής καμπύλης Curve25519. Στην τρέχουσα υλοποίηση, η κρυπτογράφηση υποστηρίζεται μόνο για διευθύνσεις λογαριασμών του τύπου ED25519 (Edwards) (μπορείτε να διαβάσετε περισσότερα σχετικά με αυτό σε [αυτό το άρθρο](http://localhost:8080/docs/create-account-in-dapp/#22-create-account)). + +Μετά την αποστολή της εκκίνησης, το σύστημα επιστρέφει τον κατακερματισμό της συναλλαγής. + +## Λήψη Εκκίνησης + +ΛήψηΟι εκκινήσεις οργανώνονται στη μορφή αντίστοιχου θέματος. Τεχνικά, το κόμβος χρησιμοποιεί τη λειτουργικότητα του διεπαφής robonomics-interface για να εγγραφεί στην κατάσταση της δικής του διεύθυνσης και περιμένει να εμφανιστεί το συμβάν `NewLaunch`. Μόλις συμβεί το συμβάν, ο κόμβος δημοσιεύει ένα μήνυμα στο θέμα `robonomics/received_launch`. Η μορφή του μηνύματος είναι η ακόλουθη: + +{% codeHelper { additionalLine: "RobonomicsROS2ReceivedLaunch.msg"}%} + +```YAML +string launch_sender_address # Διεύθυνση του λογαριασμού που έστειλε την εντολή εκκίνησης +string param # Συμβολοσειρά με παράμετρο ή όνομα αρχείου με παραμέτρους +``` + +{% endcodeHelper %} + +Τα πεδία του μηνύματος περιέχουν τη διεύθυνση από την οποία απεστάλη η εκκίνηση και την παράμετρο ή τον εαυτό της: είτε μια απλή συμβολοσειρά είτε το όνομα του αρχείου με τις παραμέτρους που κατέβηκε από το IPFS και τοποθετήθηκε στον κατάλογο εργασίας του IPFS. Εάν το αρχείο ήταν κρυπτογραφημένο, αποκρυπτογραφείται κατά τη διαδικασία αυτή. + +## Παράδειγμα με Turtlesim + +Στη συνέχεια, θα δείξουμε πώς να χρησιμοποιήσετε τη λειτουργία εκκίνησης με το [Turtlesim](https://docs.ros.org/en/humble/Tutorials/Beginner-CLI-Tools/Introducing-Turtlesim/Introducing-Turtlesim.html) ως παράδειγμα. Το Turtlesim είναι ένα ελαφρύ προσομοιωτή σχεδιασμένο για την εκμάθηση του ROS 2. Μπορείτε να το εγκαταστήσετε χρησιμοποιώντας την ακόλουθη εντολή: + +{% codeHelper { copy: true}%} + +```shell +sudo apt install ros-$ROS_DISTRO-turtlesim +``` + +{% endcodeHelper %} + +Το πακέτο Robonomics ROS 2 Wrapper περιλαμβάνει ένα προεγκατεστημένο πακέτο με την ονομασία `turtlesim_robonomics`, το οποίο έχει προσαρμοστεί ειδικά για το Turtlesim. Αυτό το πακέτο σάς επιτρέπει να δοκιμάσετε όλες τις λειτουργίες του wrapper. Ας το δοκιμάσουμε και να το εκτελέσουμε. + +{% roboWikiNote {type: "warning", title: "Προειδοποίηση"}%} + + Βεβαιωθείτε ότι έχετε επαρκές υπόλοιπο στον λογαριασμό σας ή ένα ενεργό συνδρομή για να πραγματοποιήσετε συναλλαγές. + +{% endroboWikiNote %} + +1. Για να ξεκινήσετε, δημιουργήστε ένα αρχείο ρύθμισης για την περίπτωση pubsub του `turtlesim_robonomics` χρησιμοποιώντας το πρότυπο `config/robonomics_pubsub_params_template.yaml`. Συμπληρώστε τα κατάλληλα πεδία με τα διαπιστευτήριά σας Robonomics (seed λογαριασμού, τύπο κρυπτογράφησης, διεύθυνση ιδιοκτήτη συνδρομής). Επίσης, καθορίστε έναν κατάλογο για τα αρχεία IPFS. Αφού ολοκληρώσετε, μετονομάστε το αρχείο, για παράδειγμα, `first_pubsub_params.yaml`. + +2. Εκκινήστε τον IPFS Daemon: + +{% codeHelper { copy: true}%} + +```shell +ipfs daemon +``` + +{% endcodeHelper %} + +3. Εκτελέστε το ακόλουθο αρχείο εκκίνησης ROS 2. Θα ξεκινήσει όλους τους απαραίτητους κόμβους: το Turtlesim ίδιο, την υλοποίηση του wrapper για το Turtlesim και το Robonomics pubsub: + +{% codeHelper { copy: true}%} + +```shell +ros2 launch turtlesim_robonomics turtlesim_robonomics_launch.py pubsub_params_path:=./first_pubsub_params +```.yaml namespace:='turtlesim1' +``` + +{% endcodeHelper %} + +Θα δείτε τον προσομοιωτή με τη χελώνα, μαζί με τα αρχεία ROS 2 που εμφανίζονται στην κονσόλα εμφανίζοντας το ID του IPFS, τη διαδρομή προς τον κατάλογο με τα αρχεία IPFS, τη διεύθυνση Robonomics και άλλες σχετικές πληροφορίες. + +### Εκκίνηση του Turtlesim από την πύλη του Polkadot + +1. Το Turtlesim ελέγχεται μέσω του θέματος `/cmd_vel`, οπότε πρέπει να προετοιμάσετε τα αντίστοιχα μηνύματα και να τα συμπεριλάβετε σε ένα αρχείο, το οποίο θα χρησιμοποιηθεί ως παράμετρος εκκίνησης. Για την ευκολία, αυτά τα μηνύματα προετοιμάζονται σε ένα αρχείο JSON. Δημιουργήστε ένα αρχείο (π.χ. `turtle_cmd_vel.json`) και επικολλήστε τα παρακάτω: + + {% codeHelper { copy: true}%} + + ```json + [ + { + "linear": { + "x": 5.0, + "y": 0.0, + "z": 0.0 + }, + "angular": { + "x": 0.0, + "y": 0.0, + "z": 1.5 + } + }, + { + "linear": { + "x": 2.0, + "y": 0.0, + "z": 0.0 + }, + "angular": { + "x": 0.0, + "y": 0.0, + "z": 2.5 + } +``` } + ] + ``` + + {% endcodeHelper %} + + Αυτό το παράδειγμα JSON θα εντολεύσει τη χελώνα να μετακινηθεί δύο φορές. + +2. Στη συνέχεια, το αρχείο πρέπει να μεταφορτωθεί στο IPFS. Μπορείτε να επιλέξετε οποιαδήποτε μέθοδο, αλλά για αυτό το παράδειγμα, θα χρησιμοποιήσουμε το IPFS Kubo. Ανοίξτε ένα τερματικό στον κατάλογο όπου βρίσκεται το αρχείο JSON και μεταφορτώστε το στο IPFS: + + {% codeHelper { copy: true}%} + + ```shell + ipfs add turtle_cmd_vel.json + ``` + + {% endcodeHelper %} + + Θα λάβετε το hash του αρχείου στο IPFS. Βεβαιωθείτε ότι το αποθηκεύετε για μετέπειτα χρήση. + +3. Πριν στείλετε την εκκίνηση, το hash του IPFS πρέπει να μετατραπεί σε μια συμβολοσειρά μήκους 32 bytes. Αυτό μπορεί να γίνει χρησιμοποιώντας μερικές εντολές Python. Ανοίξτε ένα τερματικό, εκκινήστε τον διερμηνέα Python 3 και εκτελέστε τις παρακάτω εντολές: + + {% codeHelper { copy: true}%} + + ```python + from robonomicsinterface.utils import ipfs_qm_hash_to_32_bytes + ipfs_qm_hash_to_32_bytes('IPFS_FILE_HASH') + ``` + + {% endcodeHelper %} + + Αποθηκεύστε τη συμβολοσειρά που προκύπτει για μετέπειτα χρήση. + +4. Ανοίξτε το Robonomics [Πύλη Polkadot/Substrate](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fkusama.rpc.robonomics.network%2F#/extrinsics) και πλοηγηθείτεΜεταβείτε στην καρτέλα **Προγραμματιστές** -> **Εξωτερικά**. Επιλέξτε το εξωτερικό `launch` -> `launch(robot, param)`. Στο πεδίο `robot`, εισάγετε τη διεύθυνση του ρομπότ σας και στο πεδίο `param`, εισάγετε το string με το μετατραμένο IPFS hash. Υποβάλετε τη συναλλαγή. + +5. Μεταβείτε στον προσομοιωτή Turtlesim. Αφού στείλετε με επιτυχία τη συναλλαγή, η χελώνα θα πρέπει να αρχίσει να κινείται. + +### Εκκίνηση Turtlesim από τα Εργαλεία Εντολών ROS 2 + +1. Ας δοκιμάσουμε τώρα να στείλουμε μια εκκίνηση στο Turtlesim από έναν άλλο κόμβο pubsub του ROS 2. Πρώτα, δημιουργήστε έναν άλλο αρχείο ρυθμίσεων (π.χ., `second_pubsub_params.yaml`) με διαφορετικά διαπιστευτήρια Robonomics και έναν ξεχωριστό κατάλογο IPFS. + +2. Σε έναν ξεχωριστό τερματικό, εκτελέστε έναν νέο κόμβο `robonomics_ros2_pubsub` χρησιμοποιώντας το νέο αρχείο ρυθμίσεων: + + {% codeHelper { copy: true}%} + + ```shell + ros2 run robonomics_ros2_pubsub robonomics_ros2_pubsub --ros-args -r __ns:=/test -p pubsub_params_path:=./second_pubsub_params.yaml + ``` + + {% endcodeHelper %} + +3. Τοποθετήστε το αρχείο JSON που περιέχει τις εντολές για το Turtlesim (`turtle_cmd_vel.json`) στον κατάλογο IPFS του νέου pubsub. + +4. Πριν στείλετε την εκκίνηση, ας εγκαταστήσουμε παρακολούθηση για να παρατηρήσουμε πώς λαμβάνει το `turtlesim_robonomics`.Δεδομένα κατά την άφιξη. Για να το κάνετε αυτό, σε έναν ξεχωριστό τερματικό, εγγραφείτε στο αντίστοιχο θέμα: + +{% codeHelper { copy: true}%} + + ```shell + ros2 topic echo /turtlesim1/robonomics/received_launch + ``` + +{% endcodeHelper %} + +{% roboWikiNote {type: "warning", title: "Launch Param as String"}%} +Η παράμετρος εκκίνησης προσδοκά ένα hash IPFS ενός αρχείου από προεπιλογή. Αν χρειάζεστε το pubsub να χειριστεί την παράμετρο ως κανονική συμβολοσειρά, πρέπει να αλλάξετε την αντίστοιχη παράμετρο κόμβου ROS 2 `launch_is_ipfs` από `True` σε `False`. Μπορείτε να το κάνετε αυτό χρησιμοποιώντας την εντολή `ros2 param set`. + +{% endroboWikiNote %} + +5. Τώρα, πρέπει να καλέσουμε την υπηρεσία ROS 2 για να στείλουμε την εκκίνηση. Σε έναν ξεχωριστό τερματικό, χρησιμοποιήστε την ακόλουθη εντολή: + +{% codeHelper { copy: true}%} + + ```shell + ros2 service call /test/robonomics/send_launch robonomics_ros2_interfaces/srv/RobonomicsROS2SendLaunch {"param: 'turtle_cmd_vel.json', target_address: 'Η ΔΙΕΥΘΥΝΣΗ ΤΟΥ TURTLESIM ΣΑΣ'"} + ``` + +{% endcodeHelper %} + +Θα δείτε τα αρχεία καταγραφής pubsub να εμφανίζουν λεπτομέρειες της υποβολής της εκκίνησης. + +6. Μεταβείτε στον προσομοιωτή Turtlesim. Αφού στείλετε με επιτυχία τη συναλλαγή, η χελώνα πρέπει να ξεκινήσει.Μετακίνηση. Επιπλέον, στα αρχεία καταγραφής του εγγεγραμμένου θέματος, θα πρέπει να βλέπετε πληροφορίες σχετικά με τα ληφθέντα δεδομένα. + + +### Εκκίνηση Turtlesim από Άλλο Κόμβο + +1. Ας δοκιμάσουμε τώρα να δημιουργήσουμε έναν δοκιμαστικό κόμβο που θα περιμένει την εκκίνηση να φτάσει και στη συνέχεια θα την προωθήσει στο Turtlesim. Μπορείτε να χρησιμοποιήσετε το έτοιμο πακέτο δοκιμής `test_robot_robonomics`. Αντιγράψτε αυτό το πακέτο στον χώρο εργασίας ROS 2 σας. + +2. Ανοίξτε το αρχείο κόμβου που βρίσκεται στη διαδρομή `test_robot_robonomics/test_robot_robonomics/test_robot_robonomics_node.py` σε οποιονδήποτε επεξεργαστή κειμένου και προσθέστε τον παρακάτω κώδικα μετά τη λειτουργία `__init__`: + + {% codeHelper { copy: true}%} + + ```python + def launch_file_subscriber_callback(self, msg) -> None: + super().launch_file_subscriber_callback(msg) + + transaction_hash = self.send_launch_request(self.param, target_address='Η ΔΙΕΥΘΥΝΣΗ ΤΟΥ TURTLESIM ΣΑΣ', is_file=True, encrypt_status=True) + + self.get_logger().info('Στάλθηκε εκκίνηση στη χελώνα με hash: %s ' % str(transaction_hash)) + ``` + + {% endcodeHelper %} + + Αυτή η λειτουργία θα επεξεργαστεί πρώτα την ληφθείσα εκκίνηση και στη συνέχεια θα χρησιμοποιήσει την παράμετρό της για να στείλει μια νέα εκκίνηση στο Turtlesim. + +3. Κατασκευάστε το πακέτο χρησιμοποιώντας το `colcon`, και στη συνέχεια πηγαίνετε στα αρχεία ρύθμισης του. + +4. Εκτελέστε το αρχείο εκκίνησης ROS 2 του πακέτου δοκιμής με τα δεύτερα διαπιστευτήρια pubsub: + +{% codeHelper { copy: true}%} + + ```shell + ros2 launch test_robot_robonomics test_robot_robonomics_launch.py pubsub_params_path:=./second_pubsub_params.yaml namespace:='test' + ``` + +{% endcodeHelper %} + +5. Τώρα, στείλτε ένα λανσάρισμα με τις παραμέτρους `turtle_cmd_vel.json` στη διεύθυνση του κόμβου δοκιμής, για παράδειγμα, μέσω της πύλης Polkadot/Substrate. Πριν το κάνετε αυτό, βεβαιωθείτε ότι το Turtlesim εξακολουθεί να λειτουργεί. Ο κόμβος δοκιμής θα πρέπει να λάβει το λανσάρισμα και στη συνέχεια να στείλει ένα νέο με τις ίδιες παραμέτρους, προκαλώντας την κίνηση της χελώνας στο Turtlesim. \ No newline at end of file diff --git a/src/es/docs/ros2-about-wrapper.md b/src/es/docs/ros2-about-wrapper.md new file mode 100644 index 00000000000..dfbe87c11db --- /dev/null +++ b/src/es/docs/ros2-about-wrapper.md @@ -0,0 +1,79 @@ +--- +title: Acerca de Robonomics ROS 2 Wrapper +contributors: [Fingerling42] +tools: + - Ubuntu 22.04.4 + https://releases.ubuntu.com/jammy/ + - ROS 2 Humble + https://docs.ros.org/en/humble/Installation.html + - IPFS Kubo 0.26.0 + https://docs.ipfs.tech/install/command-line/ + - Python 3.10.12 + https://www.python.org/downloads/ +--- + +**En este artículo, aprenderás sobre el paquete Robonomics ROS 2 Wrapper, que te permite utilizar todas las funciones de la paracadena Robonomics para cualquier robot compatible con ROS 2.** + +La idea del paquete es envolver la API de la paracadena Robonomics proporcionada por [robonomics-interface](https://github.com/airalab/robonomics-interface) en nodos de ROS 2. El objetivo es proporcionar a los desarrolladores de ROS 2 una forma conveniente de integrar sus robots o dispositivos con las funciones de la paracadena. La lógica detrás de la integración de un dispositivo robótico es que se crea una dirección única para él en la paracadena Robonomics, que se utiliza para controlar el dispositivo o recibir su telemetría. + +Las funciones disponibles incluyen: + +* **Función de lanzamiento** — lanzar un dispositivo para ejecutar cualquier comando con un conjunto especificado de parámetros pasados como una cadena o un archivo. +* **Función de registro de datos** — publicar datos del dispositivotelemetría en forma de hash a la paracadena. +* **Uso de la suscripción a Robonomics** — la capacidad de enviar transacciones sin cargo. +* **Almacenamiento seguro de archivos** — para empaquetar y desempaquetar datos, se utiliza el [Sistema de Archivos Interplanetario](https://ipfs.tech/), que permite acceder a archivos mediante su hash único. Para un uso conveniente de IPFS, se incluye el soporte de [Pinata](https://www.pinata.cloud/), que permite fijar archivos IPFS para una descarga rápida. +* **Cifrado y descifrado de archivos** — protección de archivos con cifrado de clave pública. + +Actualmente, el envoltorio está disponible en [implementación de Python](https://github.com/airalab/robonomics-ros2/). + +## Arquitectura del Envoltorio + +Arquitectónicamente, el envoltorio consta de un nodo trabajador (con los temas y servicios necesarios) y una clase de nodo básica que se puede utilizar para sus robots específicos. + +{% roboWikiPicture {src:"docs/robotics/robonomics-ros2-wrapper.png", alt:"Arquitectura del Envoltorio ROS 2"} %}{% endroboWikiPicture %} + +* `robonomics_ros2_pubsub` — un nodo único para cada robot que sirve como punto de entrada a Web3. Envuelve los servicios para enviar registros de datos y recibir lanzamientos a través de Robonomics y permite descargar/subir archivos a IPFS. Este nodo está configurado por un archivo especial, que se describe a continuación. La afiliación de un nodo con un robot específico puede seres + +especificado a través del espacio de nombres de ROS. +* `robonomics_ros2_robot_handler` — un nodo específico del robot basado en una clase básica `basic_robonomics_handler` para coordinar pubsub y el robot. Procesa lanzamientos y decide cuándo enviar registros de datos para controlar el robot. + +## Instalando el Envoltorio + +Para trabajar con el envoltorio, necesitas el siguiente software: + +* Distribución del sistema operativo Linux (generalmente, Ubuntu) +* Distribución de ROS 2 +* Nodo IPFS +* Python 3 (para la implementación en Python del envoltorio) + +Por favor, sigue la guía de instalación disponible [aquí](https://github.com/airalab/robonomics-ros2/?tab=readme-ov-file#getting-started) y verifica las versiones necesarias del software. Después de descargar los componentes requeridos, necesitarás [compilar](https://github.com/airalab/robonomics-ros2/?tab=readme-ov-file#installation-and-building) el envoltorio como un paquete ROS 2 habitual utilizando la utilidad `colcon`. + +## Configurando Conexiones a la Nube Web3 + +Antes de iniciar el envoltorio, necesitas configurar cómo se conectará tu robot a la nube descentralizada de Robonomics y a los servicios de soporte Web3. Para hacer esto, necesitas editar el archivo de configuración llamado `robonomics_pubsub_params_template.yaml`, el cual debe ser único para cada robot lanzado que necesite acceder a Robonomics. + +El archivo contiene los siguientes campos de configuración: + +| Campo | Descripción | +|-----------------------|------------------------------------------------------------------------------------------------------------| +| account_seed | Semilla de cuenta de la paracadena de Robonomics | +| crypto_type | Tipo de tu cuenta, `ED25519` o `SR25519` | +| remote_node_url | URL del nodo de Robonomics, el valor predeterminado es `wss://kusama.rpc.robonomics.network`, para un nodo local `ws://127.0.0.1:9944`| +| rws_owner_address | Una dirección del propietario de la suscripción de Robonomics para usar el módulo RWS | +| ipfs_dir_path | Una ruta de directorio para contener archivos IPFS | +| ipfs_gateway | Puerta de enlace de IPFS para descargar archivos, por ejemplo, `https://ipfs.io` | +| pinata_api_key | Clave API de [Pinata](https://www.pinata.cloud/) para el servicio de anclaje de IPFS | +| pinata_api_secret_key | Clave API secreta de [Pinata](https://www.pinata.cloud/) para el servicio de anclaje de IPFS | + +Para crear una cuenta en la paracadena de Robonomics, por favor utiliza [la siguiente guía](https://wiki.robonomics.network/docs/create-account-in-dapp/) en nuestra wiki. Por favor, presta atención al tipo de cuenta que creas, ya que las cuentas con tipo SR25519 no pueden usar cifrado de archivos. + +{% roboWikiNote {type: "warning", title: "Advertencia"}%} + + La frase semilla es información sensible que permite a cualquier personaUtilice su cuenta. Asegúrese de no cargar un archivo de configuración con ella en GitHub o en cualquier otro lugar. +{% endroboWikiNote %} + +Preste atención al campo `remote_node_url`, ya que le permite elegir cómo conectarse exactamente a la paracadena de Robonomics, incluso localmente. Puede implementar su instancia local de Robonomics para pruebas y desarrollo. Las instrucciones sobre cómo hacer esto están disponibles en [este artículo](https://wiki.robonomics.network/docs/run-dev-node/) en nuestra wiki. + +Si tiene una suscripción a Robonomics que le permite enviar transacciones sin comisiones, inserte la dirección del propietario de la suscripción en el campo `rws_owner_address`. No olvide que su cuenta debe estar agregada a su suscripción. Las instrucciones sobre cómo activar su suscripción a Robonomics están disponibles en dos guías: a través de la [aplicación Robonomics](https://wiki.robonomics.network/docs/sub-activate/) con una interfaz fácil de usar o a través del [portal de sustrato de Robonomics](https://wiki.robonomics.network/docs/get-subscription/). + +El parámetro `ipfs_gateway` le permite especificar la puerta de enlace a través de la cual se descargarán los archivos de IPFS. Estas pueden ser [puertas de enlace públicas](https://ipfs.github.io/public-gateway-checker/) o privadas especializadas (por ejemplo, las obtenidas en Pinata) \ No newline at end of file diff --git a/src/es/docs/ros2-launch-robot-cloud.md b/src/es/docs/ros2-launch-robot-cloud.md new file mode 100644 index 00000000000..8d1281e21f1 --- /dev/null +++ b/src/es/docs/ros2-launch-robot-cloud.md @@ -0,0 +1,242 @@ +--- +title: Lanzar Robot desde la Nube +contributors: [Fingerling42] +tools: + - Envoltorio Robonomics ROS 2 3.1.0 + https://github.com/airalab/robonomics-ros2/releases +--- + +**En este artículo, aprenderás cómo utilizar la función de lanzamiento de Robonomics en ROS 2 a través de varios ejemplos** + +La característica clave de la paracadena de Robonomics para enviar comandos a dispositivos es el extrínseco de lanzamiento. Esta función te permite enviar una cadena que contiene un parámetro (en forma de valor hexadecimal de 32 bytes de longitud) a una dirección especificada dentro de la paracadena. Normalmente, la cadena representa un hash de IPFS que apunta a un archivo con los parámetros necesarios para ejecutar el comando. Puedes encontrar más detalles sobre la función de lanzamiento [en este artículo](https://wiki.robonomics.network/docs/launch/). + +En el Envoltorio Robonomics ROS 2, la función de lanzamiento se implementa como un servicio para enviar comandos y como un tema para recibir comandos. + +## Enviando Lanzamiento + +El servicio, llamado `robonomics/send_launch`, se ve de la siguiente manera: + +{% codeHelper { additionalLine: "RobonomicsROS2SendLaunch.srv"} %} + +```YAML +string param # Solo cadena de parámetros o nombre de archivo con parámetros que deben cargarse en IPFS +string target_address # Dirección que se activará con el lanzamiento +bool is_file True # Es un parámetro de lanzamientoun archivo que necesita ser cargado en IPFS (predeterminado es Verdadero)? +bool encrypt_status Verdadero # Verificar si el archivo de parámetros necesita ser encriptado con la dirección objetivo, predeterminado es Verdadero +--- +cadena launch_hash # Hash de la transacción de lanzamiento +``` + +{% endcodeHelper %} + +El servicio acepta los siguientes parámetros como parte de la solicitud: un parámetro de comando (ya sea una cadena simple o el nombre de un archivo que contiene los parámetros del comando), la dirección objetivo en la paracadena de Robonomics para enviar el lanzamiento, y dos indicadores: uno que indica si el parámetro es un archivo, y el otro especificando si el archivo debe ser encriptado (ambos están establecidos en verdadero de forma predeterminada). El archivo se cargará en IPFS, y su hash se pasará como parámetro de lanzamiento. Por lo tanto, el archivo debe colocarse en el directorio designado para archivos IPFS, como se especifica en el archivo de configuración para el nodo `robonomics_ros2_pubsub`. + +Por defecto, el archivo se encripta utilizando la dirección pública del destinatario del lanzamiento. El método de encriptación aplicado es encriptación de clave pública basada en criptografía de curva elíptica Curve25519. En la implementación actual, la encriptación solo es compatible con direcciones de cuenta del tipo ED25519 (Edwards) (puedes leer más al respecto en [este artículo](http://localhost:8080/docs/create-account-in-dapp/#22-create-account)). + +Después de enviar el lanzamiento, el servicio devuelve el hash de la transacción. + +## Recibiendo Lanzamiento + +RecibiendoEl lanzamiento se organiza en forma de un tema correspondiente. Técnicamente, el nodo utiliza la funcionalidad de la interfaz de robonomics para suscribirse al estado de su propia dirección y espera a que aparezca el evento `NewLaunch`. Una vez que ocurre el evento, el nodo publica un mensaje en el tema `robonomics/received_launch`. El formato del mensaje es el siguiente: + +{% codeHelper { additionalLine: "RobonomicsROS2ReceivedLaunch.msg"}%} + +```YAML +string launch_sender_address # Dirección de la cuenta que envió el comando de lanzamiento +string param # Cadena con parámetro o nombre del archivo con parámetros +``` + +{% endcodeHelper %} + +Los campos del mensaje contienen la dirección desde la cual se envió el lanzamiento y el parámetro en sí: ya sea una cadena simple o el nombre del archivo con parámetros que se descargó de IPFS y se colocó en el directorio de trabajo de IPFS. Si el archivo estaba encriptado, se descifra durante este proceso. + + +## Ejemplo con Turtlesim + +A continuación, demostraremos cómo utilizar la función de lanzamiento con [Turtlesim](https://docs.ros.org/en/humble/Tutorials/Beginner-CLI-Tools/Introducing-Turtlesim/Introducing-Turtlesim.html) como ejemplo. Turtlesim es un simulador ligero diseñado para aprender ROS 2. Puedes instalarlo utilizando el siguiente comando: + +{% codeHelper { copy: true}%} + +```shell +sudo apt install ros-$ROS_DISTRO-turtlesim +``` + +{% endcodeHelper %} + +El paquete Robonomics ROS 2 Wrapper incluye un paquete preconstruido llamado `turtlesim_robonomics`, específicamente adaptado para Turtlesim. Este paquete te permite probar todas las funciones del envoltorio. Vamos a intentarlo y ejecutarlo. + +{% roboWikiNote {type: "warning", title: "Advertencia"}%} + + Por favor, asegúrate de tener suficiente saldo en tu cuenta o una suscripción activa para realizar transacciones. + +{% endroboWikiNote %} + +1. Para empezar, crea un archivo de configuración para la instancia pubsub de `turtlesim_robonomics` utilizando la plantilla `config/robonomics_pubsub_params_template.yaml`. Completa los campos apropiados con tus credenciales de Robonomics (semilla de cuenta, tipo de criptomoneda, dirección del propietario de la suscripción). Además, especifica un directorio para los archivos de IPFS. Una vez completado, renombra el archivo, por ejemplo, `first_pubsub_params.yaml`. + +2. Inicia el Demonio de IPFS: + +{% codeHelper { copy: true}%} + +```shell +ipfs daemon +``` + +{% endcodeHelper %} + +3. Ejecuta el siguiente archivo de lanzamiento de ROS 2. Iniciará todos los nodos necesarios: Turtlesim en sí, la implementación del envoltorio para Turtlesim y el pubsub de Robonomics: + +{% codeHelper { copy: true}%} + +```shell +ros2 launch turtlesim_robonomics turtlesim_robonomics_launch.py pubsub_params_path:=./first_pubsub_params```.yaml namespace:='turtlesim1' +``` + +{% endcodeHelper %} + +Verás el simulador con la tortuga, junto con los registros de ROS 2 en la consola que muestran la ID de IPFS, la ruta al directorio con archivos IPFS, la dirección de Robonomics y otra información relevante. + +### Iniciar Turtlesim desde el portal de Polkadot + +1. Turtlesim se controla a través del tema `/cmd_vel`, por lo que necesitas preparar los mensajes correspondientes e incluirlos en un archivo, que se utilizará como parámetro de inicio. Para mayor comodidad, estos mensajes se preparan en un archivo JSON. Crea un archivo (por ejemplo, `turtle_cmd_vel.json`) y pega lo siguiente: + + {% codeHelper { copy: true}%} + + ```json + [ + { + "linear": { + "x": 5.0, + "y": 0.0, + "z": 0.0 + }, + "angular": { + "x": 0.0, + "y": 0.0, + "z": 1.5 + } + }, + { + "linear": { + "x": 2.0, + "y": 0.0, + "z": 0.0 + }, + "angular": { + "x": 0.0, + "y": 0.0, + "z": 2.5 + } +``` } + ] + ``` + + {% endcodeHelper %} + + Este ejemplo JSON ordenará a la tortuga que se mueva dos veces. + +2. A continuación, el archivo debe ser cargado en IPFS. Puedes elegir cualquier método, pero para este ejemplo, utilizaremos IPFS Kubo. Abre una terminal en el directorio donde se encuentra el archivo JSON y cárgalo en IPFS: + + {% codeHelper { copy: true}%} + + ```shell + ipfs add turtle_cmd_vel.json + ``` + + {% endcodeHelper %} + + Recibirás el hash de IPFS del archivo. Asegúrate de guardarlo para usarlo más tarde. + +3. Antes de enviar el lanzamiento, el hash de IPFS debe convertirse en una cadena de 32 bytes de longitud. Esto se puede hacer usando algunos comandos de Python. Abre una terminal, inicia el intérprete de Python 3 y ejecuta los siguientes comandos: + + {% codeHelper { copy: true}%} + + ```python + from robonomicsinterface.utils import ipfs_qm_hash_to_32_bytes + ipfs_qm_hash_to_32_bytes('HASH_DEL_ARCHIVO_IPFS') + ``` + + {% endcodeHelper %} + + Guarda la cadena resultante para usarla más tarde. + +4. Abre el portal de Robonomics [Polkadot/Substrate](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fkusama.rpc.robonomics.network%2F#/extrinsics) y navegaDirígete a la pestaña **Desarrolladores** -> **Extrínsecos**. Selecciona el extrínseco `launch` -> `launch(robot, param)`. En el campo `robot`, inserta la dirección de tu robot, y en el campo `param`, inserta la cadena con el hash de IPFS convertido. Envía la transacción. + +5. Ve al simulador Turtlesim. Después de enviar con éxito la transacción, la tortuga debería comenzar a moverse. + +### Iniciar Turtlesim desde las Herramientas de Línea de Comandos de ROS 2 + +1. Ahora intentemos enviar un lanzamiento a Turtlesim desde otro nodo pubsub de ROS 2. Primero, crea otro archivo de configuración (por ejemplo, `second_pubsub_params.yaml`) con credenciales de Robonomics diferentes y un directorio IPFS separado. + +2. En una terminal separada, ejecuta un nuevo nodo `robonomics_ros2_pubsub` utilizando el nuevo archivo de configuración: + + {% codeHelper { copy: true}%} + + ```shell + ros2 run robonomics_ros2_pubsub robonomics_ros2_pubsub --ros-args -r __ns:=/test -p pubsub_params_path:=./second_pubsub_params.yaml + ``` + + {% endcodeHelper %} + +3. Coloca el archivo JSON que contiene los comandos para Turtlesim (`turtle_cmd_vel.json`) en el directorio IPFS del nuevo pubsub. + +4. Antes de enviar el lanzamiento, configuremos la monitorización para observar cómo `turtlesim_robonomics` recibe. datos al llegar. Para hacer esto, en un terminal separado, suscríbete al tema correspondiente: + +{% codeHelper { copy: true}%} + +```shell +ros2 topic echo /turtlesim1/robonomics/received_launch +``` + +{% endcodeHelper %} + +{% roboWikiNote {type: "warning", title: "Launch Param as String"} %}El manejador de lanzamiento espera, por defecto, un hash de IPFS de un archivo como parámetro. Si necesitas que el pubsub maneje el parámetro como una cadena regular, debes cambiar el parámetro del nodo ROS 2 correspondiente `launch_is_ipfs` de `True` a `False`. Puedes hacer esto usando el comando `ros2 param set`. +{% endroboWikiNote %} + +5. Ahora, necesitamos llamar al servicio ROS 2 para enviar el lanzamiento. En un terminal separado, usa el siguiente comando: + +{% codeHelper { copy: true}%} + +```shell +ros2 service call /test/robonomics/send_launch robonomics_ros2_interfaces/srv/RobonomicsROS2SendLaunch {"param: 'turtle_cmd_vel.json', target_address: 'TU_DIRECCIÓN_TURTLESIM'"} +``` + +{% endcodeHelper %} + +Verás los registros del pubsub mostrando detalles del envío del lanzamiento. + +6. Ve al simulador de Turtlesim. Después de enviar la transacción con éxito, la tortuga debería comenzar. + +### Lanzar Turtlesim desde Otro Nodo + +1. Ahora, intentemos crear un nodo de prueba que esperará a que llegue el lanzamiento y luego lo enviará a Turtlesim. Puedes utilizar el paquete de prueba predefinido `test_robot_robonomics`. Copia este paquete a tu espacio de trabajo de ROS 2. + +2. Abre el archivo del nodo ubicado en `test_robot_robonomics/test_robot_robonomics/test_robot_robonomics_node.py` en cualquier editor de texto, y agrega el siguiente código después de la función `__init__`: + + {% codeHelper { copy: true}%} + + ```python + def launch_file_subscriber_callback(self, msg) -> None: + super().launch_file_subscriber_callback(msg) + + transaction_hash = self.send_launch_request(self.param, target_address='TU_DIRECCIÓN_DE_TURTLESIM', is_file=True, encrypt_status=True) + + self.get_logger().info('Se envió el lanzamiento a la tortuga con hash: %s ' % str(transaction_hash)) + ``` + + {% endcodeHelper %} + + Esta función primero procesará el lanzamiento recibido y luego usará su parámetro para enviar un nuevo lanzamiento a Turtlesim. + +3. Construye el paquete usando `colcon`, y luego fuentea sus archivos de configuración. + +4. Ejecuta el archivo de lanzamiento de ROS 2 del paquete de prueba con las credenciales de pubsub secundarias: + +{% codeHelper { copy: true}%} + +```shell +ros2 launch test_robot_robonomics test_robot_robonomics_launch.py pubsub_params_path:=./second_pubsub_params.yaml namespace:='test' +``` + +{% endcodeHelper %} + +5. Ahora, envía un lanzamiento con los parámetros `turtle_cmd_vel.json` a la dirección del nodo de prueba, por ejemplo, a través del portal de Polkadot/Substrate. Antes de hacer esto, asegúrate de que Turtlesim siga en funcionamiento. El nodo de prueba debería recibir el lanzamiento y luego enviar uno nuevo con los mismos parámetros, haciendo que la tortuga en Turtlesim comience a moverse. \ No newline at end of file diff --git a/src/fr/docs/ros2-about-wrapper.md b/src/fr/docs/ros2-about-wrapper.md new file mode 100644 index 00000000000..acba4acb1b4 --- /dev/null +++ b/src/fr/docs/ros2-about-wrapper.md @@ -0,0 +1,77 @@ +--- +title: À propos de l'enveloppe Robonomics ROS 2 +contributors: [Fingerling42] +outils: + - Ubuntu 22.04.4 + https://releases.ubuntu.com/jammy/ + - ROS 2 Humble + https://docs.ros.org/en/humble/Installation.html + - IPFS Kubo 0.26.0 + https://docs.ipfs.tech/install/command-line/ + - Python 3.10.12 + https://www.python.org/downloads/ +--- + +**Dans cet article, vous découvrirez le package Robonomics ROS 2 Wrapper, qui vous permet d'utiliser toutes les fonctionnalités de la parachain Robonomics pour n'importe quel robot compatible avec ROS 2.** + +L'idée du package est d'envelopper l'API de la parachain Robonomics fournie par [robonomics-interface](https://github.com/airalab/robonomics-interface) dans des nœuds de ROS 2. L'objectif est de fournir aux développeurs ROS 2 un moyen pratique d'intégrer leurs robots ou appareils avec les fonctionnalités de la parachain. La logique derrière l'intégration d'un appareil robotique est qu'une adresse unique est créée pour lui dans la parachain Robonomics, qui est utilisée pour contrôler l'appareil ou recevoir sa télémétrie. + +Les fonctionnalités disponibles incluent : + +* **Fonction de lancement** — lancer un appareil pour exécuter n'importe quelle commande avec un ensemble spécifié de paramètres transmis sous forme de chaîne ou de fichier. +* **Fonction de journalisation** — publier des données de l'appareiltélémétrie sous forme de hachage vers la parachain. +* **Utilisation de l'abonnement Robonomics** — la capacité d'envoyer des transactions sans frais. +* **Stockage sécurisé de fichiers** — pour emballer et déballer des données, on utilise le [Système de Fichiers InterPlanétaire](https://ipfs.tech/), qui permet d'accéder aux fichiers par leur hachage unique. Pour une utilisation pratique d'IPFS, le support [Pinata](https://www.pinata.cloud/) est inclus, ce qui permet d'épingler des fichiers IPFS pour un téléchargement rapide. +* **Chiffrement et déchiffrement de fichiers** — protection des fichiers avec un chiffrement à clé publique. + +Actuellement, l'enveloppe est disponible dans [l'implémentation Python](https://github.com/airalab/robonomics-ros2/). + +## Architecture de l'Enveloppe + +Architecturalement, l'enveloppe se compose d'un nœud travailleur (avec les sujets et services nécessaires) et d'une classe de nœud de base qui peut être utilisée pour vos robots spécifiques. + +{% roboWikiPicture {src:"docs/robotics/robonomics-ros2-wrapper.png", alt:"Architecture de l'Enveloppe ROS 2"} %}{% endroboWikiPicture %} + +* `robonomics_ros2_pubsub` — un nœud unique pour chaque robot qui sert de point d'entrée vers Web3. Il enveloppe les services pour l'envoi de journaux de données et la réception de lancements via Robonomics et permet de télécharger/téléverser des fichiers vers IPFS. Ce nœud est configuré par un fichier spécial, qui est décrit ci-dessous. L'affiliation d'un nœud à un robot spécifique peut êtrespécifié via l'espace de noms ROS. +* `robonomics_ros2_robot_handler` — un nœud spécifique au robot basé sur une classe de base `basic_robonomics_handler` pour coordonner la publication/abonnement et le robot. Il traite les lancements et décide quand envoyer des journaux de données pour contrôler le robot. + +## Installation de l'enveloppe + +Pour travailler avec l wrapper, vous avez besoin des logiciels suivants : + +* Distribution du système d'exploitation Linux (généralement, Ubuntu) +* Distribution ROS 2 +* Nœud IPFS +* Python 3 (pour l'implémentation Python de l'enveloppe) + +Veuillez suivre le guide d'installation disponible [ici](https://github.com/airalab/robonomics-ros2/?tab=readme-ov-file#getting-started) et vérifier les versions nécessaires des logiciels. Après avoir téléchargé les composants requis, vous devrez [construire](https://github.com/airalab/robonomics-ros2/?tab=readme-ov-file#installation-and-building) l'enveloppe en tant que package ROS 2 habituel en utilisant l'utilitaire `colcon`. + +## Configuration des connexions au cloud Web3 + +Avant de démarrer l'enveloppe, vous devez configurer comment votre robot se connectera au cloud Robonomics décentralisé et aux services Web3 de support. Pour ce faire, vous devez modifier le fichier d'une configuration appelé `robonomics_pubsub_params_template.yaml`, qui doit être unique pour chaque robot lancé qui doit accéder à Robonomics. + +Le fichier contient les champs de configuration suivants : + +| Champ | Description | +|-----------------------|------------------------------------------------------------------------------------------------------------| +| account_seed | Graine de compte de la parachain Robonomics | +| crypto_type | Type de votre compte, `ED25519` ou `SR25519` | +| remote_node_url | URL du nœud Robonomics, par défaut `wss://kusama.rpc.robonomics.network`, pour un nœud local `ws://127.0.0.1:9944`| +| rws_owner_address | Adresse du propriétaire de l'abonnement Robonomics à utiliser pour le module RWS | +| ipfs_dir_path | Chemin du répertoire contenant les fichiers IPFS | +| ipfs_gateway | Passerelle IPFS pour télécharger des fichiers, par exemple `https://ipfs.io` | +| pinata_api_key | Clé API de [Pinata](https://www.pinata.cloud/) pour le service de mise en cache IPFS | +| pinata_api_secret_key | Clé API secrète de [Pinata](https://www.pinata.cloud/) pour le service de mise en cache IPFS | + +Pour créer un compte sur la parachain Robonomics, veuillez suivre [le guide suivant](https://wiki.robonomics.network/docs/create-account-in-dapp/) sur notre wiki. Veuillez faire attention au type de compte que vous créez, car les comptes de type SR25519 ne peuvent pas utiliser le chiffrement de fichiers. + +{% roboWikiNote {type: "warning", title: "Avertissement"}%} + + La phrase de récupération est une information sensible qui permet à quiconque deUtilisez votre compte. Assurez-vous de ne pas télécharger de fichier de configuration avec sur GitHub ou ailleurs. +{% endroboWikiNote %} + +Faites attention au champ `remote_node_url`, car il vous permet de choisir comment vous connecter exactement à la parachain Robonomics, y compris localement. Vous pouvez déployer votre instance Robonomics locale pour les tests et le développement. Les instructions sur la façon de le faire sont disponibles dans [cet article](https://wiki.robonomics.network/docs/run-dev-node/) sur notre wiki. + +Si vous avez un abonnement Robonomics qui vous permet d'envoyer des transactions sans frais, veuillez insérer l'adresse du propriétaire de l'abonnement dans le champ `rws_owner_address`. N'oubliez pas que votre compte doit être ajouté à votre abonnement. Les instructions sur la façon d'activer votre abonnement Robonomics sont disponibles dans deux guides : via [l'application Robonomics](https://wiki.robonomics.network/docs/sub-activate/) avec une interface conviviale ou via [le portail Robonomics Substrate](https://wiki.robonomics.network/docs/get-subscription/). + +Le paramètre `ipfs_gateway` vous permet de spécifier la passerelle par laquelle les fichiers IPFS seront téléchargés. Il peut s'agir de [passerelles publiques](https://ipfs.github.io/public-gateway-checker/) ou de passerelles privées spécialisées (par exemple, celles obtenues sur Pinata) \ No newline at end of file diff --git a/src/fr/docs/ros2-launch-robot-cloud.md b/src/fr/docs/ros2-launch-robot-cloud.md new file mode 100644 index 00000000000..5c2bc7230af --- /dev/null +++ b/src/fr/docs/ros2-launch-robot-cloud.md @@ -0,0 +1,248 @@ +--- +title: Lancer un robot depuis le cloud +contributors: [Fingerling42] +tools: + - Enveloppeur Robonomics ROS 2 3.1.0 + https://github.com/airalab/robonomics-ros2/releases +--- + +**Dans cet article, vous apprendrez comment utiliser la fonction de lancement de Robonomics dans ROS 2 à travers divers exemples** + +La fonction clé de la parachain Robonomics pour envoyer des commandes aux appareils est l'extrinsèque de lancement. Cette fonction vous permet d'envoyer une chaîne contenant un paramètre (sous forme de valeur hexadécimale longue de 32 octets) à une adresse spécifiée dans la parachain. En général, la chaîne représente un hachage IPFS qui pointe vers un fichier contenant les paramètres nécessaires pour exécuter la commande. Vous pouvez trouver plus de détails sur la fonction de lancement [dans cet article](https://wiki.robonomics.network/docs/launch/). + +Dans l'enveloppeur Robonomics ROS 2, la fonction de lancement est implémentée en tant que service pour envoyer des commandes et en tant que sujet pour recevoir des commandes. + +## Envoi de lancement + +Le service, appelé `robonomics/send_launch`, ressemble à ceci: + +{% codeHelper { additionalLine: "RobonomicsROS2SendLaunch.srv"}%} + +```YAML +string param # Just param string or file name with parameters that need to be uploaded to IPFS +string target_address # Address to be triggered with launch +bool is_file True # Is a launch param```un fichier qui doit être téléchargé sur IPFS (par défaut est True) ? +bool encrypt_status True # Vérifie si le fichier de paramètres doit être chiffré avec l'adresse cible, par défaut est True +--- +string launch_hash # Hachage de la transaction de lancement +``` + +{% endcodeHelper %} + +Le service accepte les paramètres suivants dans le cadre de la demande : un paramètre de commande (soit une simple chaîne de caractères, soit le nom d'un fichier contenant les paramètres de commande), l'adresse cible dans la parachain Robonomics pour l'envoi du lancement, et deux indicateurs : l'un indiquant si le paramètre est un fichier, et l'autre spécifiant si le fichier doit être chiffré (tous deux sont définis sur true par défaut). Le fichier sera téléchargé sur IPFS, et son hachage sera transmis en tant que paramètre de lancement. Par conséquent, le fichier doit être placé dans le répertoire désigné pour les fichiers IPFS, tel que spécifié dans le fichier de configuration du nœud `robonomics_ros2_pubsub`. + +Par défaut, le fichier est chiffré en utilisant l'adresse publique du destinataire du lancement. La méthode de chiffrement appliquée est le chiffrement à clé publique basé sur la cryptographie à courbe elliptique Curve25519. Dans l'implémentation actuelle, le chiffrement est uniquement pris en charge pour les adresses de compte de type ED25519 (Edwards) (vous pouvez en savoir plus à ce sujet dans [cet article](http://localhost:8080/docs/create-account-in-dapp/#22-create-account)). + +Après l'envoi du lancement, le service renvoie le hachage de la transaction. + +## Réception du Lancement + +RéceptionLe lancement est organisé sous la forme d'un sujet correspondant. Techniquement, le nœud utilise la fonctionnalité de l'interface robonomics pour s'abonner à l'état de son propre adresse et attend que l'événement `NewLaunch` apparaisse. Une fois l'événement survenu, le nœud publie un message sur le sujet `robonomics/received_launch`. Le format du message est le suivant: + +{% codeHelper { additionalLine: "RobonomicsROS2ReceivedLaunch.msg"}%} + +```YAML +string launch_sender_address # Adresse du compte ayant envoyé la commande de lancement +string param # Chaîne avec paramètre ou nom du fichier avec les paramètres +``` + +{% endcodeHelper %} + +Les champs du message contiennent l'adresse à partir de laquelle le lancement a été envoyé et le paramètre lui-même : soit une simple chaîne, soit le nom du fichier avec les paramètres qui a été téléchargé depuis IPFS et placé dans le répertoire de travail IPFS. Si le fichier était chiffré, il est déchiffré pendant ce processus. + + +## Exemple avec Turtlesim + +Ensuite, nous allons démontrer comment utiliser la fonction de lancement avec [Turtlesim](https://docs.ros.org/en/humble/Tutorials/Beginner-CLI-Tools/Introducing-Turtlesim/Introducing-Turtlesim.html) comme exemple. Turtlesim est un simulateur léger conçu pour apprendre ROS 2. Vous pouvez l'installer en utilisant la commande suivante: + +{% codeHelper { copy: true}%} + +```shell +sudo apt install ros-$ROS_DISTRO-turtlesim +``` + +{% endcodeHelper %} + +Le package Robonomics ROS 2 Wrapper comprend un package pré-construit appelé `turtlesim_robonomics`, spécifiquement adapté pour Turtlesim. Ce package vous permet de tester toutes les fonctionnalités de l'enveloppe. Essayons de l'exécuter. + +{% roboWikiNote {type: "warning", title: "Avertissement"}%} + + Assurez-vous d'avoir un solde suffisant sur votre compte ou un abonnement actif pour effectuer des transactions. + +{% endroboWikiNote %} + +1. Pour commencer, créez un fichier de configuration pour l'instance pubsub de `turtlesim_robonomics` en utilisant le modèle `config/robonomics_pubsub_params_template.yaml`. Remplissez les champs appropriés avec vos identifiants Robonomics (graine de compte, type de cryptographie, adresse du propriétaire de l'abonnement). Spécifiez également un répertoire pour les fichiers IPFS. Une fois terminé, renommez le fichier, par exemple, `first_pubsub_params.yaml`. + +2. Lancez le démon IPFS : + +{% codeHelper { copy: true}%} + +```shell +ipfs daemon +``` + +{% endcodeHelper %} + +3. Exécutez le fichier de lancement ROS 2 suivant. Il démarrera tous les nœuds nécessaires : Turtlesim lui-même, l'implémentation de l'enveloppe pour Turtlesim et le pubsub Robonomics : + +{% codeHelper { copy: true}%} + +```shell +ros2 launch turtlesim_robonomics turtlesim_robonomics_launch.py pubsub_params_path:=./first_pubsub_params +```.yaml namespace:='turtlesim1' +``` + +{% endcodeHelper %} + +Vous verrez le simulateur avec la tortue, ainsi que les journaux ROS 2 dans la console affichant l'ID IPFS, le chemin du répertoire avec les fichiers IPFS, l'adresse Robonomics, et d'autres informations pertinentes. + +### Lancer Turtlesim depuis le portail Polkadot + +1. Turtlesim est contrôlé via le sujet `/cmd_vel`, vous devez donc préparer les messages correspondants et les inclure dans un fichier, qui sera utilisé comme paramètre de lancement. Pour plus de commodité, ces messages sont préparés dans un fichier JSON. Créez un fichier (par exemple, `turtle_cmd_vel.json`) et collez ce qui suit : + + {% codeHelper { copy: true}%} + + ```json + [ + { + "linear": { + "x": 5.0, + "y": 0.0, + "z": 0.0 + }, + "angular": { + "x": 0.0, + "y": 0.0, + "z": 1.5 + } + }, + { + "linear": { + "x": 2.0, + "y": 0.0, + "z": 0.0 + }, + "angular": { + "x": 0.0, + "y": 0.0, + "z": 2.5 + } +``` } + ] + ``` + + {% endcodeHelper %} + + Cet exemple JSON commandera à la tortue de se déplacer deux fois. + +2. Ensuite, le fichier doit être téléchargé sur IPFS. Vous pouvez choisir n'importe quelle méthode, mais pour cet exemple, nous utiliserons IPFS Kubo. Ouvrez un terminal dans le répertoire où se trouve le fichier JSON et téléchargez-le sur IPFS : + + {% codeHelper { copy: true}%} + + ```shell + ipfs add turtle_cmd_vel.json + ``` + + {% endcodeHelper %} + + Vous recevrez le hachage IPFS du fichier. Assurez-vous de le sauvegarder pour une utilisation ultérieure. + +3. Avant d'envoyer le lancement, le hachage IPFS doit être converti en une chaîne de 32 octets. Cela peut être fait en utilisant quelques commandes Python. Ouvrez un terminal, lancez l'interpréteur Python 3 et exécutez les commandes suivantes : + + {% codeHelper { copy: true}%} + + ```python + from robonomicsinterface.utils import ipfs_qm_hash_to_32_bytes + ipfs_qm_hash_to_32_bytes('IPFS_FILE_HASH') + ``` + + {% endcodeHelper %} + + Sauvegardez la chaîne résultante pour une utilisation ultérieure. + +4. Ouvrez le portail Robonomics [Polkadot/Substrate](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fkusama.rpc.robonomics.network%2F#/extrinsics) et naviguezVers les **Développeurs** -> onglet **Extrinsèques**. Sélectionnez l'extrinsèque `launch` -> `launch(robot, param)`. Dans le champ `robot`, insérez l'adresse de votre robot, et dans le champ `param`, insérez la chaîne avec le hachage IPFS converti. Soumettez la transaction. + + +5. Allez dans le simulateur Turtlesim. Après avoir envoyé avec succès la transaction, la tortue devrait commencer à bouger. + + +### Lancer Turtlesim à partir des outils en ligne de commande ROS 2 + +1. Essayons maintenant d'envoyer un lancement à Turtlesim à partir d'un autre nœud pubsub ROS 2. Tout d'abord, créez un autre fichier de configuration (par exemple, `second_pubsub_params.yaml`) avec des identifiants Robonomics différents et un répertoire IPFS distinct. + +2. Dans un terminal séparé, exécutez un nouveau nœud `robonomics_ros2_pubsub` en utilisant le nouveau fichier de configuration : + + {% codeHelper { copy: true}%} + + ```shell + ros2 run robonomics_ros2_pubsub robonomics_ros2_pubsub --ros-args -r __ns:=/test -p pubsub_params_path:=./second_pubsub_params.yaml + ``` + + {% endcodeHelper %} + +3. Placez le fichier JSON contenant les commandes pour Turtlesim (`turtle_cmd_vel.json`) dans le répertoire IPFS du nouveau pubsub. + +4. Avant d'envoyer le lancement, configurons une surveillance pour observer comment `turtlesim_robonomics` reçoit. données à l'arrivée. Pour ce faire, dans un terminal séparé, abonnez-vous au sujet correspondant : + + {% codeHelper { copy: true}%} + + ```shell + ros2 topic echo /turtlesim1/robonomics/received_launch + ``` + + {% endcodeHelper %} + + {% roboWikiNote {type: "warning", title: "Paramètre de lancement en tant que chaîne de caractères"}%} + + Par défaut, le gestionnaire de lancement attend un hachage IPFS d'un fichier en tant que paramètre. Si vous avez besoin que le pubsub traite le paramètre comme une chaîne de caractères normale, vous devez modifier le paramètre de nœud ROS 2 correspondant `launch_is_ipfs` de `True` à `False`. Vous pouvez le faire en utilisant la commande `ros2 param set`. + + {% endroboWikiNote %} + +5. Maintenant, nous devons appeler le service ROS 2 pour envoyer le lancement. Dans un terminal séparé, utilisez la commande suivante : + + {% codeHelper { copy: true}%} + + ```shell + ros2 service call /test/robonomics/send_launch robonomics_ros2_interfaces/srv/RobonomicsROS2SendLaunch {"param: 'turtle_cmd_vel.json', target_address: 'VOTRE_ADRESSE_TURTLESIM'"} + ``` + + {% endcodeHelper %} + + Vous verrez les journaux pubsub afficher les détails de la soumission du lancement. + +6. Allez dans le simulateur Turtlesim. Après avoir envoyé avec succès la transaction, la tortue devrait commencerDéplacer. De plus, dans les journaux du sujet abonné, vous devriez voir des informations sur les données reçues. + +### Lancer Turtlesim à partir d'un autre nœud + +1. Maintenant, essayons de créer un nœud de test qui attendra que le lancement arrive, puis le transmettra à Turtlesim. Vous pouvez utiliser le package de test prêt à l'emploi `test_robot_robonomics`. Copiez ce package dans votre espace de travail ROS 2. + +2. Ouvrez le fichier du nœud situé à `test_robot_robonomics/test_robot_robonomics/test_robot_robonomics_node.py` dans n'importe quel éditeur de texte, et ajoutez le code suivant après la fonction `__init__` : + + {% codeHelper { copy: true}%} + + ```python + def launch_file_subscriber_callback(self, msg) -> None: + super().launch_file_subscriber_callback(msg) + + transaction_hash = self.send_launch_request(self.param, target_address='VOTRE_ADRESSE_TURTLESIM', is_file=True, encrypt_status=True) + + self.get_logger().info('Lancement envoyé à la tortue avec le hash : %s ' % str(transaction_hash)) + ``` + + {% endcodeHelper %} + + Cette fonction traitera d'abord le lancement reçu, puis utilisera son paramètre pour envoyer un nouveau lancement à Turtlesim. + +3. Construisez le package en utilisant `colcon`, puis sourcez ses fichiers de configuration. + +4. Exécutez le fichier de lancement ROS 2 du package de test avec les deux identifiants pubsub : + + {% codeHelper { copy: true}%} + + ```shell + ros2 launch test_robot_robonomics test_robot_robonomics_launch.py pubsub_params_path:=./second_pubsub_params.yaml namespace:='test' + ``` + + {% endcodeHelper %} + +5. Maintenant, envoyez un lancement avec les paramètres `turtle_cmd_vel.json` à l'adresse du nœud de test, par exemple, via le portail Polkadot/Substrate. Avant de faire cela, assurez-vous que Turtlesim est toujours en cours d'exécution. Le nœud de test devrait recevoir le lancement, puis en envoyer un nouveau avec les mêmes paramètres, ce qui fera bouger la tortue dans Turtlesim. \ No newline at end of file diff --git a/src/it/docs/ros2-about-wrapper.md b/src/it/docs/ros2-about-wrapper.md new file mode 100644 index 00000000000..b2b73e2a7b3 --- /dev/null +++ b/src/it/docs/ros2-about-wrapper.md @@ -0,0 +1,77 @@ +--- +title: Informazioni su Robonomics ROS 2 Wrapper +contributors: [Fingerling42] +strumenti: + - Ubuntu 22.04.4 + https://releases.ubuntu.com/jammy/ + - ROS 2 Humble + https://docs.ros.org/en/humble/Installation.html + - IPFS Kubo 0.26.0 + https://docs.ipfs.tech/install/command-line/ + - Python 3.10.12 + https://www.python.org/downloads/ +--- + +**In questo articolo, imparerai a conoscere il pacchetto Robonomics ROS 2 Wrapper, che ti consente di utilizzare tutte le funzionalità della parachain Robonomics per qualsiasi robot compatibile con ROS 2.** + +L'idea del pacchetto è quella di avvolgere l'API della parachain Robonomics fornita da [robonomics-interface](https://github.com/airalab/robonomics-interface) in nodi di ROS 2. L'obiettivo è fornire ai developer di ROS 2 un modo comodo per integrare i loro robot o dispositivi con le funzionalità della parachain. La logica dietro l'integrazione di un dispositivo robotico è che viene creato un indirizzo univoco per esso nella parachain Robonomics, che viene utilizzato per controllare il dispositivo o ricevere la sua telemetria. + +Le funzionalità disponibili includono: + +* **Funzione di lancio** — avviare un dispositivo per eseguire qualsiasi comando con un insieme specifico di parametri passati come stringa o file. +* **Funzione di registrazione dati** — pubblicazione dei dati del dispositivotelemetria in forma di hash alla parachain. +* **Utilizzo dell'abbonamento a Robonomics** — la capacità di inviare transazioni senza commissioni. +* **Archiviazione sicura dei file** — per comprimere e decomprimere i dati, viene utilizzato [InterPlanetary File System](https://ipfs.tech/), che consente di accedere ai file tramite il loro hash univoco. Per un utilizzo comodo di IPFS, è inclusa il supporto di [Pinata](https://www.pinata.cloud/), che consente di fissare i file IPFS per un download veloce. +* **Crittografia e decrittografia dei file** — protezione dei file con crittografia a chiave pubblica. + +Attualmente, il wrapper è disponibile nell'[implementazione Python](https://github.com/airalab/robonomics-ros2/). + +## Architettura del Wrapper + +Dal punto di vista architetturale, il wrapper è composto da un nodo lavoratore (con i topic e i servizi necessari) e una classe di base del nodo che può essere utilizzata per i vostri robot specifici. + +{% roboWikiPicture {src:"docs/robotics/robonomics-ros2-wrapper.png", alt:"Architettura del Wrapper ROS 2"} %}{% endroboWikiPicture %} + +* `robonomics_ros2_pubsub` — un nodo unico per ogni robot che funge da punto di ingresso a Web3. Avvolge i servizi per l'invio di datalog e la ricezione di lanci tramite Robonomics e consente di scaricare/caricare file su IPFS. Questo nodo è configurato da un file speciale, che viene descritto di seguito. L'affiliazione di un nodo a un robot specifico può esserespecificato tramite lo spazio dei nomi ROS. +* `robonomics_ros2_robot_handler` — un nodo specifico del robot basato su una classe di base `basic_robonomics_handler` per coordinare pubsub e il robot. Elabora i lanci e decide quando inviare i datalog per controllare il robot. + +## Installazione dell'incapsulamento + +Per lavorare con l'incapsulamento è necessario il seguente software: + +* Distribuzione del sistema operativo Linux (di solito, Ubuntu) +* Distribuzione ROS 2 +* Nodo IPFS +* Python 3 (per l'implementazione in Python dell'incapsulamento) + +Si prega di seguire la guida all'installazione disponibile [qui](https://github.com/airalab/robonomics-ros2/?tab=readme-ov-file#getting-started) e controllare le versioni necessarie del software. Dopo aver scaricato i componenti richiesti, sarà necessario [compilare](https://github.com/airalab/robonomics-ros2/?tab=readme-ov-file#installation-and-building) l'incapsulamento come un normale pacchetto ROS 2 utilizzando l'utilità `colcon`. + +## Configurazione delle connessioni al cloud Web3 + +Prima di avviare l'incapsulamento, è necessario configurare come esattamente il tuo robot si collegherà al cloud decentralizzato di Robonomics e ai servizi Web3 di supporto. Per fare ciò, è necessario modificare il file di configurazione chiamato `robonomics_pubsub_params_template.yaml`, che deve essere univoco per ogni robot avviato che ha bisogno di accedere a Robonomics. + +Il file contiene i seguenti campi di configurazione: + +| Campo | Descrizione | +|-----------------------|------------------------------------------------------------------------------------------------------------| +| account_seed | Seme dell'account della parachain di Robonomics | +| crypto_type | Tipo del tuo account, `ED25519` o `SR25519` | +| remote_node_url | URL del nodo Robonomics, di default è `wss://kusama.rpc.robonomics.network`, per il nodo locale `ws://127.0.0.1:9944`| +| rws_owner_address | Un indirizzo del proprietario della sottoscrizione Robonomics da utilizzare per il modulo RWS | +| ipfs_dir_path | Un percorso della directory in cui contenere i file IPFS | +| ipfs_gateway | Gateway IPFS per scaricare i file, ad es. `https://ipfs.io` | +| pinata_api_key | Chiave API da [Pinata](https://www.pinata.cloud/) servizio di pinning per IPFS | +| pinata_api_secret_key | Chiave API segreta da [Pinata](https://www.pinata.cloud/) servizio di pinning per IPFS | + +Per creare un account sulla parachain di Robonomics, utilizza [la seguente guida](https://wiki.robonomics.network/docs/create-account-in-dapp/) sul nostro wiki. Presta attenzione al tipo di account che crei, poiché gli account con tipo SR25519 non possono utilizzare la crittografia dei file. + +{% roboWikiNote {type: "warning", title: "Attenzione"}%} + + La frase seed è un'informazione sensibile che consente a chiunque diUsa il tuo account. Assicurati di non caricare un file di configurazione su GitHub o in qualsiasi altro posto. +{% endroboWikiNote %} + +Presta attenzione al campo `remote_node_url`, poiché ti consente di scegliere come connetterti esattamente alla parachain di Robonomics, anche localmente. Puoi distribuire la tua istanza locale di Robonomics per test e sviluppo. Le istruzioni su come fare ciò sono disponibili in [questo articolo](https://wiki.robonomics.network/docs/run-dev-node/) sul nostro wiki. + +Se hai un abbonamento a Robonomics che ti consente di inviare transazioni senza commissioni, inserisci l'indirizzo del proprietario dell'abbonamento nel campo `rws_owner_address`. Non dimenticare che il tuo account deve essere aggiunto al tuo abbonamento. Le istruzioni su come attivare il tuo abbonamento a Robonomics sono disponibili in due guide: tramite [Robonomics dapp](https://wiki.robonomics.network/docs/sub-activate/) con un'interfaccia utente amichevole o tramite [portale Robonomics Substrate](https://wiki.robonomics.network/docs/get-subscription/). + +Il parametro `ipfs_gateway` ti consente di specificare il gateway attraverso il quale verranno scaricati i file IPFS. Questi possono essere sia [gateway pubblici](https://ipfs.github.io/public-gateway-checker/) che privati specializzati (ad esempio, quelli ottenuti su Pinata) \ No newline at end of file diff --git a/src/it/docs/ros2-launch-robot-cloud.md b/src/it/docs/ros2-launch-robot-cloud.md new file mode 100644 index 00000000000..070e4bad9ec --- /dev/null +++ b/src/it/docs/ros2-launch-robot-cloud.md @@ -0,0 +1,245 @@ +--- +title: Lanciare Robot da Cloud +contributors: [Fingerling42] +strumenti: + - Robonomics ROS 2 Wrapper 3.1.0 + https://github.com/airalab/robonomics-ros2/releases +--- + +**In questo articolo imparerai come utilizzare la funzione di lancio di Robonomics in ROS 2 attraverso vari esempi** + +La caratteristica chiave del parachain di Robonomics per l'invio di comandi ai dispositivi è l'estrinseco di lancio. Questa funzione ti consente di inviare una stringa contenente un parametro (sotto forma di valore esadecimale lungo 32 byte) a un indirizzo specifico all'interno del parachain. Tipicamente, la stringa rappresenta un hash IPFS che punta a un file con i parametri necessari per eseguire il comando. Puoi trovare ulteriori dettagli sulla funzione di lancio [in questo articolo](https://wiki.robonomics.network/docs/launch/). + +Nel Robonomics ROS 2 Wrapper, la funzione di lancio è implementata come un servizio per l'invio di comandi e come un topic per ricevere comandi. + +## Invio del Lancio + +Il servizio, chiamato `robonomics/send_launch`, appare come segue: + +{% codeHelper { additionalLine: "RobonomicsROS2SendLaunch.srv"}%} + +```YAML +string param # Solo stringa di parametro o nome file con parametri da caricare su IPFS +string target_address # Indirizzo da attivare con il lancio +bool is_file True # È un parametro di lancioun file che deve essere caricato su IPFS (impostazione predefinita è True)? +bool encrypt_status True # Verifica se il file parametro deve essere crittografato con l'indirizzo di destinazione, impostazione predefinita è True +--- +string launch_hash # Hash della transazione di lancio +``` + +{% endcodeHelper %} + +Il servizio accetta i seguenti parametri come parte della richiesta: un parametro di comando (sia una stringa semplice che il nome di un file contenente i parametri del comando), l'indirizzo di destinazione nella parachain Robonomics per l'invio del lancio e due flag: uno che indica se il parametro è un file e l'altro che specifica se il file dovrebbe essere crittografato (entrambi impostati su true per impostazione predefinita). Il file verrà caricato su IPFS e il suo hash verrà passato come parametro di lancio. Pertanto, il file deve essere posizionato nella directory designata per i file IPFS, come specificato nel file di configurazione per il nodo `robonomics_ros2_pubsub`. + +Per impostazione predefinita, il file viene crittografato utilizzando l'indirizzo pubblico del destinatario del lancio. Il metodo di crittografia applicato è la crittografia a chiave pubblica basata sulla crittografia ellittica della curva Curve25519. Nell'implementazione attuale, la crittografia è supportata solo per gli indirizzi degli account di tipo ED25519 (Edwards) (puoi leggere di più su questo in [questo articolo](http://localhost:8080/docs/create-account-in-dapp/#22-create-account)). + +Dopo aver inviato il lancio, il servizio restituisce l'hash della transazione. + +## Ricezione del Lancio + +RicezioneIl lancio è organizzato sotto forma di argomento corrispondente. Tecnicamente, il nodo utilizza la funzionalità dell'interfaccia robonomics per iscriversi allo stato del proprio indirizzo e attende che l'evento `NewLaunch` appaia. Una volta verificatosi l'evento, il nodo pubblica un messaggio sull'argomento `robonomics/received_launch`. Il formato del messaggio è il seguente: + +{% codeHelper { additionalLine: "RobonomicsROS2ReceivedLaunch.msg"}%} + +```YAML +string launch_sender_address # Indirizzo dell'account che ha inviato il comando di lancio +string param # Stringa con parametro o nome del file con i parametri +``` + +{% endcodeHelper %} + +I campi del messaggio contengono l'indirizzo da cui è stato inviato il lancio e il parametro stesso: o una semplice stringa o il nome del file con i parametri che è stato scaricato da IPFS e posizionato nella directory di lavoro di IPFS. Se il file era criptato, viene decifrato durante questo processo. + + +## Esempio con Turtlesim + +Successivamente, mostreremo come utilizzare la funzione di lancio con [Turtlesim](https://docs.ros.org/en/humble/Tutorials/Beginner-CLI-Tools/Introducing-Turtlesim/Introducing-Turtlesim.html) come esempio. Turtlesim è un simulatore leggero progettato per apprendere ROS 2. Puoi installarlo utilizzando il seguente comando: + +{% codeHelper { copy: true}%} + +```shell +sudo apt install ros-$ROS_DISTRO-turtlesim +``` + +{% endcodeHelper %} + +Il pacchetto Robonomics ROS 2 Wrapper include un pacchetto pre-costruito chiamato `turtlesim_robonomics`, appositamente adattato per Turtlesim. Questo pacchetto ti consente di testare tutte le funzionalità del wrapper. Proviamolo e facciamolo girare. + +{% roboWikiNote {type: "warning", title: "Attenzione"}%} + + Assicurati di avere un saldo sufficiente nel tuo account o una sottoscrizione attiva per effettuare transazioni. + +{% endroboWikiNote %} + +1. Per iniziare, crea un file di configurazione per l'istanza pubsub di `turtlesim_robonomics` utilizzando il modello `config/robonomics_pubsub_params_template.yaml`. Compila i campi appropriati con le tue credenziali Robonomics (seed dell'account, tipo di crittografia, indirizzo del proprietario della sottoscrizione). Specifica anche una directory per i file IPFS. Una volta completato, rinomina il file, ad esempio, `first_pubsub_params.yaml`. + +2. Avvia il demone IPFS: + +{% codeHelper { copy: true}%} + +```shell +ipfs daemon +``` + +{% endcodeHelper %} + +3. Esegui il seguente file di lancio ROS 2. Avvierà tutti i nodi necessari: Turtlesim stesso, l'implementazione del wrapper per Turtlesim e il Robonomics pubsub: + +{% codeHelper { copy: true}%} + +```shell +ros2 launch turtlesim_robonomics turtlesim_robonomics_launch.py pubsub_params_path:=./first_pubsub_params +```.yaml namespace:='turtlesim1' +``` + +{% endcodeHelper %} + +Vedrai il simulatore con la tartaruga, insieme ai log di ROS 2 nella console che mostrano l'ID IPFS, il percorso della directory con i file IPFS, l'indirizzo Robonomics e altre informazioni rilevanti. + +### Avvia Turtlesim dal portale Polkadot + +1. Turtlesim è controllato tramite il topic `/cmd_vel`, quindi è necessario preparare i messaggi corrispondenti e includerli in un file, che verrà utilizzato come parametro di avvio. Per comodità, questi messaggi sono preparati in un file JSON. Crea un file (ad esempio, `turtle_cmd_vel.json`) e incolla quanto segue: + + {% codeHelper { copy: true}%} + + ```json + [ + { + "linear": { + "x": 5.0, + "y": 0.0, + "z": 0.0 + }, + "angular": { + "x": 0.0, + "y": 0.0, + "z": 1.5 + } + }, + { + "linear": { + "x": 2.0, + "y": 0.0, + "z": 0.0 + }, + "angular": { + "x": 0.0, + "y": 0.0, + "z": 2.5 + } +``` } + ] + ``` + + {% endcodeHelper %} + + Questo esempio JSON comanderà alla tartaruga di muoversi due volte. + +2. Successivamente, il file deve essere caricato su IPFS. Puoi scegliere qualsiasi metodo, ma per questo esempio utilizzeremo IPFS Kubo. Apri un terminale nella directory in cui si trova il file JSON e caricalo su IPFS: + + {% codeHelper { copy: true}%} + + ```shell + ipfs add turtle_cmd_vel.json + ``` + + {% endcodeHelper %} + + Riceverai l'hash IPFS del file. Assicurati di salvarlo per un uso futuro. + +3. Prima di inviare il lancio, l'hash IPFS deve essere convertito in una stringa lunga 32 byte. Questo può essere fatto utilizzando alcuni comandi Python. Apri un terminale, avvia l'interprete Python 3 e esegui i seguenti comandi: + + {% codeHelper { copy: true}%} + + ```python + from robonomicsinterface.utils import ipfs_qm_hash_to_32_bytes + ipfs_qm_hash_to_32_bytes('IPFS_FILE_HASH') + ``` + + {% endcodeHelper %} + + Salva la stringa risultante per un uso futuro. + +4. Apri il portale Robonomics [Polkadot/Substrate](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fkusama.rpc.robonomics.network%2F#/extrinsics) e navigaVai alla scheda **Sviluppatori** -> **Estrinseci**. Seleziona l'estrinseco `launch` -> `launch(robot, param)`. Nel campo `robot`, inserisci l'indirizzo del tuo robot e nel campo `param`, inserisci la stringa con l'hash IPFS convertito. Invia la transazione. + +5. Vai al simulatore Turtlesim. Dopo aver inviato con successo la transazione, la tartaruga dovrebbe iniziare a muoversi. + +### Avvia Turtlesim dai Strumenti a Linea di Comando di ROS 2 + +1. Ora proviamo a inviare un lancio a Turtlesim da un altro nodo pubsub di ROS 2. Per prima cosa, crea un altro file di configurazione (ad esempio, `second_pubsub_params.yaml`) con credenziali Robonomics diverse e una directory IPFS separata. + +2. In un terminale separato, esegui un nuovo nodo `robonomics_ros2_pubsub` utilizzando il nuovo file di configurazione: + + {% codeHelper { copy: true}%} + + ```shell + ros2 run robonomics_ros2_pubsub robonomics_ros2_pubsub --ros-args -r __ns:=/test -p pubsub_params_path:=./second_pubsub_params.yaml + ``` + + {% endcodeHelper %} + +3. Posiziona il file JSON contenente i comandi per Turtlesim (`turtle_cmd_vel.json`) nella directory IPFS del nuovo pubsub. + +4. Prima di inviare il lancio, impostiamo il monitoraggio per osservare come `turtlesim_robonomics` riceve. dati all'arrivo. Per farlo, in un terminale separato, iscriviti al topic corrispondente: + +{% codeHelper { copy: true}%} + +```shell +ros2 topic echo /turtlesim1/robonomics/received_launch +``` + +{% endcodeHelper %} + +{% roboWikiNote {type: "warning", title: "Launch Param as String"} %} +Modifica predefinita, il gestore di lancio si aspetta un hash IPFS di un file come parametro. Se hai bisogno che il pubsub gestisca il parametro come una stringa regolare, devi modificare il parametro del nodo ROS 2 corrispondente `launch_is_ipfs` da `True` a `False`. Puoi farlo utilizzando il comando `ros2 param set`. +{% endroboWikiNote %} + + +5. Ora, dobbiamo chiamare il servizio ROS 2 per inviare il lancio. In un terminale separato, utilizza il seguente comando: + +{% codeHelper { copy: true}%} + +```shell +ros2 service call /test/robonomics/send_launch robonomics_ros2_interfaces/srv/RobonomicsROS2SendLaunch {"param: 'turtle_cmd_vel.json', target_address: 'IL TUO INDIRIZZO TURTLESIM'"} +``` + +{% endcodeHelper %} + +Vedrai i log del pubsub che mostrano i dettagli dell'invio del lancio. + +6. Vai al simulatore Turtlesim. Dopo aver inviato con successo la transazione, la tartaruga dovrebbe iniziare. + +### Avviare Turtlesim da un Altro Nodo + +1. Ora, proviamo a creare un nodo di test che aspetterà che il lancio arrivi e poi lo inoltrerà a Turtlesim. Puoi utilizzare il pacchetto di test predefinito `test_robot_robonomics`. Copia questo pacchetto nel tuo spazio di lavoro ROS 2. + +2. Apri il file del nodo situato in `test_robot_robonomics/test_robot_robonomics/test_robot_robonomics_node.py` in un qualsiasi editor di testo, e aggiungi il seguente codice dopo la funzione `__init__`: + + {% codeHelper { copy: true}%} + + ```python + def launch_file_subscriber_callback(self, msg) -> None: + super().launch_file_subscriber_callback(msg) + + transaction_hash = self.send_launch_request(self.param, target_address='INDIRIZZO_TURTLESIM', is_file=True, encrypt_status=True) + + self.get_logger().info('Inviato il lancio alla tartaruga con hash: %s ' % str(transaction_hash)) + ``` + + {% endcodeHelper %} + + Questa funzione elaborerà prima il lancio ricevuto e poi utilizzerà il suo parametro per inviare un nuovo lancio a Turtlesim. + +3. Costruisci il pacchetto utilizzando `colcon`, e poi sorgente i suoi file di configurazione. + +4. Esegui il file di lancio ROS 2 del pacchetto di test con le credenziali pubsub del secondo: + + {% codeHelper { copy: true}%} + + ```shell + ros2 launch test_robot_robonomics test_robot_robonomics_launch.py pubsub_params_path:=./second_pubsub_params.yaml namespace:='test' + ``` + + {% endcodeHelper %} + +5. Ora, invia un lancio con i parametri `turtle_cmd_vel.json` all'indirizzo del nodo di test, ad esempio, tramite il portale Polkadot/Substrate. Prima di farlo, assicurati che Turtlesim sia ancora in esecuzione. Il nodo di test dovrebbe ricevere il lancio e quindi inviarne uno nuovo con gli stessi parametri, facendo in modo che la tartaruga in Turtlesim inizi a muoversi. \ No newline at end of file diff --git a/src/ja/docs/ros2-about-wrapper.md b/src/ja/docs/ros2-about-wrapper.md new file mode 100644 index 00000000000..06ef895cb66 --- /dev/null +++ b/src/ja/docs/ros2-about-wrapper.md @@ -0,0 +1,77 @@ +--- +title: Robonomics ROS 2 Wrapperについて +contributors: [Fingerling42] +tools: + - Ubuntu 22.04.4 + https://releases.ubuntu.com/jammy/ + - ROS 2 Humble + https://docs.ros.org/en/humble/Installation.html + - IPFS Kubo 0.26.0 + https://docs.ipfs.tech/install/command-line/ + - Python 3.10.12 + https://www.python.org/downloads/ +--- + +**この記事では、Robonomics ROS 2 Wrapperパッケージについて学びます。このパッケージは、Robonomicsパラチェーンのすべての機能をROS 2互換のロボットで使用できるようにします。** + +このパッケージのアイデアは、[robonomics-interface](https://github.com/airalab/robonomics-interface)が提供するRobonomicsパラチェーンAPIをROS 2のノードにラップすることです。目標は、ROS 2開発者にロボットやデバイスをパラチェーンの機能と簡単に統合する方法を提供することです。ロボットデバイスの統合の背後にあるロジックは、Robonomicsパラチェーンでそのデバイス用に一意のアドレスが作成され、そのデバイスを制御したりテレメトリを受信したりするために使用されることです。 + +利用可能な機能には次のものがあります: + +* **Launch function** — 指定されたパラメータを文字列またはファイルとして渡して任意のコマンドを実行するデバイスを起動します。 +* **Datalog function** — デバイスを公開しますハッシュ形式のテレメトリをパラチェーンに送信します。 +* **Robonomicsサブスクリプションの使用** — 手数料なしでトランザクションを送信する機能。 +* **安全なファイルストレージ** — データのパッキングおよびアンパッキングには、ファイルに一意のハッシュでアクセスできるようにする[InterPlanetary File System](https://ipfs.tech/)が使用されます。IPFSの便利な使用のために、[Pinata](https://www.pinata.cloud/)のサポートが含まれており、IPFSファイルを高速にダウンロードするためにピン留めできます。 +* **ファイルの暗号化と復号** — ファイルの公開鍵暗号化による保護。 + +現在、このラッパーは[Pythonの実装](https://github.com/airalab/robonomics-ros2/)で利用可能です。 + +## ラッパーアーキテクチャ + +アーキテクチャ的には、ラッパーはワーカーノード(必要なトピックとサービスを備えたもの)と、特定のロボットに使用できる基本ノードクラスで構成されています。 + +{% roboWikiPicture {src:"docs/robotics/robonomics-ros2-wrapper.png", alt:"ROS 2 Wrapper Architecture"} %}{% endroboWikiPicture %} + +* `robonomics_ros2_pubsub` — Robonomicsを介してデータログを送信し、ローンチを受信するためのサービスをラップし、IPFSへのファイルのダウンロード/アップロードを可能にする各ロボット用のユニークなノードです。このノードは、以下で説明されている特別なファイルによって構成されます。ノードが特定のロボットと関連付けられることができます。ROSネームスペースを介して指定されます。 +* `robonomics_ros2_robot_handler` — ロボット固有のノードで、pubsubとロボットを調整するための基本クラス `basic_robonomics_handler` に基づいています。ロボットの制御のためにデータログを送信するタイミングを決定し、起動を処理します。 + +## ラッパーのインストール + +ラッパーを使用するには、次のソフトウェアが必要です: + +* Linux OSディストリビューション(通常、Ubuntu) +* ROS 2ディストリビューション +* IPFSノード +* Python 3(ラッパーのPython実装用) + +インストールガイドに従って、[こちら](https://github.com/airalab/robonomics-ros2/?tab=readme-ov-file#getting-started) で利用可能なソフトウェアの必要なバージョンを確認してください。必要なコンポーネントをダウンロードした後、`colcon` ユーティリティを使用して、ラッパーを通常のROS 2パッケージとしてビルドする必要があります。 + +## Web3クラウドへの接続の構成 + +ラッパーを開始する前に、ロボットが分散型RobonomicsクラウドおよびWeb3サービスをサポートする方法を設定する必要があります。これを行うには、`robonomics_pubsub_params_template.yaml` という構成ファイルを編集する必要があります。このファイルは、Robonomicsにアクセスする必要がある各起動されたロボットごとに一意である必要があります。 + +ファイルには、次の構成フィールドが含まれています: + +| フィールド | 説明 | +|-----------------------|------------------------------------------------------------------------------------------------------------| +| account_seed | Robonomicsパラチェーンのアカウントシード | +| crypto_type | アカウントのタイプ、`ED25519`または`SR25519` | +| remote_node_url | RobonomicsノードのURL、デフォルトは`wss://kusama.rpc.robonomics.network`、ローカルノードの場合は`ws://127.0.0.1:9944`| +| rws_owner_address | RWSモジュールを使用するRobonomicsサブスクリプション所有者のアドレス | +| ipfs_dir_path | IPFSファイルを含むディレクトリのパス | +| ipfs_gateway | ファイルをダウンロードするIPFSゲートウェイ、例:`https://ipfs.io` | +| pinata_api_key | IPFSのための[Pinata](https://www.pinata.cloud/)ピニングサービスのAPIキー | +| pinata_api_secret_key | IPFSのための[Pinata](https://www.pinata.cloud/)ピニングサービスの秘密APIキー | + +Robonomicsパラチェーンでアカウントを作成するには、当社のウィキにある[次のガイド](https://wiki.robonomics.network/docs/create-account-in-dapp/)をご利用ください。作成するアカウントのタイプに注意してください。SR25519タイプのアカウントはファイルの暗号化を使用できません。 + +{% roboWikiNote {type: "warning", title: "警告"}%} + + シードフレーズは誰でもアカウントにアクセスできるようにする機密情報です。アカウントを使用してください。GitHubや他の場所に構成ファイルをアップロードしないように注意してください。 +{% endroboWikiNote %} + +`remote_node_url` フィールドに注意してください。これにより、Robonomicsパラチェーンにどのように接続するかを選択できます。ローカルを含む、Robonomicsのインスタンスをテストや開発のために展開することができます。これについての手順は、[この記事](https://wiki.robonomics.network/docs/run-dev-node/) でご覧いただけます。 + +手数料なしでトランザクションを送信できるRobonomicsサブスクリプションをお持ちの場合は、`rws_owner_address` フィールドにサブスクリプション所有者のアドレスを挿入してください。アカウントがサブスクリプションに追加されている必要があることを忘れないでください。Robonomicsサブスクリプションをアクティブ化する手順については、2つのガイドでご利用いただけます:[Robonomics dapp](https://wiki.robonomics.network/docs/sub-activate/) を使用したユーザーフレンドリーなインターフェースを介して、または [Robonomics Substrate portal](https://wiki.robonomics.network/docs/get-subscription/) を介して。 + +`ipfs_gateway` パラメーターを使用すると、IPFSファイルがダウンロードされるゲートウェイを指定できます。これには、[public gateways](https://ipfs.github.io/public-gateway-checker/) や専門のプライベートゲートウェイ(たとえば、Pinataで取得したもの)が含まれます。 \ No newline at end of file diff --git a/src/ja/docs/ros2-launch-robot-cloud.md b/src/ja/docs/ros2-launch-robot-cloud.md new file mode 100644 index 00000000000..e8f81782f1c --- /dev/null +++ b/src/ja/docs/ros2-launch-robot-cloud.md @@ -0,0 +1,246 @@ +--- +title: クラウドからロボットを起動 +contributors: [Fingerling42] +tools: + - Robonomics ROS 2 Wrapper 3.1.0 + https://github.com/airalab/robonomics-ros2/releases +--- + +**この記事では、さまざまな例を通じてROS 2でRobonomicsの起動機能を使用する方法を学びます** + +デバイスにコマンドを送信するRobonomicsパラチェーンの主要な機能は、起動外的です。この機能を使用すると、パラチェーン内の指定されたアドレスにパラメータ(32バイトの長い16進数値の形式で)を含む文字列を送信できます。通常、文字列は、コマンドを実行するために必要なパラメータを持つファイルを指すIPFSハッシュを表します。起動機能の詳細については、[この記事](https://wiki.robonomics.network/docs/launch/)を参照してください。 + +Robonomics ROS 2 Wrapperでは、起動機能はコマンドを送信するためのサービスとコマンドを受信するためのトピックとして実装されています。 + +## 起動の送信 + +`robonomics/send_launch`と呼ばれるサービスは、次のように見えます: + +{% codeHelper { additionalLine: "RobonomicsROS2SendLaunch.srv"}%} + +```YAML +string param # アップロードするIPFSに必要なパラメータを持つパラメータ文字列またはファイル名 +string target_address # 起動をトリガーするアドレス +bool is_file True # 起動パラメータですファイルをIPFSにアップロードする必要があるか(デフォルトはTrueですか)? +bool encrypt_status True # パラメータファイルを指定されたアドレスで暗号化する必要があるかを確認します。デフォルトはTrueです +--- +string launch_hash # ランチトランザクションのハッシュ +``` + +{% endcodeHelper %} + +このサービスは、リクエストの一部として次のパラメータを受け入れます:コマンドパラメータ(単純な文字列またはコマンドパラメータを含むファイルの名前)、Robonomicsパラチェーン内のターゲットアドレス、および2つのフラグ:1つはパラメータがファイルであるかどうかを示し、もう1つはファイルを暗号化するかどうかを指定します(両方ともデフォルトでtrueに設定されています)。ファイルはIPFSにアップロードされ、そのハッシュがランチパラメータとして渡されます。したがって、ファイルは`robonomics_ros2_pubsub`ノードの構成ファイルで指定されたIPFSファイル用のディレクトリに配置する必要があります。 + +デフォルトでは、ファイルはランチの受信者の公開アドレスを使用して暗号化されます。適用される暗号化メソッドは、Curve25519楕円曲線暗号に基づく公開鍵暗号化です。現在の実装では、暗号化はED25519(エドワーズ)タイプのアカウントアドレスのみサポートされています(これについては[この記事](http://localhost:8080/docs/create-account-in-dapp/#22-create-account)で詳しく読むことができます)。 + +ランチを送信した後、サービスはトランザクションハッシュを返します。 + +## ランチの受信 + +受信launchesは、対応するトピックの形式で構成されています。技術的には、ノードはrobonomics-interface機能を利用して自身のアドレスの状態にサブスクライブし、`NewLaunch`イベントが現れるのを待ちます。イベントが発生すると、ノードは`robonomics/received_launch`トピックにメッセージを公開します。メッセージの形式は以下の通りです: + +{% codeHelper { additionalLine: "RobonomicsROS2ReceivedLaunch.msg"}%} + +```YAML +string launch_sender_address # ランチコマンドを送信したアカウントのアドレス +string param # パラメータまたはパラメータが含まれたファイルの名前を持つ文字列 +``` + +{% endcodeHelper %} + +メッセージフィールドには、ランチが送信されたアドレスとパラメータ自体が含まれます。単純な文字列またはIPFSからダウンロードされ、IPFS作業ディレクトリに配置されたパラメータを持つファイルの名前です。ファイルが暗号化されている場合、このプロセス中に復号化されます。 + + +## Turtlesimを使用した例 + +次に、[Turtlesim](https://docs.ros.org/en/humble/Tutorials/Beginner-CLI-Tools/Introducing-Turtlesim/Introducing-Turtlesim.html)を例として使用したlaunch機能の使用方法を示します。Turtlesimは、ROS 2を学ぶために設計された軽量シミュレータです。次のコマンドを使用してインストールできます: + +{% codeHelper { copy: true}%} + +```shell +sudo apt install ros-$ROS_DISTRO-turtlesim +``` + +{% endcodeHelper %} + +Robonomics ROS 2 Wrapperパッケージには、Turtlesim用に特別に適応された`turtlesim_robonomics`という事前構築されたパッケージが含まれています。このパッケージを使用すると、ラッパーのすべての機能をテストできます。試してみて、実行してみましょう。 + +{% roboWikiNote {type: "warning", title: "警告"}%} + + 取引を行うためには、アカウントに十分な残高があるか、アクティブなサブスクリプションがあることを確認してください。 + +{% endroboWikiNote %} + +1. まず、`config/robonomics_pubsub_params_template.yaml`テンプレートを使用して、`turtlesim_robonomics`のpubsubインスタンスのための構成ファイルを作成します。 Robonomicsの資格情報(アカウントシード、暗号タイプ、サブスクリプション所有者のアドレス)を適切なフィールドに入力します。また、IPFSファイルのディレクトリを指定します。完了したら、ファイル名を変更してください。例えば、`first_pubsub_params.yaml`とします。 + +2. IPFSデーモンを起動します: + +{% codeHelper { copy: true}%} + +```shell +ipfs daemon +``` + +{% endcodeHelper %} + +3. 以下のROS 2のlaunchファイルを実行します。これにより、Turtlesim自体、Turtlesim用のラッパー実装、およびRobonomics pubsubがすべて必要なノードを起動します: + +{% codeHelper { copy: true}%} + +```shell +ros2 launch turtlesim_robonomics turtlesim_robonomics_launch.py pubsub_params_path:=./first_pubsub_params +```.yaml ネームスペース:='turtlesim1' +``` + +{% endcodeHelper %} + +タートルとともにシミュレータが表示され、コンソールにはIPFS ID、IPFSファイルが保存されているディレクトリへのパス、Robonomicsアドレス、その他関連情報が表示されます。 + +### PolkadotポータルからTurtlesimを起動する + +1. Turtlesimは`/cmd_vel`トピックを介して制御されるため、対応するメッセージを準備し、それらをファイルに含めて起動パラメータとして使用する必要があります。便宜上、これらのメッセージはJSONファイルに準備されています。ファイル(たとえば、`turtle_cmd_vel.json`)を作成し、以下を貼り付けます: + + {% codeHelper { copy: true}%} + + ```json + [ + { + "linear": { + "x": 5.0, + "y": 0.0, + "z": 0.0 + }, + "angular": { + "x": 0.0, + "y": 0.0, + "z": 1.5 + } + }, + { + "linear": { + "x": 2.0, + "y": 0.0, + "z": 0.0 + }, + "angular": { + "x": 0.0, + "y": 0.0, + "z": 2.5 + } +``` } + ] + ``` + + {% endcodeHelper %} + + このJSONの例では、亀に2回移動するように命令します。 + +2. 次に、ファイルをIPFSにアップロードする必要があります。方法は何でも選択できますが、この例ではIPFS Kuboを使用します。JSONファイルがあるディレクトリでターミナルを開き、次のコマンドを使用してIPFSにアップロードします: + + {% codeHelper { copy: true}%} + + ```shell + ipfs add turtle_cmd_vel.json + ``` + + {% endcodeHelper %} + + ファイルのIPFSハッシュが表示されます。後で使用するために保存しておいてください。 + +3. ローンチを送信する前に、IPFSハッシュを32バイトの長さの文字列に変換する必要があります。これはいくつかのPythonコマンドを使用して行うことができます。ターミナルを開き、Python 3インタプリタを起動し、次のコマンドを実行します: + + {% codeHelper { copy: true}%} + + ```python + from robonomicsinterface.utils import ipfs_qm_hash_to_32_bytes + ipfs_qm_hash_to_32_bytes('IPFS_FILE_HASH') + ``` + + {% endcodeHelper %} + + 後で使用するために生成された文字列を保存してください。 + +4. Robonomics [Polkadot/Substrate portal](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fkusama.rpc.robonomics.network%2F#/extrinsics) を開き、ナビゲートします。**開発者**→**エクストリンシックス**タブに移動します。エクストリンシックス`launch`→`launch(robot, param)`を選択します。`robot`フィールドには、ロボットのアドレスを挿入し、`param`フィールドには変換されたIPFSハッシュを含む文字列を挿入します。トランザクションを送信します。 + + +5. Turtlesimシミュレータに移動します。トランザクションを正常に送信した後、亀は移動を開始するはずです。 + + +### ROS 2コマンドラインツールからTurtlesimを起動 + +1. 他のROS 2パブサブノードからTurtlesimに起動を送信してみましょう。まず、異なるRobonomicsの資格情報と別のIPFSディレクトリを持つ別の構成ファイル(例:`second_pubsub_params.yaml`)を作成します。 + +2. 別のターミナルで、新しい構成ファイルを使用して`robonomics_ros2_pubsub`ノードを実行します: + + {% codeHelper { copy: true}%} + + ```shell + ros2 run robonomics_ros2_pubsub robonomics_ros2_pubsub --ros-args -r __ns:=/test -p pubsub_params_path:=./second_pubsub_params.yaml + ``` + + {% endcodeHelper %} + +3. 新しいパブサブのIPFSディレクトリにTurtlesimのコマンドを含むJSONファイル(`turtle_cmd_vel.json`)を配置します。 + +4. ランチを送信する前に、`turtlesim_robonomics`がどのように受信するかを観察するためのモニタリングを設定しましょう。データが到着したことを確認するために、対応するトピックにサブスクライブするために別のターミナルで次のコマンドを実行します: + +{% codeHelper { copy: true}%} + +```shell +ros2 topic echo /turtlesim1/robonomics/received_launch +``` + +{% endcodeHelper %} + +{% roboWikiNote {type: "warning", title: "Launch Param as String"}%} +デフォルトでは、起動ハンドラはファイルのIPFSハッシュをパラメータとして期待しています。パブサブがパラメータを通常の文字列として処理する必要がある場合は、対応するROS 2ノードパラメータ `launch_is_ipfs` を `True` から `False` に変更する必要があります。これは `ros2 param set` コマンドを使用して行います。 +{% endroboWikiNote %} + +5. ROS 2サービスを呼び出して起動を送信する必要があります。別のターミナルで次のコマンドを使用します: + +{% codeHelper { copy: true}%} + +```shell +ros2 service call /test/robonomics/send_launch robonomics_ros2_interfaces/srv/RobonomicsROS2SendLaunch {"param: 'turtle_cmd_vel.json', target_address: 'YOUR_TURTLESIM_ADDRESS'"} +``` + +{% endcodeHelper %} + +起動の提出の詳細が表示されるパブサブログが表示されます。 + +6.Turtlesimシミュレータに移動します。トランザクションの送信が成功した後、亀は動き始めるはずです。 + +### 他のノードからTurtlesimを起動 + +1. さて、到着を待ち、それをTurtlesimに転送するテストノードを作成してみましょう。準備が整ったテストパッケージ `test_robot_robonomics` を使用できます。このパッケージをROS 2のワークスペースにコピーします。 + +2. 任意のテキストエディタで `test_robot_robonomics/test_robot_robonomics/test_robot_robonomics_node.py` にあるノードファイルを開き、`__init__` 関数の後に以下のコードを追加します: + + {% codeHelper { copy: true}%} + + ```python + def launch_file_subscriber_callback(self, msg) -> None: + super().launch_file_subscriber_callback(msg) + + transaction_hash = self.send_launch_request(self.param, target_address='YOUR_TURTLESIM_ADDRESS', is_file=True, encrypt_status=True) + + self.get_logger().info('Sent launch to the turtle with hash: %s ' % str(transaction_hash)) + ``` + + {% endcodeHelper %} + + この関数は、まず受信した起動を処理し、そのパラメータを使用して新しい起動をTurtlesimに送信します。 + +3. `colcon` を使用してパッケージをビルドし、そのセットアップファイルをソースにします。 + +4. テストパッケージのROS 2の起動ファイルを、2番目のパブサブ資格情報を使用して実行します: + + {% codeHelper { copy: true}%} + + ```shell + ros2 launch test_robot_robonomics test_robot_robonomics_launch.py pubsub_params_path:=./second_pubsub_params.yaml namespace:='test' + ``` + + {% endcodeHelper %} + +5. 今、例えばPolkadot/Substrateポータルを介して、`turtle_cmd_vel.json`パラメータを持つランチをテストノードのアドレスに送信します。 これを行う前に、Turtlesimがまだ実行されていることを確認してください。 テストノードはランチを受信し、同じパラメータで新しいランチを送信し、Turtlesimの亀が動き始めるはずです。 diff --git a/src/ko/docs/ros2-about-wrapper.md b/src/ko/docs/ros2-about-wrapper.md new file mode 100644 index 00000000000..c10df2f2570 --- /dev/null +++ b/src/ko/docs/ros2-about-wrapper.md @@ -0,0 +1,78 @@ +--- +title: Robonomics ROS 2 Wrapper 소개 +contributors: [Fingerling42] +도구: + - Ubuntu 22.04.4 + https://releases.ubuntu.com/jammy/ + - ROS 2 Humble + https://docs.ros.org/en/humble/Installation.html + - IPFS Kubo 0.26.0 + https://docs.ipfs.tech/install/command-line/ + - Python 3.10.12 + https://www.python.org/downloads/ +--- + +**이 기사에서는 Robonomics ROS 2 Wrapper 패키지에 대해 알아보겠습니다. 이 패키지를 사용하면 Robonomics 파라체인의 모든 기능을 ROS 2 호환 로봇에서 사용할 수 있습니다.** + +이 패키지의 아이디어는 [robonomics-interface](https://github.com/airalab/robonomics-interface)에서 제공하는 Robonomics 파라체인 API를 ROS 2의 노드로 래핑하는 것입니다. 목표는 ROS 2 개발자에게 로봇이나 장치를 파라체인 기능과 편리하게 통합할 수 있는 방법을 제공하는 것입니다. 로봇 장치를 통합하는 논리는 Robonomics 파라체인에 해당 장치를 위한 고유 주소가 생성되며, 이 주소를 사용하여 장치를 제어하거나 텔레메트리를 수신하는 데 사용됩니다. + +사용 가능한 기능은 다음과 같습니다: + +* **Launch function** — 지정된 매개변수 집합을 문자열 또는 파일로 전달하여 장치를 실행하여 임의의 명령을 실행합니다. +* **Datalog function** — 장치를 게시하여텔레메트리를 해시 형태로 패러체인에 전송합니다. +* **Robonomics 구독 사용** — 수수료 없이 트랜잭션을 보낼 수 있는 능력. +* **안전한 파일 저장** — 데이터를 압축하고 해제하기 위해 [InterPlanetary File System](https://ipfs.tech/)을 사용하며, 파일에 고유한 해시를 통해 액세스할 수 있습니다. IPFS의 편리한 사용을 위해 [Pinata](https://www.pinata.cloud/) 지원이 포함되어 있어 IPFS 파일을 빠르게 다운로드할 수 있습니다. +* **파일 암호화 및 복호화** — 공개 키 암호화를 사용하여 파일을 보호합니다. + +현재, 래퍼는 [Python 구현](https://github.com/airalab/robonomics-ros2/)으로 사용할 수 있습니다. + +## 래퍼 아키텍처 + +아키텍처적으로, 래퍼는 필요한 토픽과 서비스를 갖춘 워커 노드와 특정 로봇에 사용할 수 있는 기본 노드 클래스로 구성됩니다. + +{% roboWikiPicture {src:"docs/robotics/robonomics-ros2-wrapper.png", alt:"ROS 2 Wrapper Architecture"} %}{% endroboWikiPicture %} + +* `robonomics_ros2_pubsub` — 각 로봇에 대한 고유한 노드로, Robonomics를 통해 데이터 로그를 보내고 발사를 수신하는 서비스를 래핑하며 IPFS로 파일을 다운로드/업로드할 수 있습니다. 이 노드는 아래에 설명된 특별한 파일에 의해 구성됩니다. 노드의 특정 로봇과의 연관성은ROS 네임스페이스를 통해 지정됩니다. +* `robonomics_ros2_robot_handler` — 로봇별 노드로, 퍼브-섭 및 로봇을 조정하기 위한 `basic_robonomics_handler` 클래스를 기반으로 합니다. 이는 로봇을 제어하기 위해 데이터 로그를 보낼 때의 런치를 처리하고 결정합니다. + +## 래퍼 설치 + +래퍼를 사용하려면 다음 소프트웨어가 필요합니다: + +* 리눅스 OS 배포 (일반적으로 Ubuntu) +* ROS 2 배포 +* IPFS 노드 +* Python 3 (래퍼의 Python 구현을 위해) + +설치 가이드를 [여기](https://github.com/airalab/robonomics-ros2/?tab=readme-ov-file#getting-started)에서 확인하고 필요한 소프트웨어 버전을 확인해 주세요. 필요한 구성 요소를 다운로드한 후, `colcon` 유틸리티를 사용하여 래퍼를 일반적인 ROS 2 패키지로 빌드해야 합니다. + +## Web3 클라우드에 대한 연결 구성 + +래퍼를 시작하기 전에 로봇이 탈중앙화된 Robonomics 클라우드 및 Web3 서비스를 지원하는 방식을 설정해야 합니다. 이를 위해 각 로봇을 시작할 때 고유해야 하는 `robonomics_pubsub_params_template.yaml`이라는 구성 파일을 편집해야 합니다. + +이 파일에는 다음 구성 필드가 포함되어 있습니다: + +| 필드 | 설명 | +|-----------------------|------------------------------------------------------------------------------------------------------------| +| account_seed | Robonomics 파라체인의 계정 시드 | +| crypto_type | 계정 유형, `ED25519` 또는 `SR25519` | +| remote_node_url | Robonomics 노드 URL, 기본값은 `wss://kusama.rpc.robonomics.network`, 로컬 노드의 경우 `ws://127.0.0.1:9944`| +| rws_owner_address | RWS 모듈을 사용하기 위한 Robonomics 구독 소유자의 주소 | +| ipfs_dir_path | IPFS 파일을 포함하는 디렉토리 경로 | +| ipfs_gateway | 파일을 다운로드할 IPFS 게이트웨이, 예: `https://ipfs.io` | +| pinata_api_key | IPFS를 위한 [Pinata](https://www.pinata.cloud/) 핀 서비스의 API 키 | +| pinata_api_secret_key | IPFS를 위한 [Pinata](https://www.pinata.cloud/) 핀 서비스의 비밀 API 키 | + +Robonomics 파라체인에 계정을 생성하려면, [다음 가이드](https://wiki.robonomics.network/docs/create-account-in-dapp/)를 참조하십시오. 생성하는 계정 유형에 주의하십시오. SR25519 유형의 계정은 파일 암호화를 사용할 수 없습니다. + +{% roboWikiNote {type: "warning", title: "경고"}%} + + 시드 문구는 누구나 사용할 수 있는 민감한 정보입니다.계정을 사용하세요. GitHub나 다른 곳에 구성 파일을 업로드하지 않도록 주의하십시오. + +{% endroboWikiNote %} + +`remote_node_url` 필드에 주목하십시오. 이 필드를 통해 로보노믹스 파라체인에 어떻게 연결할지 선택할 수 있습니다. 로컬을 포함한 다양한 방법으로 로보노믹스 파라체인에 연결할 수 있습니다. 테스트 및 개발을 위해 로컬 로보노믹스 인스턴스를 배포할 수 있습니다. 이에 대한 지침은 [이 기사](https://wiki.robonomics.network/docs/run-dev-node/)에서 확인할 수 있습니다. + +수수료 없이 거래를 보낼 수 있는 로보노믹스 구독이 있다면, `rws_owner_address` 필드에 구독 소유자의 주소를 삽입하십시오. 계정이 구독에 추가되어 있어야 함을 잊지 마십시오. 로보노믹스 구독을 활성화하는 방법에 대한 지침은 두 가지 가이드에서 확인할 수 있습니다: [로보노믹스 dapp](https://wiki.robonomics.network/docs/sub-activate/)을 통한 사용자 친화적 인터페이스 또는 [로보노믹스 Substrate 포털](https://wiki.robonomics.network/docs/get-subscription/)을 통해. + +`ipfs_gateway` 매개변수를 사용하여 IPFS 파일을 다운로드할 게이트웨이를 지정할 수 있습니다. 이는 [공개 게이트웨이](https://ipfs.github.io/public-gateway-checker/) 또는 특수화된 개인 게이트웨이(예: Pinata에서 얻은 것)일 수 있습니다. \ No newline at end of file diff --git a/src/ko/docs/ros2-launch-robot-cloud.md b/src/ko/docs/ros2-launch-robot-cloud.md new file mode 100644 index 00000000000..d314eb53cb4 --- /dev/null +++ b/src/ko/docs/ros2-launch-robot-cloud.md @@ -0,0 +1,246 @@ +--- +title: 클라우드에서 로봇 시작 +contributors: [Fingerling42] +tools: + - Robonomics ROS 2 Wrapper 3.1.0 + https://github.com/airalab/robonomics-ros2/releases +--- + +**이 기사에서는 다양한 예제를 통해 ROS 2에서 Robonomics 시작 기능을 사용하는 방법을 배우게 됩니다** + +장치로 명령을 보내기 위한 Robonomics 파라체인의 주요 기능은 시작 extrinsic입니다. 이 함수를 사용하면 32바이트 길이의 16진수 값 형태의 매개변수를 포함한 문자열을 파라체인 내의 지정된 주소로 보낼 수 있습니다. 일반적으로, 이 문자열은 명령을 실행하는 데 필요한 매개변수가 포함된 파일을 가리키는 IPFS 해시를 나타냅니다. 시작 함수에 대한 자세한 내용은 [이 기사](https://wiki.robonomics.network/docs/launch/)에서 확인할 수 있습니다. + +Robonomics ROS 2 Wrapper에서 시작 함수는 명령을 보내는 서비스로 구현되어 있으며 명령을 수신하는 토픽으로 구현되어 있습니다. + +## 시작 보내기 + +`robonomics/send_launch`라는 서비스는 다음과 같이 보입니다: + +{% codeHelper { additionalLine: "RobonomicsROS2SendLaunch.srv"}%} + +```YAML +string param # 업로드해야 하는 IPFS에 매개변수가 포함된 파일 이름 또는 매개변수 문자열 +string target_address # 시작을 트리거할 주소 +bool is_file True # 시작 매개변수인지 여부파일을 IPFS에 업로드해야 하는지 여부 (기본값은 True)? +bool encrypt_status True # 파일이 대상 주소로 암호화되어야 하는지 확인, 기본값은 True +--- +string launch_hash # 런치 트랜잭션의 해시 +``` + +{% endcodeHelper %} + +서비스는 요청의 일부로 다음 매개변수를 허용합니다: 명령 매개변수(단순 문자열 또는 명령 매개변수를 포함하는 파일의 이름), 런치를 보내기 위한 Robonomics 파라체인의 대상 주소, 그리고 두 개의 플래그: 매개변수가 파일인지를 나타내는 것과 파일을 암호화해야 하는지를 지정하는 것(둘 다 기본값은 true로 설정됨). 파일은 IPFS에 업로드되며 해당 해시가 런치 매개변수로 전달됩니다. 따라서 파일은 `robonomics_ros2_pubsub` 노드의 구성 파일에서 지정된 IPFS 파일용 디렉토리에 배치되어야 합니다. + +기본적으로 파일은 런치 수신자의 공개 주소를 사용하여 암호화됩니다. 적용된 암호화 방법은 Curve25519 타원 곡선 암호화를 기반으로 한 공개 키 암호화입니다. 현재 구현에서는 암호화가 ED25519(Edwards) 유형의 계정 주소에 대해서만 지원됩니다(이에 대해 더 읽어보려면 [이 기사](http://localhost:8080/docs/create-account-in-dapp/#22-create-account)를 참조하세요). + +런치를 보낸 후, 서비스는 트랜잭션 해시를 반환합니다. + +## 런치 수신 + +수신발사는 해당 주제 형식으로 구성됩니다. 기술적으로, 노드는 자신의 주소 상태를 구독하기 위해 robonomics-interface 기능을 활용하고 `NewLaunch` 이벤트가 나타날 때까지 기다립니다. 이벤트가 발생하면 노드는 `robonomics/received_launch` 주제에 메시지를 게시합니다. 메시지 형식은 다음과 같습니다: + +{% codeHelper { additionalLine: "RobonomicsROS2ReceivedLaunch.msg"}%} + +```YAML +string launch_sender_address # 발사 명령을 보낸 계정의 주소 +string param # 매개변수 또는 매개변수가 있는 파일 이름의 문자열 +``` + +{% endcodeHelper %} + +메시지 필드에는 발사를 보낸 주소와 매개변수 자체가 포함됩니다: 간단한 문자열 또는 IPFS에서 다운로드하고 IPFS 작업 디렉토리에 배치된 매개변수 파일의 이름입니다. 파일이 암호화되었으면이 프로세스 중에 복호화됩니다. + + +## Turtlesim을 사용한 예제 + +다음으로, [Turtlesim](https://docs.ros.org/en/humble/Tutorials/Beginner-CLI-Tools/Introducing-Turtlesim/Introducing-Turtlesim.html)을 예로 들어 발사 기능을 사용하는 방법을 보여드리겠습니다. Turtlesim은 ROS 2 학습용으로 설계된 가벼운 시뮬레이터입니다. 다음 명령을 사용하여 설치할 수 있습니다: + +{% codeHelper { copy: true}%} + +```shell +sudo apt install ros-$ROS_DISTRO-turtlesim +``` + +{% endcodeHelper %} + +로보노믹스 ROS 2 래퍼 패키지에는 Turtlesim을 위해 특별히 적합한 `turtlesim_robonomics`라는 미리 빌드된 패키지가 포함되어 있습니다. 이 패키지를 사용하면 래퍼의 모든 기능을 테스트할 수 있습니다. 한번 시도해 보고 실행해 봅시다. + +{% roboWikiNote {type: "warning", title: "주의"}%} + + 거래를 수행하려면 계정에 충분한 잔액이나 활성 구독이 있는지 확인하십시오. + +{% endroboWikiNote %} + +1. 먼저 `config/robonomics_pubsub_params_template.yaml` 템플릿을 사용하여 `turtlesim_robonomics`의 pubsub 인스턴스를 위한 구성 파일을 만듭니다. Robonomics 자격 증명(계정 시드, 암호화 유형, 구독 소유자 주소)을 적절히 입력하고 IPFS 파일을 저장할 디렉토리를 지정합니다. 작성이 완료되면 파일 이름을 `first_pubsub_params.yaml`과 같이 변경합니다. + +2. IPFS 데몬을 실행합니다: + +{% codeHelper { copy: true}%} + +```shell +ipfs daemon +``` + +{% endcodeHelper %} + +3. 다음 ROS 2 런치 파일을 실행합니다. 필요한 모든 노드를 시작합니다: Turtlesim 자체, Turtlesim을 위한 래퍼 구현 및 Robonomics pubsub: + +{% codeHelper { copy: true}%} + +```shell +ros2 launch turtlesim_robonomics turtlesim_robonomics_launch.py pubsub_params_path:=./first_pubsub_params +```.yaml namespace:='turtlesim1' +``` + +{% endcodeHelper %} + +거북이와 함께 시뮬레이터를 볼 수 있으며 콘솔에는 IPFS ID, IPFS 파일이 있는 디렉토리 경로, Robonomics 주소 및 기타 관련 정보가 표시됩니다. + +### Polkadot 포털에서 Turtlesim 시작 + +1. Turtlesim은 `/cmd_vel` 토픽을 통해 제어되므로 해당 메시지를 준비하고 이를 런치 매개변수로 사용할 파일에 포함해야 합니다. 편의를 위해 이러한 메시지는 JSON 파일에 준비되어 있습니다. 파일을 생성하고(예: `turtle_cmd_vel.json`) 다음을 붙여넣으세요: + + {% codeHelper { copy: true}%} + + ```json + [ + { + "linear": { + "x": 5.0, + "y": 0.0, + "z": 0.0 + }, + "angular": { + "x": 0.0, + "y": 0.0, + "z": 1.5 + } + }, + { + "linear": { + "x": 2.0, + "y": 0.0, + "z": 0.0 + }, + "angular": { + "x": 0.0, + "y": 0.0, + "z": 2.5 + } +``` } + ] + ``` + + {% endcodeHelper %} + + 이 JSON 예제는 거북이에게 두 번 이동하도록 명령합니다. + +2. 다음으로, 파일을 IPFS에 업로드해야 합니다. 어떤 방법을 선택해도 괜찮지만, 이 예제에서는 IPFS Kubo를 사용할 것입니다. JSON 파일이 있는 디렉토리에서 터미널을 열고 다음 명령을 사용하여 IPFS에 업로드합니다: + + {% codeHelper { copy: true}%} + + ```shell + ipfs add turtle_cmd_vel.json + ``` + + {% endcodeHelper %} + + 파일의 IPFS 해시를 받게 될 것입니다. 나중에 사용할 수 있도록 저장해 두세요. + +3. 발사 전에 IPFS 해시를 32바이트 길이의 문자열로 변환해야 합니다. 이 작업은 몇 가지 Python 명령을 사용하여 수행할 수 있습니다. 터미널을 열고 Python 3 인터프리터를 실행한 다음 다음 명령을 실행하세요: + + {% codeHelper { copy: true}%} + + ```python + from robonomicsinterface.utils import ipfs_qm_hash_to_32_bytes + ipfs_qm_hash_to_32_bytes('IPFS_FILE_HASH') + ``` + + {% endcodeHelper %} + + 결과 문자열을 나중에 사용할 수 있도록 저장하세요. + +4. Robonomics [Polkadot/Substrate portal](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fkusama.rpc.robonomics.network%2F#/extrinsics)을 열고 이동하세요.**개발자** -> **외부** 탭으로 이동하십시오. 외부 `launch` -> `launch(robot, param)`를 선택하십시오. `robot` 필드에 로봇의 주소를 삽입하고, `param` 필드에는 변환된 IPFS 해시가 포함된 문자열을 삽입하십시오. 거래를 제출하십시오. + + +5. Turtlesim 시뮬레이터로 이동하십시오. 거래를 성공적으로 전송한 후 거북이가 움직이기 시작해야 합니다. + + +### ROS 2 명령줄 도구에서 Turtlesim 시작 + +1. 이제 다른 ROS 2 pubsub 노드에서 Turtlesim으로 launch를 보내보겠습니다. 먼저 다른 Robonomics 자격 증명과 별도의 IPFS 디렉토리를 가진 다른 구성 파일(예: `second_pubsub_params.yaml`)을 만드십시오. + +2. 별도의 터미널에서 새로운 구성 파일을 사용하여 `robonomics_ros2_pubsub` 노드를 실행하십시오: + + {% codeHelper { copy: true}%} + + ```shell + ros2 run robonomics_ros2_pubsub robonomics_ros2_pubsub --ros-args -r __ns:=/test -p pubsub_params_path:=./second_pubsub_params.yaml + ``` + + {% endcodeHelper %} + +3. 새 pubsub의 IPFS 디렉토리에 Turtlesim에 대한 명령을 포함하는 JSON 파일(`turtle_cmd_vel.json`)을 배치하십시오. + +4. launch를 보내기 전에 `turtlesim_robonomics`가 어떻게 수신하는지 관찰하기 위해 모니터링을 설정하겠습니다.데이터가 도착하면 확인해야 합니다. 이를 위해 해당 주제를 구독하려면 별도의 터미널에서 다음을 실행하세요: + +{% codeHelper { copy: true}%} + +```shell +ros2 topic echo /turtlesim1/robonomics/received_launch +``` + +{% endcodeHelper %} + +{% roboWikiNote {type: "warning", title: "Launch Param as String"}%} 기본적으로 런치 핸들러는 파일의 IPFS 해시를 매개변수로 예상합니다. 매개변수를 일반 문자열로 처리하려면 ROS 2 노드 매개변수 `launch_is_ipfs`를 `True`에서 `False`로 변경해야 합니다. 이 작업은 `ros2 param set` 명령을 사용하여 수행할 수 있습니다. +{% endroboWikiNote %} + +5. 이제 ROS 2 서비스를 호출하여 런치를 전송해야 합니다. 별도의 터미널에서 다음 명령을 사용하세요: + +{% codeHelper { copy: true}%} + +```shell +ros2 service call /test/robonomics/send_launch robonomics_ros2_interfaces/srv/RobonomicsROS2SendLaunch {"param: 'turtle_cmd_vel.json', target_address: 'YOUR_TURTLESIM_ADDRESS'"} +``` + +{% endcodeHelper %} + +런치 제출의 세부 정보가 표시되는 퍼브서브 로그를 볼 수 있습니다. + +6. Turtlesim 시뮬레이터로 이동하세요. 거래를 성공적으로 전송한 후 거북이가 시작해야합니다.이동합니다. 또한, 구독된 주제의 로그에는 수신된 데이터에 대한 정보가 표시됩니다. + + +### 다른 노드에서 Turtlesim 시작 + +1. 이제 도착을 기다리고 그것을 Turtlesim으로 전달할 테스트 노드를 만들어 봅시다. `test_robot_robonomics`라는 준비된 테스트 패키지를 사용할 수 있습니다. 이 패키지를 ROS 2 작업 공간으로 복사합니다. + +2. 아무 텍스트 편집기에서 `test_robot_robonomics/test_robot_robonomics/test_robot_robonomics_node.py`에 위치한 노드 파일을 열고, `__init__` 함수 뒤에 다음 코드를 추가합니다: + + {% codeHelper { copy: true}%} + + ```python + def launch_file_subscriber_callback(self, msg) -> None: + super().launch_file_subscriber_callback(msg) + + transaction_hash = self.send_launch_request(self.param, target_address='YOUR_TURTLESIM_ADDRESS', is_file=True, encrypt_status=True) + + self.get_logger().info('Sent launch to the turtle with hash: %s ' % str(transaction_hash)) + ``` + + {% endcodeHelper %} + + 이 함수는 먼저 받은 도착을 처리한 다음 해당 매개변수를 사용하여 Turtlesim에 새로운 도착을 보냅니다. + +3. `colcon`을 사용하여 패키지를 빌드하고, 그리고 나서 설정 파일을 소스합니다. + +4. 두 번째 pubsub 자격 증명으로 테스트 패키지의 ROS 2 런치 파일을 실행합니다: + + {% codeHelper { copy: true}%} + + ```shell + ros2 launch test_robot_robonomics test_robot_robonomics_launch.py pubsub_params_path:=./second_pubsub_params.yaml namespace:='test' + ``` + + {% endcodeHelper %} + +5. 이제 `turtle_cmd_vel.json` 매개변수를 테스트 노드의 주소로 보내어 Polkadot/Substrate 포털을 통해 예를 들어 전송하십시오. 이를 하기 전에 Turtlesim이 여전히 실행 중인지 확인하십시오. 테스트 노드는 런치를 받은 다음 동일한 매개변수로 새로운 런치를 보내어 Turtlesim의 거북이가 움직이도록 해야 합니다. \ No newline at end of file diff --git a/src/pt/docs/ros2-about-wrapper.md b/src/pt/docs/ros2-about-wrapper.md new file mode 100644 index 00000000000..3d3c59a19aa --- /dev/null +++ b/src/pt/docs/ros2-about-wrapper.md @@ -0,0 +1,77 @@ +--- +title: Sobre o Robonomics ROS 2 Wrapper +contributors: [Fingerling42] +ferramentas: + - Ubuntu 22.04.4 + https://releases.ubuntu.com/jammy/ + - ROS 2 Humble + https://docs.ros.org/en/humble/Installation.html + - IPFS Kubo 0.26.0 + https://docs.ipfs.tech/install/command-line/ + - Python 3.10.12 + https://www.python.org/downloads/ +--- + +**Neste artigo, você aprenderá sobre o pacote Robonomics ROS 2 Wrapper, que permite que você utilize todos os recursos da parachain Robonomics para qualquer robô compatível com o ROS 2.** + +A ideia do pacote é envolver a API da parachain Robonomics fornecida pelo [robonomics-interface](https://github.com/airalab/robonomics-interface) em nós do ROS 2. O objetivo é fornecer aos desenvolvedores do ROS 2 uma maneira conveniente de integrar seus robôs ou dispositivos com os recursos da parachain. A lógica por trás da integração de um dispositivo robótico é que um endereço único é criado para ele na parachain Robonomics, que é usado para controlar o dispositivo ou receber sua telemetria. + +Os recursos disponíveis incluem: + +* **Função de lançamento** — lançar um dispositivo para executar qualquer comando com um conjunto especificado de parâmetros passados como uma string ou um arquivo. +* **Função de registro de dados** — publicar dados do dispositivotelemetria em forma de hash para parachain. +* **Uso da assinatura Robonomics** — a capacidade de enviar transações sem taxa. +* **Armazenamento seguro de arquivos** — para compactar e descompactar dados, é utilizado o [Sistema de Arquivos Interplanetários](https://ipfs.tech/), que permite acessar arquivos por meio de seu hash único. Para uso conveniente do IPFS, o suporte do [Pinata](https://www.pinata.cloud/) está incluído, o que permite fixar arquivos IPFS para download rápido. +* **Criptografia e descriptografia de arquivos** — proteção de arquivos com criptografia de chave pública. + +Atualmente, o wrapper está disponível na [implementação Python](https://github.com/airalab/robonomics-ros2/). + +## Arquitetura do Wrapper + +Arquitetonicamente, o wrapper consiste em um nó trabalhador (com os tópicos e serviços necessários) e uma classe de nó básica que pode ser usada para seus robôs específicos. + +{% roboWikiPicture {src:"docs/robotics/robonomics-ros2-wrapper.png", alt:"Arquitetura do Wrapper ROS 2"} %}{% endroboWikiPicture %} + +* `robonomics_ros2_pubsub` — um nó único para cada robô que serve como ponto de entrada para o Web3. Ele envolve os serviços para enviar registros de dados e receber lançamentos via Robonomics e permite que arquivos sejam baixados/enviados para o IPFS. Este nó é configurado por um arquivo especial, que é descrito abaixo. A afiliação de um nó a um robô específico pode serespecificado via o namespace do ROS. +* `robonomics_ros2_robot_handler` — um nó específico do robô baseado em uma classe básica `basic_robonomics_handler` para coordenar pubsub e o robô. Ele processa lançamentos e decide quando enviar datalogs para controlar o robô. + +## Instalando o Wrapper + +Para trabalhar com o wrapper, você precisa do seguinte software: + +* Distribuição do sistema operacional Linux (geralmente, Ubuntu) +* Distribuição do ROS 2 +* Nó IPFS +* Python 3 (para a implementação em Python do wrapper) + +Por favor, siga o guia de instalação disponível [aqui](https://github.com/airalab/robonomics-ros2/?tab=readme-ov-file#getting-started) e verifique as versões necessárias do software. Após baixar os componentes necessários, você precisará [compilar](https://github.com/airalab/robonomics-ros2/?tab=readme-ov-file#installation-and-building) o wrapper como um pacote ROS 2 usual usando a utilidade `colcon`. + +## Configurando Conexões com a Nuvem Web3 + +Antes de iniciar o wrapper, você precisa configurar como exatamente seu robô se conectará à nuvem descentralizada Robonomics e aos serviços de suporte Web3. Para fazer isso, você precisa editar o arquivo de configuração chamado `robonomics_pubsub_params_template.yaml`, que deve ser único para cada robô lançado que precisa acessar o Robonomics. + +O arquivo contém os seguintes campos de configuração: + +| Campo | Descrição | +|-----------------------|------------------------------------------------------------------------------------------------------------| +| account_seed | Semente de conta da parachain Robonomics | +| crypto_type | Tipo da sua conta, `ED25519` ou `SR25519` | +| remote_node_url | URL do nó Robonomics, o padrão é `wss://kusama.rpc.robonomics.network`, para nó local `ws://127.0.0.1:9944`| +| rws_owner_address | Um endereço do proprietário da assinatura Robonomics para usar o módulo RWS | +| ipfs_dir_path | Um caminho do diretório para conter arquivos IPFS | +| ipfs_gateway | Gateway IPFS para baixar arquivos, por exemplo, `https://ipfs.io` | +| pinata_api_key | Chave API do serviço de fixação [Pinata](https://www.pinata.cloud/) para IPFS | +| pinata_api_secret_key | Chave secreta da API do serviço de fixação [Pinata](https://www.pinata.cloud/) para IPFS | + +Para criar uma conta na parachain Robonomics, por favor, utilize [o seguinte guia](https://wiki.robonomics.network/docs/create-account-in-dapp/) em nosso wiki. Por favor, preste atenção ao tipo de conta que você cria, pois contas com tipo SR25519 não podem usar criptografia de arquivos. + +{% roboWikiNote {type: "warning", title: "Aviso"}%} + + A frase-semente é uma informação sensível que permite a qualquer pessoaUse sua conta. Certifique-se de não fazer upload de um arquivo de configuração com ela no GitHub ou em qualquer outro lugar. +{% endroboWikiNote %} + +Preste atenção ao campo `remote_node_url`, pois ele permite que você escolha como se conectar à parachain Robonomics, incluindo localmente. Você pode implantar sua instância local do Robonomics para testes e desenvolvimento. As instruções de como fazer isso estão disponíveis neste [artigo](https://wiki.robonomics.network/docs/run-dev-node/) em nosso wiki. + +Se você tiver uma assinatura Robonomics que permite enviar transações sem taxas, insira o endereço do proprietário da assinatura no campo `rws_owner_address`. Não se esqueça de que sua conta deve ser adicionada à sua assinatura. As instruções de como ativar sua assinatura Robonomics estão disponíveis em dois guias: via [Robonomics dapp](https://wiki.robonomics.network/docs/sub-activate/) com interface amigável ou via [portal Robonomics Substrate](https://wiki.robonomics.network/docs/get-subscription/). + +O parâmetro `ipfs_gateway` permite que você especifique o gateway por meio do qual os arquivos IPFS serão baixados. Estes podem ser [gateways públicos](https://ipfs.github.io/public-gateway-checker/) ou privados especializados (por exemplo, aqueles obtidos no Pinata). \ No newline at end of file diff --git a/src/pt/docs/ros2-launch-robot-cloud.md b/src/pt/docs/ros2-launch-robot-cloud.md new file mode 100644 index 00000000000..d5eeddc40e5 --- /dev/null +++ b/src/pt/docs/ros2-launch-robot-cloud.md @@ -0,0 +1,238 @@ +--- +title: Lançar Robô da Nuvem +contributors: [Fingerling42] +tools: + - Robonomics ROS 2 Wrapper 3.1.0 + https://github.com/airalab/robonomics-ros2/releases +--- + +**Neste artigo, você aprenderá como usar a função de lançamento do Robonomics no ROS 2 através de vários exemplos** + +A principal característica da parachain Robonomics para enviar comandos para dispositivos é o extrínseco de lançamento. Essa função permite enviar uma string contendo um parâmetro (na forma de um valor hexadecimal longo de 32 bytes) para um endereço especificado dentro da parachain. Tipicamente, a string representa um hash IPFS que aponta para um arquivo com os parâmetros necessários para executar o comando. Você pode encontrar mais detalhes sobre a função de lançamento [neste artigo](https://wiki.robonomics.network/docs/launch/). + +No Robonomics ROS 2 Wrapper, a função de lançamento é implementada como um serviço para enviar comandos e como um tópico para receber comandos. + +## Enviando Lançamento + +O serviço, chamado `robonomics/send_launch`, parece o seguinte: + +{% codeHelper { additionalLine: "RobonomicsROS2SendLaunch.srv"}%} + +```YAML +string param # Apenas string de parâmetro ou nome de arquivo com parâmetros que precisam ser enviados para o IPFS +string target_address # Endereço a ser acionado com o lançamento +bool is_file True # É um parâmetro de lançamentoum arquivo que precisa ser carregado para o IPFS (padrão é Verdadeiro)? +bool encrypt_status True # Verificar se o arquivo de parâmetro precisa ser criptografado com o endereço de destino, padrão é Verdadeiro +--- +string launch_hash # Hash da transação de lançamento +``` + +{% endcodeHelper %} + +O serviço aceita os seguintes parâmetros como parte da solicitação: um parâmetro de comando (ou uma simples string ou o nome de um arquivo contendo os parâmetros de comando), o endereço de destino na parachain Robonomics para enviar o lançamento e duas flags: uma indicando se o parâmetro é um arquivo e a outra especificando se o arquivo deve ser criptografado (ambos são definidos como verdadeiros por padrão). O arquivo será carregado para o IPFS e seu hash será passado como parâmetro de lançamento. Portanto, o arquivo deve ser colocado no diretório designado para arquivos IPFS, conforme especificado no arquivo de configuração para o nó `robonomics_ros2_pubsub`. + +Por padrão, o arquivo é criptografado usando o endereço público do destinatário do lançamento. O método de criptografia aplicado é criptografia de chave pública baseada na criptografia de curva elíptica Curve25519. Na implementação atual, a criptografia é suportada apenas para endereços de conta do tipo ED25519 (Edwards) (você pode ler mais sobre isso neste [artigo](http://localhost:8080/docs/create-account-in-dapp/#22-create-account)). + +Após enviar o lançamento, o serviço retorna o hash da transação. + +## Recebendo o Lançamento + +RecebendoOs lançamentos são organizados na forma de um tópico correspondente. Tecnicamente, o nó utiliza a funcionalidade robonomics-interface para se inscrever no estado de seu próprio endereço e aguarda o evento `NewLaunch` aparecer. Uma vez que o evento ocorre, o nó publica uma mensagem no tópico `robonomics/received_launch`. O formato da mensagem é o seguinte: + +{% codeHelper { additionalLine: "RobonomicsROS2ReceivedLaunch.msg"}%} +```YAML +string launch_sender_address # Endereço da conta que enviou o comando de lançamento +string param # String com parâmetro ou nome do arquivo com parâmetros +``` +{% endcodeHelper %} + +Os campos da mensagem contêm o endereço de onde o lançamento foi enviado e o parâmetro em si: seja uma string simples ou o nome do arquivo com parâmetros que foi baixado do IPFS e colocado no diretório de trabalho do IPFS. Se o arquivo estiver criptografado, ele é descriptografado durante esse processo. + + +## Exemplo com Turtlesim + +A seguir, demonstraremos como usar a função de lançamento com o [Turtlesim](https://docs.ros.org/en/humble/Tutorials/Beginner-CLI-Tools/Introducing-Turtlesim/Introducing-Turtlesim.html) como exemplo. Turtlesim é um simulador leve projetado para aprender ROS 2. Você pode instalá-lo usando o seguinte comando: + +{% codeHelper { copy: true}%} + +```shell +sudo apt install ros-$ROS_DISTRO-turtlesim +``` + +{% endcodeHelper %} + +O pacote Robonomics ROS 2 Wrapper inclui um pacote pré-construído chamado `turtlesim_robonomics`, especificamente adaptado para Turtlesim. Este pacote permite testar todas as funcionalidades do wrapper. Vamos tentar executá-lo. + +{% roboWikiNote {type: "warning", title: "Aviso"}%}Por favor, certifique-se de ter saldo suficiente em sua conta ou uma assinatura ativa para realizar transações.{% endroboWikiNote %} + +1. Para começar, crie um arquivo de configuração para a instância pubsub de `turtlesim_robonomics` usando o modelo `config/robonomics_pubsub_params_template.yaml`. Preencha os campos apropriados com suas credenciais Robonomics (seed da conta, tipo de criptomoeda, endereço do proprietário da assinatura). Além disso, especifique um diretório para os arquivos IPFS. Uma vez concluído, renomeie o arquivo, por exemplo, `first_pubsub_params.yaml`. + +2. Inicie o Daemon IPFS: + +{% codeHelper { copy: true}%} + +```shell +ipfs daemon +``` + +{% endcodeHelper %} + +3. Execute o seguinte arquivo de lançamento do ROS 2. Ele iniciará todos os nós necessários: o próprio Turtlesim, a implementação do wrapper para Turtlesim e o Robonomics pubsub: + +{% codeHelper { copy: true}%} + +```shell +ros2 launch turtlesim_robonomics turtlesim_robonomics_launch.py pubsub_params_path:=./first_pubsub_params```.yaml namespace:='turtlesim1' +``` + +{% endcodeHelper %} + +Você verá o simulador com a tartaruga, juntamente com os logs do ROS 2 no console exibindo o ID do IPFS, o caminho para o diretório com os arquivos IPFS, o endereço do Robonomics e outras informações relevantes. + +### Iniciar o Turtlesim a partir do portal Polkadot + +1. O Turtlesim é controlado através do tópico `/cmd_vel`, então você precisa preparar as mensagens correspondentes e incluí-las em um arquivo, que será usado como parâmetro de lançamento. Para conveniência, essas mensagens são preparadas em um arquivo JSON. Crie um arquivo (por exemplo, `turtle_cmd_vel.json`) e cole o seguinte: + +{% codeHelper { copy: true}%} + + ```json + [ + { + "linear": { + "x": 5.0, + "y": 0.0, + "z": 0.0 + }, + "angular": { + "x": 0.0, + "y": 0.0, + "z": 1.5 + } + }, + { + "linear": { + "x": 2.0, + "y": 0.0, + "z": 0.0 + }, + "angular": { + "x": 0.0, + "y": 0.0, + "z": 2.5 + } +``` } + ] + ``` + +{% endcodeHelper %} + + Este exemplo JSON comandará a tartaruga para se mover duas vezes. + +2. Em seguida, o arquivo precisa ser carregado no IPFS. Você pode escolher qualquer método, mas para este exemplo, usaremos o IPFS Kubo. Abra um terminal no diretório onde o arquivo JSON está localizado e faça o upload para o IPFS: + +{% codeHelper { copy: true}%} + + ```shell + ipfs add turtle_cmd_vel.json + ``` + +{% endcodeHelper %} + + Você receberá o hash IPFS do arquivo. Certifique-se de salvá-lo para uso posterior. + +3. Antes de enviar o lançamento, o hash IPFS deve ser convertido em uma string de 32 bytes de comprimento. Isso pode ser feito usando alguns comandos Python. Abra um terminal, inicie o interpretador Python 3 e execute os seguintes comandos: + +{% codeHelper { copy: true}%} + +```python + from robonomicsinterface.utils import ipfs_qm_hash_to_32_bytes + ipfs_qm_hash_to_32_bytes('HASH_DO_ARQUIVO_IPFS') +``` + +{% endcodeHelper %} + + Salve a string resultante para uso posterior. + +4. Abra o portal Robonomics [Polkadot/Substrate](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fkusama.rpc.robonomics.network%2F#/extrinsics) e naveguePara a aba **Desenvolvedores** -> **Extrínsecos**. Selecione o extrínseco `launch` -> `launch(robot, param)`. No campo `robot`, insira o endereço do seu robô e, no campo `param`, insira a string com o hash IPFS convertido. Envie a transação. + +5. Vá para o simulador Turtlesim. Após enviar com sucesso a transação, a tartaruga deve começar a se mover. + +### Iniciar Turtlesim a partir das Ferramentas de Linha de Comando do ROS 2 + +1. Agora vamos tentar enviar um lançamento para o Turtlesim a partir de outro nó pubsub do ROS 2. Primeiro, crie outro arquivo de configuração (por exemplo, `second_pubsub_params.yaml`) com credenciais Robonomics diferentes e um diretório IPFS separado. + +2. Em um terminal separado, execute um novo nó `robonomics_ros2_pubsub` usando o novo arquivo de configuração: + +{% codeHelper { copy: true}%} + + ```shell + ros2 run robonomics_ros2_pubsub robonomics_ros2_pubsub --ros-args -r __ns:=/test -p pubsub_params_path:=./second_pubsub_params.yaml + ``` + +{% endcodeHelper %} + +3. Coloque o arquivo JSON contendo os comandos para o Turtlesim (`turtle_cmd_vel.json`) no diretório IPFS do novo pubsub. + +4. Antes de enviar o lançamento, vamos configurar o monitoramento para observar como `turtlesim_robonomics` recebe.dados após a chegada. Para fazer isso, em um terminal separado, inscreva-se no tópico correspondente: + +{% codeHelper { copy: true}%} + +```shell +ros2 topic echo /turtlesim1/robonomics/received_launch +``` + +{% endcodeHelper %} + +Ao fazer isso, os logs do pubsub exibirão detalhes do envio do lançamento. + +{% roboWikiNote {type: "warning", title: "Launch Param as String"}%} Para lidar com o parâmetro de lançamento como uma string regular, em vez de um hash IPFS de um arquivo, você precisa alterar o parâmetro do nó ROS 2 correspondente `launch_is_ipfs` de `True` para `False`. Você pode fazer isso usando o comando `ros2 param set`. +{% endroboWikiNote %} + +5. Agora, precisamos chamar o serviço ROS 2 para enviar o lançamento. Em um terminal separado, use o seguinte comando: + +{% codeHelper { copy: true}%} + +```shell +ros2 service call /test/robonomics/send_launch robonomics_ros2_interfaces/srv/RobonomicsROS2SendLaunch {"param: 'turtle_cmd_vel.json', target_address: 'SEU_ENDEREÇO_TURTLESIM'"} +``` + +{% endcodeHelper %} + +Você verá os logs do pubsub exibindo detalhes do envio do lançamento. + +6. Vá para o simulador Turtlesim. Após enviar com sucesso a transação, o turtle deve começar. + +### Iniciar o Turtlesim a partir de Outro Nó + +1. Agora, vamos tentar criar um nó de teste que irá esperar pelo lançamento e depois encaminhá-lo para o Turtlesim. Você pode usar o pacote de teste pronto `test_robot_robonomics`. Copie este pacote para o seu espaço de trabalho do ROS 2. + +2. Abra o arquivo do nó localizado em `test_robot_robonomics/test_robot_robonomics/test_robot_robonomics_node.py` em qualquer editor de texto e adicione o seguinte código após a função `__init__`: + +{% codeHelper { copy: true}%} + +```python +def launch_file_subscriber_callback(self, msg) -> None: + super().launch_file_subscriber_callback(msg) + + transaction_hash = self.send_launch_request(self.param, target_address='SEU_ENDEREÇO_TURTLESIM', is_file=True, encrypt_status=True) + + self.get_logger().info('Enviado lançamento para o turtle com hash: %s ' % str(transaction_hash)) +``` + +{% endcodeHelper %} + + Esta função irá primeiro processar o lançamento recebido e depois usar seu parâmetro para enviar um novo lançamento para o Turtlesim. + +3. Compile o pacote usando `colcon` e, em seguida, inclua seus arquivos de configuração. + +4. Execute o arquivo de lançamento do ROS 2 do pacote de teste com as credenciais de pubsub: + +{% codeHelper { copy: true}%} + + ```shell + ros2 launch test_robot_robonomics test_robot_robonomics_launch.py pubsub_params_path:=./second_pubsub_params.yaml namespace:='test' + ``` + +{% endcodeHelper %} + +5. Agora, envie um lançamento com os parâmetros `turtle_cmd_vel.json` para o endereço do nó de teste, por exemplo, através do portal Polkadot/Substrate. Antes de fazer isso, certifique-se de que o Turtlesim ainda está em execução. O nó de teste deve receber o lançamento e, em seguida, enviar um novo com os mesmos parâmetros, fazendo com que a tartaruga no Turtlesim comece a se mover. \ No newline at end of file diff --git a/src/ru/docs/ros2-about-wrapper.md b/src/ru/docs/ros2-about-wrapper.md new file mode 100644 index 00000000000..ddf57f72a90 --- /dev/null +++ b/src/ru/docs/ros2-about-wrapper.md @@ -0,0 +1,77 @@ +--- +title: О Robonomics ROS 2 Wrapper +contributors: [Fingerling42] +tools: + - Ubuntu 22.04.4 + https://releases.ubuntu.com/jammy/ + - ROS 2 Humble + https://docs.ros.org/en/humble/Installation.html + - IPFS Kubo 0.26.0 + https://docs.ipfs.tech/install/command-line/ + - Python 3.10.12 + https://www.python.org/downloads/ +--- + +**В этой статье вы узнаете о пакете Robonomics ROS 2 Wrapper, который позволяет использовать все функции парачейна Robonomics для любого совместимого с ROS 2 робота.** + +Идея пакета заключается в обертывании API парачейна Robonomics, предоставленного [robonomics-interface](https://github.com/airalab/robonomics-interface), в узлы ROS 2. Цель состоит в предоставлении разработчикам ROS 2 удобного способа интеграции их роботов или устройств с функциями парачейна. Логика интеграции робототехнического устройства заключается в создании для него уникального адреса в парачейне Robonomics, который используется для управления устройством или получения его телеметрии. + +Доступные функции включают: + +* **Функция запуска** — запуск устройства для выполнения любой команды с указанным набором параметров, передаваемых в виде строки или файла. +* **Функция журнала данных** — публикация данных устройствателеметрия в виде хэша на парачейн. +* **Использование подписки Robonomics** — возможность отправлять транзакции без комиссии. +* **Безопасное хранение файлов** — для упаковки и распаковки данных используется [InterPlanetary File System](https://ipfs.tech/), который позволяет получать доступ к файлам по их уникальному хэшу. Для удобного использования IPFS включена поддержка [Pinata](https://www.pinata.cloud/), что позволяет закреплять файлы IPFS для быстрой загрузки. +* **Шифрование и дешифрование файлов** — защита файлов с помощью шифрования открытым ключом. + +В настоящее время обертка доступна в [реализации на Python](https://github.com/airalab/robonomics-ros2/). + +## Архитектура обертки + +С архитектурной точки зрения обертка состоит из рабочего узла (с необходимыми темами и сервисами) и базового класса узла, который можно использовать для ваших конкретных роботов. + +{% roboWikiPicture {src:"docs/robotics/robonomics-ros2-wrapper.png", alt:"Архитектура обертки ROS 2"} %}{% endroboWikiPicture %} + +* `robonomics_ros2_pubsub` — уникальный узел для каждого робота, который служит точкой входа в Web3. Он оборачивает сервисы для отправки журналов данных и получения запусков через Robonomics, а также позволяет загружать/скачивать файлы в IPFS. Этот узел настраивается с помощью специального файла, описанного ниже. Принадлежность узла к конкретному роботу может бытьуказанный через пространство имен ROS. +* `robonomics_ros2_robot_handler` — узел, специфичный для робота, основанный на базовом классе `basic_robonomics_handler` для координации публикации-подписки и робота. Он обрабатывает запуски и решает, когда отправлять журналы данных для управления роботом. + +## Установка оболочки + +Для работы с оболочкой вам понадобится следующее программное обеспечение: + +* Дистрибутив ОС Linux (обычно Ubuntu) +* Дистрибутив ROS 2 +* Узел IPFS +* Python 3 (для Python-реализации оболочки) + +Пожалуйста, следуйте инструкции по установке, доступной [здесь](https://github.com/airalab/robonomics-ros2/?tab=readme-ov-file#getting-started) и проверьте необходимые версии программного обеспечения. После загрузки необходимых компонентов вам потребуется [построить](https://github.com/airalab/robonomics-ros2/?tab=readme-ov-file#installation-and-building) оболочку как обычный пакет ROS 2 с использованием утилиты `colcon`. + +## Настройка подключений к облаку Web3 + +Перед запуском оболочки вам необходимо настроить, как именно ваш робот будет подключаться к децентрализованному облаку Robonomics и поддерживающим его службам Web3. Для этого вам нужно отредактировать файл конфигурации под названием `robonomics_pubsub_params_template.yaml`, который должен быть уникальным для каждого запущенного робота, который должен получить доступ к Robonomics. + +Файл содержит следующие поля конфигурации: + +| Поле | Описание | +|-----------------------|------------------------------------------------------------------------------------------------------------| +| account_seed | Семя учетной записи паракаина Robonomics | +| crypto_type | Тип вашей учетной записи, `ED25519` или `SR25519` | +| remote_node_url | URL узла Robonomics, по умолчанию `wss://kusama.rpc.robonomics.network`, для локального узла `ws://127.0.0.1:9944`| +| rws_owner_address | Адрес владельца подписки Robonomics для использования модуля RWS | +| ipfs_dir_path | Путь к каталогу, содержащему файлы IPFS | +| ipfs_gateway | Шлюз IPFS для загрузки файлов, например, `https://ipfs.io` | +| pinata_api_key | Ключ API от [Pinata](https://www.pinata.cloud/), сервиса закрепления для IPFS | +| pinata_api_secret_key | Секретный ключ API от [Pinata](https://www.pinata.cloud/), сервиса закрепления для IPFS | + +Для создания учетной записи на паракаине Robonomics, пожалуйста, воспользуйтесь [следующим руководством](https://wiki.robonomics.network/docs/create-account-in-dapp/) на нашем вики. Обратите внимание на тип создаваемой учетной записи, поскольку учетные записи типа SR25519 не могут использовать шифрование файлов. + +{% roboWikiNote {type: "warning", title: "Предупреждение"}%} + + Фраза-семя является конфиденциальной информацией, которая позволяет любому человекуИспользуйте свой аккаунт. Убедитесь, что вы не загружаете файл конфигурации на GitHub или куда-либо еще. +{% endroboWikiNote %} + +Обратите внимание на поле `remote_node_url`, так как оно позволяет вам выбрать способ подключения к парачейну Robonomics, включая локальное подключение. Вы можете развернуть свой локальный экземпляр Robonomics для тестирования и разработки. Инструкции по этому доступны в [этой статье](https://wiki.robonomics.network/docs/run-dev-node/) на нашем вики. + +Если у вас есть подписка Robonomics, позволяющая вам отправлять транзакции без комиссий, пожалуйста, вставьте адрес владельца подписки в поле `rws_owner_address`. Не забудьте, что ваш аккаунт должен быть добавлен к вашей подписке. Инструкции по активации вашей подписки Robonomics доступны в двух руководствах: через [Robonomics dapp](https://wiki.robonomics.network/docs/sub-activate/) с удобным интерфейсом пользователя или через [портал Robonomics Substrate](https://wiki.robonomics.network/docs/get-subscription/). + +Параметр `ipfs_gateway` позволяет вам указать шлюз, через который будут загружаться файлы IPFS. Это могут быть как [публичные шлюзы](https://ipfs.github.io/public-gateway-checker/), так и специализированные частные (например, полученные на Pinata) \ No newline at end of file diff --git a/src/ru/docs/ros2-launch-robot-cloud.md b/src/ru/docs/ros2-launch-robot-cloud.md new file mode 100644 index 00000000000..45682a97890 --- /dev/null +++ b/src/ru/docs/ros2-launch-robot-cloud.md @@ -0,0 +1,246 @@ +--- +title: Запуск робота из облака +contributors: [Fingerling42] +tools: + - Оболочка Robonomics ROS 2 Wrapper 3.1.0 + https://github.com/airalab/robonomics-ros2/releases +--- + +**В этой статье вы узнаете, как использовать функцию запуска Robonomics в ROS 2 на примерах** + +Основной особенностью парачейна Robonomics для отправки команд устройствам является внешний вызов запуска. Эта функция позволяет отправлять строку, содержащую параметр (в виде 32-байтового шестнадцатеричного значения) на указанный адрес в парачейне. Обычно строка представляет собой хеш IPFS, который указывает на файл с необходимыми параметрами для выполнения команды. Более подробную информацию о функции запуска можно найти [в этой статье](https://wiki.robonomics.network/docs/launch/). + +В оболочке Robonomics ROS 2 Wrapper функция запуска реализована как сервис для отправки команд и как тема для получения команд. + +## Отправка запуска + +Сервис, называемый `robonomics/send_launch`, выглядит следующим образом: + +{% codeHelper { additionalLine: "RobonomicsROS2SendLaunch.srv"}%} + +```YAML +string param # Просто строка параметров или имя файла с параметрами, которые необходимо загрузить в IPFS +string target_address # Адрес, который будет запущен с помощью запуска +bool is_file True # Является ли параметром запускафайл, который должен быть загружен в IPFS (по умолчанию True)? +bool encrypt_status True # Проверьте, нужно ли зашифровать файл параметров с целевым адресом, по умолчанию True +--- +string launch_hash # Хэш транзакции запуска +``` + +{% endcodeHelper %} + +Сервис принимает следующие параметры в качестве части запроса: параметр команды (либо простая строка, либо имя файла, содержащего параметры команды), целевой адрес в парачейне Robonomics для отправки запуска и два флага: один указывает, является ли параметр файлом, а другой указывает, должен ли файл быть зашифрован (оба установлены по умолчанию в true). Файл будет загружен в IPFS, и его хэш будет передан в качестве параметра запуска. Поэтому файл должен быть помещен в каталог, предназначенный для файлов IPFS, как указано в файле конфигурации узла `robonomics_ros2_pubsub`. + +По умолчанию файл зашифрован с использованием публичного адреса получателя запуска. Применяемый метод шифрования - шифрование с открытым ключом на основе криптографии эллиптической кривой Curve25519. В текущей реализации шифрование поддерживается только для адресов учетных записей типа ED25519 (Эдвардс) (вы можете узнать больше об этом в [этой статье](http://localhost:8080/docs/create-account-in-dapp/#22-create-account)). + +После отправки запуска сервис возвращает хэш транзакции. + +## Получение Запуска + +ПолучениеЗапуск организован в форме соответствующей темы. Технически узел использует функциональность robonomics-interface для подписки на состояние собственного адреса и ожидает появления события `NewLaunch`. Как только событие происходит, узел публикует сообщение в тему `robonomics/received_launch`. Формат сообщения следующий: + +{% codeHelper { additionalLine: "RobonomicsROS2ReceivedLaunch.msg"}%} + +```YAML +string launch_sender_address # Адрес учетной записи, отправившей команду на запуск +string param # Строка с параметром или имя файла с параметрами +``` + +{% endcodeHelper %} + +Поля сообщения содержат адрес, с которого был отправлен запуск, и сам параметр: либо простая строка, либо имя файла с параметрами, который был загружен с IPFS и помещен в рабочий каталог IPFS. Если файл был зашифрован, он расшифровывается во время этого процесса. + + +## Пример с Turtlesim + +Далее мы продемонстрируем, как использовать функцию запуска с [Turtlesim](https://docs.ros.org/en/humble/Tutorials/Beginner-CLI-Tools/Introducing-Turtlesim/Introducing-Turtlesim.html) в качестве примера. Turtlesim - это легкий симулятор, разработанный для изучения ROS 2. Вы можете установить его, используя следующую команду: + +{% codeHelper { copy: true}%} + +```shell +sudo apt install ros-$ROS_DISTRO-turtlesim +``` +{% endcodeHelper %} + +Пакет Robonomics ROS 2 Wrapper включает предварительно собранный пакет под названием `turtlesim_robonomics`, специально адаптированный для Turtlesim. Этот пакет позволяет вам протестировать все функции обертки. Давайте попробуем запустить его. + +{% roboWikiNote {type: "warning", title: "Предупреждение"}%} + + Пожалуйста, убедитесь, что у вас достаточно средств на счету или активная подписка для выполнения транзакций. + +{% endroboWikiNote %} + +1. Для начала создайте файл конфигурации для экземпляра pubsub `turtlesim_robonomics` с использованием шаблона `config/robonomics_pubsub_params_template.yaml`. Заполните соответствующие поля вашими учетными данными Robonomics (семя учетной записи, тип криптовалюты, адрес владельца подписки). Также укажите каталог для файлов IPFS. После завершения переименуйте файл, например, в `first_pubsub_params.yaml`. + +2. Запустите демон IPFS: + +{% codeHelper { copy: true}%} + +```shell +ipfs daemon +``` + +{% endcodeHelper %} + +3. Запустите следующий файл запуска ROS 2. Он запустит все необходимые узлы: сам Turtlesim, реализацию обертки для Turtlesim и Robonomics pubsub: + +{% codeHelper { copy: true}%} + +```shell +ros2 launch turtlesim_robonomics turtlesim_robonomics_launch.py pubsub_params_path:=./first_pubsub_params +```.yaml пространство имен:='turtlesim1' +``` + +{% endcodeHelper %} + +Вы увидите симулятор с черепахой, а также журналы ROS 2 в консоли, отображающие IPFS ID, путь к каталогу с файлами IPFS, адрес Robonomics и другую актуальную информацию. + +### Запуск Turtlesim из портала Polkadot + +1. Turtlesim управляется через тему `/cmd_vel`, поэтому вам нужно подготовить соответствующие сообщения и включить их в файл, который будет использоваться в качестве параметра запуска. Для удобства эти сообщения подготовлены в файле JSON. Создайте файл (например, `turtle_cmd_vel.json`) и вставьте следующее: + + {% codeHelper { copy: true}%} + + ```json + [ + { + "linear": { + "x": 5.0, + "y": 0.0, + "z": 0.0 + }, + "angular": { + "x": 0.0, + "y": 0.0, + "z": 1.5 + } + }, + { + "linear": { + "x": 2.0, + "y": 0.0, + "z": 0.0 + }, + "angular": { + "x": 0.0, + "y": 0.0, + "z": 2.5 + } +``` } + ] + ``` + + {% endcodeHelper %} + + В этом примере JSON команда заставит черепаху дважды двигаться. + +2. Далее файл нужно загрузить в IPFS. Вы можете выбрать любой метод, но для этого примера мы будем использовать IPFS Kubo. Откройте терминал в каталоге, где находится файл JSON, и загрузите его в IPFS: + + {% codeHelper { copy: true}%} + + ```shell + ipfs add turtle_cmd_vel.json + ``` + + {% endcodeHelper %} + + Вы получите IPFS-хеш файла. Обязательно сохраните его для дальнейшего использования. + +3. Перед отправкой запуска IPFS-хеш должен быть преобразован в строку длиной 32 байта. Это можно сделать с помощью нескольких команд Python. Откройте терминал, запустите интерпретатор Python 3 и выполните следующие команды: + + {% codeHelper { copy: true}%} + + ```python + from robonomicsinterface.utils import ipfs_qm_hash_to_32_bytes + ipfs_qm_hash_to_32_bytes('IPFS_FILE_HASH') + ``` + + {% endcodeHelper %} + + Сохраните полученную строку для дальнейшего использования. + +4. Откройте портал Robonomics [Polkadot/Substrate portal](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fkusama.rpc.robonomics.network%2F#/extrinsics) и перейдитеК **Разработчикам** -> вкладка **Экструзии**. Выберите экструзию `launch` -> `launch(robot, param)`. В поле `robot` вставьте адрес вашего робота, а в поле `param` вставьте строку с преобразованным хэшем IPFS. Отправьте транзакцию. + + +5. Перейдите к симулятору Turtlesim. После успешной отправки транзакции черепаха должна начать движение. + + +### Запуск Turtlesim из инструментов командной строки ROS 2 + +1. Теперь давайте попробуем отправить запуск Turtlesim из другого узла ROS 2 pubsub. Сначала создайте другой файл конфигурации (например, `second_pubsub_params.yaml`) с другими учетными данными Robonomics и отдельной директорией IPFS. + +2. В отдельном терминале запустите новый узел `robonomics_ros2_pubsub` с использованием нового файла конфигурации: + + {% codeHelper { copy: true}%} + + ```shell + ros2 run robonomics_ros2_pubsub robonomics_ros2_pubsub --ros-args -r __ns:=/test -p pubsub_params_path:=./second_pubsub_params.yaml + ``` + + {% endcodeHelper %} + +3. Поместите JSON-файл, содержащий команды для Turtlesim (`turtle_cmd_vel.json`), в директорию IPFS нового pubsub. + +4. Прежде чем отправить запуск, давайте настроим мониторинг, чтобы наблюдать, как `turtlesim_robonomics` получает. данные по прибытии. Для этого в отдельном терминале подпишитесь на соответствующую тему: + +{% codeHelper { copy: true}%} + +```shell +ros2 topic echo /turtlesim1/robonomics/received_launch +``` + +{% endcodeHelper %} + +{% roboWikiNote {type: "warning", title: "Launch Param as String"}%} +По умолчанию обработчик запуска ожидает хеш IPFS файла в качестве параметра. Если вам нужно, чтобы pubsub обрабатывал параметр как обычную строку, вам нужно изменить соответствующий параметр узла ROS 2 `launch_is_ipfs` с `True` на `False`. Вы можете сделать это с помощью команды `ros2 param set`. +{% endroboWikiNote %} + + +5. Сейчас нам нужно вызвать сервис ROS 2, чтобы отправить запуск. В отдельном терминале используйте следующую команду: + +{% codeHelper { copy: true}%} + +```shell +ros2 service call /test/robonomics/send_launch robonomics_ros2_interfaces/srv/RobonomicsROS2SendLaunch {"param: 'turtle_cmd_vel.json', target_address: 'YOUR_TURTLESIM_ADDRESS'"} +``` +{% endcodeHelper %} + +Вы увидите журналы pubsub, отображающие детали отправки запуска. + +6. Перейдите к симулятору Turtlesim. После успешной отправки транзакции черепаха должна начать. + +### Запуск Turtlesim из другого узла + +1. Теперь давайте попробуем создать тестовый узел, который будет ожидать прибытия запуска, а затем пересылать его в Turtlesim. Вы можете использовать готовый тестовый пакет `test_robot_robonomics`. Скопируйте этот пакет в ваше рабочее пространство ROS 2. + +2. Откройте файл узла, расположенный по пути `test_robot_robonomics/test_robot_robonomics/test_robot_robonomics_node.py`, в любом текстовом редакторе, и добавьте следующий код после функции `__init__`: + +{% codeHelper { copy: true}%} + + ```python + def launch_file_subscriber_callback(self, msg) -> None: + super().launch_file_subscriber_callback(msg) + + transaction_hash = self.send_launch_request(self.param, target_address='YOUR_TURTLESIM_ADDRESS', is_file=True, encrypt_status=True) + + self.get_logger().info('Отправлен запуск черепахе с хэшем: %s ' % str(transaction_hash)) + ``` + +{% endcodeHelper %} + +Эта функция сначала обработает полученный запуск, а затем использует его параметр для отправки нового запуска в Turtlesim. + +3. Соберите пакет с помощью `colcon`, а затем активируйте его установочные файлы. + +4. Запустите файл запуска ROS 2 тестового пакета с учетными данными второго pubsub: + + + {% codeHelper { copy: true}%} + + ```shell + ros2 launch test_robot_robonomics test_robot_robonomics_launch.py pubsub_params_path:=./second_pubsub_params.yaml namespace:='test' + ``` + + {% endcodeHelper %} + +5. Теперь отправьте запуск с параметрами `turtle_cmd_vel.json` на адрес тестового узла, например, через портал Polkadot/Substrate. Прежде чем это сделать, убедитесь, что Turtlesim все еще работает. Тестовый узел должен получить запуск, а затем отправить новый с теми же параметрами, что заставит черепаху в Turtlesim начать движение. diff --git a/src/uk/docs/ros2-about-wrapper.md b/src/uk/docs/ros2-about-wrapper.md new file mode 100644 index 00000000000..e353a483c01 --- /dev/null +++ b/src/uk/docs/ros2-about-wrapper.md @@ -0,0 +1,77 @@ +--- +title: Про обгортку Robonomics ROS 2 +contributors: [Fingerling42] +tools: + - Ubuntu 22.04.4 + https://releases.ubuntu.com/jammy/ + - ROS 2 Humble + https://docs.ros.org/en/humble/Installation.html + - IPFS Kubo 0.26.0 + https://docs.ipfs.tech/install/command-line/ + - Python 3.10.12 + https://www.python.org/downloads/ +--- + +**У цій статті ви дізнаєтеся про пакет обгортки Robonomics ROS 2, який дозволяє використовувати всі функції паралельної мережі Robonomics для будь-якого сумісного з ROS 2 робота.** + +Ідея пакету полягає в тому, щоб обгорнути API паралельної мережі Robonomics, надане [robonomics-interface](https://github.com/airalab/robonomics-interface), вузлами ROS 2. Мета полягає в тому, щоб надати розробникам ROS 2 зручний спосіб інтегрувати свої роботи або пристрої з функціями паралельної мережі. Логіка інтеграції роботизованого пристрою полягає в тому, що для нього створюється унікальна адреса в паралельній мережі Robonomics, яка використовується для управління пристроєм або отримання телеметрії. + +Доступні функції включають: + +* **Функція запуску** — запуск пристрою для виконання будь-якої команди з вказаним набором параметрів, переданих у вигляді рядка або файлу. +* **Функція журналу даних** — публікація даних пристроютелеметрія у формі хешу до паралелі. +* **Використання підписки Robonomics** — можливість відправляти транзакції без комісії. +* **Безпечне зберігання файлів** — для упаковки та розпакування даних використовується [Міжпланетна файлова система](https://ipfs.tech/), яка дозволяє отримувати доступ до файлів за їх унікальним хешем. Для зручного використання IPFS включена підтримка [Pinata](https://www.pinata.cloud/), що дозволяє закріплювати файли IPFS для швидкого завантаження. +* **Шифрування та дешифрування файлів** — захист файлів за допомогою шифрування за відкритим ключем. + +На даний момент обгортка доступна у [реалізації Python](https://github.com/airalab/robonomics-ros2/). + +## Архітектура обгортки + +З архітектурної точки зору, обгортка складається з вузла робочого процесу (з необхідними темами та сервісами) та базового класу вузла, який може бути використаний для ваших конкретних роботів. + +{% roboWikiPicture {src:"docs/robotics/robonomics-ros2-wrapper.png", alt:"Архітектура обгортки ROS 2"} %}{% endroboWikiPicture %} + +* `robonomics_ros2_pubsub` — унікальний вузол для кожного робота, який служить входом до Web3. Він обгортає сервіси для відправлення даних та отримання запусків через Robonomics та дозволяє завантажувати/вивантажувати файли в IPFS. Цей вузол налаштовується за допомогою спеціального файлу, який описаний нижче. Приналежність вузла до конкретного робота може бутивказано через простір імен ROS. +* `robonomics_ros2_robot_handler` — вузол, специфічний для робота на основі базового класу `basic_robonomics_handler` для координації pubsub та робота. Він обробляє запуски та вирішує, коли відправляти журнали даних для керування роботом. + +## Встановлення обгортки + +Для роботи з обгорткою вам знадобиться наступне програмне забезпечення: + +* Розподіл операційної системи Linux (зазвичай, Ubuntu) +* Розподіл ROS 2 +* Вузол IPFS +* Python 3 (для реалізації обгортки на Python) + +Будь ласка, дотримуйтесь інструкції з встановлення, доступної [тут](https://github.com/airalab/robonomics-ros2/?tab=readme-ov-file#getting-started) та перевірте необхідні версії програмного забезпечення. Після завантаження необхідних компонентів вам потрібно [побудувати](https://github.com/airalab/robonomics-ros2/?tab=readme-ov-file#installation-and-building) обгортку як звичайний пакет ROS 2 за допомогою утиліти `colcon`. + +## Налаштування підключень до хмари Web3 + +Перед запуском обгортки вам потрібно налаштувати, як саме ваш робот буде підключатися до децентралізованого хмарини Robonomics та підтримуючих веб-сервісів Web3. Для цього вам потрібно відредагувати файл конфігурації під назвою `robonomics_pubsub_params_template.yaml`, який повинен бути унікальним для кожного запущеного робота, який потребує доступу до Robonomics. + +Файл містить наступні поля конфігурації: + +| Поле | Опис | +|-----------------------|------------------------------------------------------------------------------------------------------------| +| account_seed | Насіння облікового запису паракшену Robonomics | +| crypto_type | Тип вашого облікового запису, `ED25519` або `SR25519` | +| remote_node_url | URL вузла Robonomics, за замовчуванням `wss://kusama.rpc.robonomics.network`, для локального вузла `ws://127.0.0.1:9944`| +| rws_owner_address | Адреса власника підписки Robonomics для використання модуля RWS | +| ipfs_dir_path | Шлях до каталогу, що містить файли IPFS | +| ipfs_gateway | Шлюз IPFS для завантаження файлів, наприклад, `https://ipfs.io` | +| pinata_api_key | Ключ API від [Pinata](https://www.pinata.cloud/) сервісу закріплення для IPFS | +| pinata_api_secret_key | Секретний ключ API від [Pinata](https://www.pinata.cloud/) сервісу закріплення для IPFS | + +Щоб створити обліковий запис на паракшені Robonomics, будь ласка, скористайтеся [наступним керівництвом](https://wiki.robonomics.network/docs/create-account-in-dapp/) на нашому вікі. Будь ласка, зверніть увагу на тип облікового запису, який ви створюєте, оскільки облікові записи типу SR25519 не можуть використовувати шифрування файлів. + +{% roboWikiNote {type: "warning", title: "Попередження"}%} + + Фраза-насіння є чутливою інформацією, яка дозволяє будь-комуВикористовуйте свій обліковий запис. Переконайтеся, що ви не завантажуєте файл конфігурації на GitHub або куди-небудь інде. +{% endroboWikiNote %} + +Зверніть увагу на поле `remote_node_url`, оскільки воно дозволяє вам вибрати, як саме підключатися до паралельної мережі Robonomics, включаючи локальне підключення. Ви можете розгорнути свій локальний екземпляр Robonomics для тестування та розробки. Інструкції з цього питання доступні в [цій статті](https://wiki.robonomics.network/docs/run-dev-node/) на нашому вікі. + +Якщо у вас є підписка Robonomics, яка дозволяє вам відправляти транзакції без комісії, будь ласка, вставте адресу власника підписки в поле `rws_owner_address`. Не забудьте, що ваш обліковий запис повинен бути доданий до вашої підписки. Інструкції з активації підписки Robonomics доступні в двох посібниках: через [додаток Robonomics](https://wiki.robonomics.network/docs/sub-activate/) з інтуїтивно зрозумілим інтерфейсом або через [портал Robonomics Substrate](https://wiki.robonomics.network/docs/get-subscription/). + +Параметр `ipfs_gateway` дозволяє вам вказати шлюз, через який будуть завантажуватися файли IPFS. Це можуть бути або [публічні шлюзи](https://ipfs.github.io/public-gateway-checker/), або спеціалізовані приватні (наприклад, ті, які отримані на Pinata) \ No newline at end of file diff --git a/src/uk/docs/ros2-launch-robot-cloud.md b/src/uk/docs/ros2-launch-robot-cloud.md new file mode 100644 index 00000000000..ee1c86d9f60 --- /dev/null +++ b/src/uk/docs/ros2-launch-robot-cloud.md @@ -0,0 +1,246 @@ +--- +title: Запуск Робота з Хмари +contributors: [Fingerling42] +tools: + - Обгортка Robonomics ROS 2 версії 3.1.0 + https://github.com/airalab/robonomics-ros2/releases +--- + +**У цій статті ви дізнаєтеся, як використовувати функцію запуску Robonomics в ROS 2 за допомогою різних прикладів** + +Основною функцією парачейну Robonomics для відправлення команд на пристрої є зовнішній запуск. Ця функція дозволяє відправляти рядок, що містить параметр (у вигляді значення hex у формі 32 байтів) на вказану адресу у парачейні. Зазвичай рядок представляє собою хеш IPFS, який вказує на файл з необхідними параметрами для виконання команди. Більше деталей про функцію запуску можна знайти [у цій статті](https://wiki.robonomics.network/docs/launch/). + +У Обгортці Robonomics ROS 2 функція запуску реалізована як сервіс для відправлення команд та як тема для отримання команд. + +## Відправлення Запуску + +Сервіс, під назвою `robonomics/send_launch`, виглядає наступним чином: + +{% codeHelper { additionalLine: "RobonomicsROS2SendLaunch.srv"}%} + +```YAML +string param # Просто рядок параметрів або ім'я файлу з параметрами, які потрібно завантажити в IPFS +string target_address # Адреса, яку потрібно активувати за допомогою запуску +bool is_file True # Це параметр запускучи потрібно завантажити файл в IPFS (за замовчуванням True)? +bool encrypt_status True # Перевірте, чи потрібно зашифрувати файл параметрів за цільовою адресою, за замовчуванням True +--- +string launch_hash # Хеш транзакції запуску +``` + +{% endcodeHelper %} + +Сервіс приймає наступні параметри як частину запиту: параметр команди (це може бути простий рядок або назва файлу, що містить параметри команди), цільова адреса в паралельному ланцюжку Robonomics для відправлення запуску, та два прапорці: один вказує, чи є параметр файлом, а інший вказує, чи файл повинен бути зашифрованим (обидва за замовчуванням встановлені на true). Файл буде завантажено в IPFS, і його хеш буде переданий як параметр запуску. Тому файл повинен бути розміщений у каталозі, призначеному для файлів IPFS, як вказано в файлі конфігурації для вузла `robonomics_ros2_pubsub`. + +За замовчуванням файл зашифровується за допомогою публічної адреси отримувача запуску. Застосований метод шифрування - шифрування на основі публічного ключа на основі криптографії еліптичної кривої Curve25519. У поточній реалізації шифрування підтримується лише для адрес рахунків типу ED25519 (Edwards) (ви можете дізнатися більше про це в [цій статті](http://localhost:8080/docs/create-account-in-dapp/#22-create-account)). + +Після відправлення запуску сервіс повертає хеш транзакції. + +## Отримання запуску + +ОтриманняЗапуск організований у формі відповідної теми. Технічно, вузол використовує функціонал інтерфейсу robonomics для підписки на стан власної адреси та очікує появи події `NewLaunch`. Як тільки подія відбудеться, вузол публікує повідомлення на тему `robonomics/received_launch`. Формат повідомлення виглядає наступним чином: + +{% codeHelper { additionalLine: "RobonomicsROS2ReceivedLaunch.msg"}%} + +```YAML +string launch_sender_address # Адреса облікового запису, яка відправила команду на запуск +string param # Рядок з параметром або назва файлу з параметрами +``` + +{% endcodeHelper %} + +Поля повідомлення містять адресу, з якої був відправлений запуск, та сам параметр: або простий рядок, або назва файлу з параметрами, який був завантажений з IPFS та розміщений у робочому каталозі IPFS. Якщо файл був зашифрований, він розшифровується під час цього процесу. + + +## Приклад з Turtlesim + +Далі ми продемонструємо, як використовувати функцію запуску з [Turtlesim](https://docs.ros.org/en/humble/Tutorials/Beginner-CLI-Tools/Introducing-Turtlesim/Introducing-Turtlesim.html) як приклад. Turtlesim - це легкий симулятор, призначений для вивчення ROS 2. Ви можете встановити його за допомогою наступної команди: + +{% codeHelper { copy: true}%} + +```shell +sudo apt install ros-$ROS_DISTRO-turtlesim +``` + +{% endcodeHelper %} + +Пакет обгортки Robonomics ROS 2 включає попередньо побудований пакет під назвою `turtlesim_robonomics`, спеціально адаптований для Turtlesim. Цей пакет дозволяє вам перевірити всі можливості обгортки. Давайте спробуємо запустити його. + +{% roboWikiNote {type: "warning", title: "Попередження"}%} + + Будь ласка, переконайтеся, що у вас є достатній баланс на рахунку або активна підписка для виконання транзакцій. + +{% endroboWikiNote %} + +1. Для початку створіть файл конфігурації для екземпляра pubsub `turtlesim_robonomics` за допомогою шаблону `config/robonomics_pubsub_params_template.yaml`. Заповніть відповідні поля своїми обліковими даними Robonomics (seed-код рахунку, тип криптовалюти, адреса власника підписки). Також вкажіть каталог для файлів IPFS. Після завершення перейменуйте файл, наприклад, `first_pubsub_params.yaml`. + +2. Запустіть демон IPFS: + +{% codeHelper { copy: true}%} + +```shell +ipfs daemon +``` + +{% endcodeHelper %} + +3. Запустіть наступний файл запуску ROS 2. Він запустить всі необхідні вузли: сам Turtlesim, реалізацію обгортки для Turtlesim та Robonomics pubsub: + +{% codeHelper { copy: true}%} + +```shell +ros2 launch turtlesim_robonomics turtlesim_robonomics_launch.py pubsub_params_path:=./first_pubsub_params```.yaml простір імен:='turtlesim1' +``` + +{% endcodeHelper %} + +Ви побачите симулятор з черепахою, разом з журналами ROS 2 у консолі, де відображається IPFS ID, шлях до каталогу з файлами IPFS, адреса Robonomics та інша важлива інформація. + +### Запуск Turtlesim з порталу Polkadot + +1. Turtlesim керується через тему `/cmd_vel`, тому вам потрібно підготувати відповідні повідомлення та включити їх у файл, який буде використовуватися як параметр запуску. Для зручності ці повідомлення підготовлені у файлі JSON. Створіть файл (наприклад, `turtle_cmd_vel.json`) та вставте наступне: + + {% codeHelper { copy: true}%} + + ```json + [ + { + "linear": { + "x": 5.0, + "y": 0.0, + "z": 0.0 + }, + "angular": { + "x": 0.0, + "y": 0.0, + "z": 1.5 + } + }, + { + "linear": { + "x": 2.0, + "y": 0.0, + "z": 0.0 + }, + "angular": { + "x": 0.0, + "y": 0.0, + "z": 2.5 + } +``` } + ] + ``` + + {% endcodeHelper %} + + Цей приклад JSON буде вказувати черепаху рухатися двічі. + +2. Далі файл потрібно завантажити в IPFS. Ви можете вибрати будь-який метод, але для цього прикладу ми використаємо IPFS Kubo. Відкрийте термінал у каталозі, де знаходиться файл JSON, і завантажте його в IPFS: + + {% codeHelper { copy: true}%} + + ```shell + ipfs add turtle_cmd_vel.json + ``` + + {% endcodeHelper %} + + Ви отримаєте хеш IPFS файлу. Обов'язково збережіть його для подальшого використання. + +3. Перш ніж відправити запуск, хеш IPFS повинен бути перетворений у рядок довжиною 32 байти. Це можна зробити за допомогою кількох команд Python. Відкрийте термінал, запустіть інтерпретатор Python 3 і виконайте наступні команди: + + {% codeHelper { copy: true}%} + + ```python + from robonomicsinterface.utils import ipfs_qm_hash_to_32_bytes + ipfs_qm_hash_to_32_bytes('IPFS_FILE_HASH') + ``` + + {% endcodeHelper %} + + Збережіть отриманий рядок для подальшого використання. + +4. Відкрийте портал Robonomics [Polkadot/Substrate portal](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fkusama.rpc.robonomics.network%2F#/extrinsics) та перейдітьдо вкладки **Розробники** -> **Екструзії**. Виберіть екструзію `launch` -> `launch(robot, param)`. У полі `robot` вставте адресу вашого робота, а в поле `param` вставте рядок з конвертованим хешем IPFS. Надішліть транзакцію. + + +5. Перейдіть до симулятора Turtlesim. Після успішного відправлення транзакції черепаха повинна почати рухатися. + + +### Запуск Turtlesim з інструментів командного рядка ROS 2 + +1. Тепер спробуємо відправити запуск до Turtlesim з іншого вузла ROS 2 pubsub. Спочатку створіть інший файл конфігурації (наприклад, `second_pubsub_params.yaml`) з іншими обліковими даними Robonomics та окремим каталогом IPFS. + +2. У окремому терміналі запустіть новий вузол `robonomics_ros2_pubsub` за допомогою нового файлу конфігурації: + + {% codeHelper { copy: true}%} + + ```shell + ros2 run robonomics_ros2_pubsub robonomics_ros2_pubsub --ros-args -r __ns:=/test -p pubsub_params_path:=./second_pubsub_params.yaml + ``` + + {% endcodeHelper %} + +3. Помістіть файл JSON, що містить команди для Turtlesim (`turtle_cmd_vel.json`), в каталог IPFS нового pubsub. + +4. Перед відправленням запуску налаштуйте моніторинг, щоб спостерігати, як `turtlesim_robonomics` отримує дані.дані по прибуттю. Для цього в окремому терміналі підпишіться на відповідну тему: + +{% codeHelper { copy: true}%} + +```shell +ros2 topic echo /turtlesim1/robonomics/received_launch +``` + +{% endcodeHelper %} + +{% roboWikiNote {type: "warning", title: "Launch Param as String"}%} +За замовчуванням обробник запуску очікує хеш IPFS файлу як параметр. Якщо вам потрібно, щоб pubsub обробляв параметр як звичайний рядок, вам потрібно змінити відповідний параметр вузла ROS 2 `launch_is_ipfs` з `True` на `False`. Це можна зробити за допомогою команди `ros2 param set`. +{% endroboWikiNote %} + +5. Зараз нам потрібно викликати сервіс ROS 2 для відправки запуску. У відокремленому терміналі використовуйте наступну команду: + +{% codeHelper { copy: true}%} + +```shell +ros2 service call /test/robonomics/send_launch robonomics_ros2_interfaces/srv/RobonomicsROS2SendLaunch {"param: 'turtle_cmd_vel.json', target_address: 'YOUR_TURTLESIM_ADDRESS'"} +``` + +{% endcodeHelper %} + +Ви побачите журнали pubsub, які відображають деталі відправлення запуску. + +6. Перейдіть до симулятора Turtlesim. Після успішної відправки транзакції черепаха повинна почати.переміщення. Крім того, в журналах підписаної теми ви повинні бачити інформацію про отримані дані. + + +### Запуск Turtlesim з іншого вузла + +1. Тепер спробуйте створити тестовий вузол, який буде чекати на прихід запуску, а потім пересилати його до Turtlesim. Ви можете використовувати готовий тестовий пакет `test_robot_robonomics`. Скопіюйте цей пакет до вашого робочого простору ROS 2. + +2. Відкрийте файл вузла, розташований за шляхом `test_robot_robonomics/test_robot_robonomics/test_robot_robonomics_node.py` у будь-якому текстовому редакторі, і додайте наступний код після функції `__init__`: + + {% codeHelper { copy: true}%} + + ```python + def launch_file_subscriber_callback(self, msg) -> None: + super().launch_file_subscriber_callback(msg) + + transaction_hash = self.send_launch_request(self.param, target_address='YOUR_TURTLESIM_ADDRESS', is_file=True, encrypt_status=True) + + self.get_logger().info('Sent launch to the turtle with hash: %s ' % str(transaction_hash)) + ``` + + {% endcodeHelper %} + + Ця функція спочатку оброблятиме отриманий запуск, а потім використовуватиме його параметр для відправлення нового запуску до Turtlesim. + +3. Побудуйте пакет, використовуючи `colcon`, а потім використовуйте його налаштувальні файли. + +4. Запустіть ROS 2 файл запуску тестового пакету з другими публікаційними / підписними обліковими даними: + + {% codeHelper { copy: true}%} + + ```shell + ros2 launch test_robot_robonomics test_robot_robonomics_launch.py pubsub_params_path:=./second_pubsub_params.yaml namespace:='test' + ``` + + {% endcodeHelper %} + +5. Тепер надішліть запуск з параметрами `turtle_cmd_vel.json` на адресу вузла тесту, наприклад, через портал Polkadot/Substrate. Перед цим переконайтеся, що Turtlesim все ще працює. Тестовий вузол повинен отримати запуск, а потім надіслати новий з тими ж параметрами, що призведе до руху черепахи в Turtlesim. diff --git a/src/zh/docs/ros2-about-wrapper.md b/src/zh/docs/ros2-about-wrapper.md new file mode 100644 index 00000000000..b46e07503c0 --- /dev/null +++ b/src/zh/docs/ros2-about-wrapper.md @@ -0,0 +1,77 @@ +--- +title: 关于Robonomics ROS 2包装器 +contributors: [Fingerling42] +tools: + - Ubuntu 22.04.4 + https://releases.ubuntu.com/jammy/ + - ROS 2 Humble + https://docs.ros.org/en/humble/Installation.html + - IPFS Kubo 0.26.0 + https://docs.ipfs.tech/install/command-line/ + - Python 3.10.12 + https://www.python.org/downloads/ +--- + +**在本文中,您将了解Robonomics ROS 2包装器包,该包允许您在任何ROS 2兼容的机器人上使用Robonomics平行链的所有功能。** + +该包的理念是将[robonomics-interface](https://github.com/airalab/robonomics-interface)提供的Robonomics平行链API包装到ROS 2的节点中。目标是为ROS 2开发人员提供一种方便的方式,将其机器人或设备与平行链功能集成。机器人设备集成背后的逻辑是在Robonomics平行链中为其创建一个唯一地址,该地址用于控制设备或接收其遥测数据。 + +可用功能包括: + +* **启动功能** — 启动设备以执行传递为字符串或文件的指定参数的任何命令。 +* **数据日志功能** — 发布设备遥测以哈希形式发送到平行链。 +* **使用 Robonomics 订阅** — 无需费用即可发送交易的能力。 +* **安全文件存储** — 使用 [星际文件系统](https://ipfs.tech/) 来打包和解压数据,允许通过其唯一哈希访问文件。为了方便使用 IPFS,包含了 [Pinata](https://www.pinata.cloud/) 支持,允许固定 IPFS 文件以便快速下载。 +* **文件加密和解密** — 使用公钥加密保护文件。 + +目前,该包装器可在 [Python 实现](https://github.com/airalab/robonomics-ros2/) 中找到。 + +## 包装器架构 + +从架构上看,该包装器由一个工作节点(具有必要的主题和服务)和一个基本节点类组成,可用于您特定的机器人。 + +{% roboWikiPicture {src:"docs/robotics/robonomics-ros2-wrapper.png", alt:"ROS 2 Wrapper Architecture"} %}{% endroboWikiPicture %} + +* `robonomics_ros2_pubsub` — 每个机器人的独特节点,作为连接到 Web3 的入口点。它包装了通过 Robonomics 发送数据日志和接收启动的服务,并允许下载/上传到 IPFS。该节点通过一个特殊文件进行配置,下文将对其进行描述。节点与特定机器人的关联可以是通过ROS命名空间指定。 +* `robonomics_ros2_robot_handler` — 一个基于基本类`basic_robonomics_handler`的机器人特定节点,用于协调pubsub和机器人。它处理启动并决定何时发送数据日志以控制机器人。 + +## 安装包装器 + +要使用包装器,您需要以下软件: + +* Linux操作系统发行版(通常为Ubuntu) +* ROS 2发行版 +* IPFS节点 +* Python 3(用于包装器的Python实现) + +请按照[此处](https://github.com/airalab/robonomics-ros2/?tab=readme-ov-file#getting-started)提供的安装指南,并检查所需软件的版本。下载所需组件后,您需要使用`colcon`实用程序将包装器构建为通常的ROS 2软件包。 + +## 配置连接到Web3云 + +在启动包装器之前,您需要设置您的机器人将如何连接到去中心化的Robonomics云和支持的Web3服务。为此,您需要编辑名为`robonomics_pubsub_params_template.yaml`的配置文件,该文件对于需要访问Robonomics的每个启动的机器人必须是唯一的。 + +该文件包含以下配置字段: + +| 字段 | 描述 | +|-----------------------|------------------------------------------------------------------------------------------------------------| +| account_seed | Robonomics平行链的账户种子 | +| crypto_type | 您的账户类型,`ED25519`或`SR25519` | +| remote_node_url | Robonomics节点URL,默认为`wss://kusama.rpc.robonomics.network`,本地节点为`ws://127.0.0.1:9944` | +| rws_owner_address | 用于使用RWS模块的Robonomics订阅所有者的地址 | +| ipfs_dir_path | 包含IPFS文件的目录路径 | +| ipfs_gateway | 用于下载文件的IPFS网关,例如`https://ipfs.io` | +| pinata_api_key | 来自[Pinata](https://www.pinata.cloud/)的API密钥,用于IPFS的固定服务 | +| pinata_api_secret_key | 来自[Pinata](https://www.pinata.cloud/)的秘密API密钥,用于IPFS的固定服务 | + +要在Robonomics平行链上创建一个账户,请使用我们维基上的[以下指南](https://wiki.robonomics.network/docs/create-account-in-dapp/)。请注意创建的账户类型,因为SR25519类型的账户无法使用文件加密。 + +{% roboWikiNote {type: "warning", title: "警告"}%} + + 种子短语是一种敏感信息,允许任何人使用您的帐户。确保不要将配置文件上传到GitHub或任何其他地方。 +{% endroboWikiNote %} + +请注意`remote_node_url`字段,因为它允许您选择如何连接到Robonomics平行链,包括本地连接。您可以部署用于测试和开发的本地Robonomics实例。有关如何执行此操作的说明,请参阅我们维基上的[此文章](https://wiki.robonomics.network/docs/run-dev-node/)。 + +如果您有一个Robonomics订阅,允许您免费发送交易,请将订阅所有者的地址插入`rws_owner_address`字段。不要忘记将您的帐户添加到您的订阅中。有关如何激活您的Robonomics订阅的说明有两个指南:通过[Robonomics dapp](https://wiki.robonomics.network/docs/sub-activate/)具有用户友好界面或通过[Robonomics Substrate门户](https://wiki.robonomics.network/docs/get-subscription/)。 + +`ipfs_gateway`参数允许您指定通过哪个网关下载IPFS文件。这些可以是[公共网关](https://ipfs.github.io/public-gateway-checker/)或专门的私人网关(例如在Pinata上获得的网关)。 \ No newline at end of file diff --git a/src/zh/docs/ros2-launch-robot-cloud.md b/src/zh/docs/ros2-launch-robot-cloud.md new file mode 100644 index 00000000000..4b08a324910 --- /dev/null +++ b/src/zh/docs/ros2-launch-robot-cloud.md @@ -0,0 +1,243 @@ +--- +title: 从云端启动机器人 +contributors: [Fingerling42] +tools: + - Robonomics ROS 2 Wrapper 3.1.0 + https://github.com/airalab/robonomics-ros2/releases +--- + +**在本文中,您将学习如何通过各种示例在ROS 2中使用Robonomics启动功能** + +Robonomics平行链用于向设备发送命令的关键功能是启动外部函数。此功能允许您发送一个包含参数的字符串(以32字节长的十六进制值形式)到平行链中的指定地址。通常,该字符串代表一个指向包含执行命令所需参数的文件的IPFS哈希。您可以在[本文](https://wiki.robonomics.network/docs/launch/)中找到有关启动功能的更多详细信息。 + +在Robonomics ROS 2 Wrapper中,启动功能被实现为用于发送命令的服务和用于接收命令的主题。 + +## 发送启动 + +名为`robonomics/send_launch`的服务如下所示: + +{% codeHelper { additionalLine: "RobonomicsROS2SendLaunch.srv"}%} + +```YAML +string param # 只是参数字符串或包含需要上传到IPFS的参数的文件名 +string target_address # 要触发启动的地址 +bool is_file True # 是否为启动参数要上传到IPFS的文件(默认为True)吗? +bool encrypt_status True # 检查参数文件是否需要使用目标地址加密,默认为True +--- +string launch_hash # 启动交易的哈希值 +``` + +{% endcodeHelper %} + +服务接受以下参数作为请求的一部分:命令参数(可以是简单字符串或包含命令参数的文件名),用于发送启动的Robonomics平行链中的目标地址,以及两个标志:一个指示参数是否为文件,另一个指定文件是否应加密(默认都设置为true)。文件将被上传到IPFS,并且其哈希值将作为启动参数传递。因此,文件必须放在专门用于IPFS文件的目录中,如`robonomics_ros2_pubsub`节点的配置文件中指定的那样。 + +默认情况下,文件将使用启动接收者的公共地址进行加密。应用的加密方法是基于Curve25519椭圆曲线密码学的公钥加密。在当前实现中,仅支持ED25519(Edwards)类型的帐户地址进行加密(您可以在[此文章](http://localhost:8080/docs/create-account-in-dapp/#22-create-account)中了解更多信息)。 + +发送启动后,服务将返回交易哈希值。 + +## 接收启动 + +接收启动以相应主题的形式组织。从技术上讲,节点利用robonomics-interface功能订阅自己地址的状态,并等待`NewLaunch`事件的出现。一旦事件发生,节点将向`robonomics/received_launch`主题发布消息。消息格式如下: + +{% codeHelper { additionalLine: "RobonomicsROS2ReceivedLaunch.msg"}%} + +```YAML +string launch_sender_address # 发送启动命令的帐户地址 +string param # 带有参数或参数文件名称的字符串 +``` + +{% endcodeHelper %} + +消息字段包含发送启动命令的地址以及参数本身:可以是简单字符串,也可以是从IPFS下载并放置在IPFS工作目录中的参数文件的名称。如果文件已加密,则在此过程中将对其进行解密。 + + +## 以Turtlesim为例 + +接下来,我们将演示如何使用[Turtlesim](https://docs.ros.org/en/humble/Tutorials/Beginner-CLI-Tools/Introducing-Turtlesim/Introducing-Turtlesim.html)作为示例来使用启动功能。Turtlesim是专为学习ROS 2设计的轻量级模拟器。您可以使用以下命令安装它: + +{% codeHelper { copy: true}%} + +```shell +sudo apt install ros-$ROS_DISTRO-turtlesim +``` + +{% endcodeHelper %} + +Robonomics ROS 2包中包含一个名为`turtlesim_robonomics`的预构建包,专门为Turtlesim定制。该包允许您测试包装器的所有功能。让我们试一试并运行它。 + +{% roboWikiNote {type: "warning", title: "警告"}%} + + 请确保您的帐户中有足够的余额或者有一个活跃的订阅以执行交易。 + +{% endroboWikiNote %} + +1. 首先,使用`config/robonomics_pubsub_params_template.yaml`模板为`turtlesim_robonomics`的pubsub实例创建一个配置文件。填写Robonomics凭据(帐户种子、加密类型、订阅所有者地址)中的适当字段。还要指定一个IPFS文件目录。完成后,将文件重命名为,例如,`first_pubsub_params.yaml`。 + +2. 启动IPFS守护程序: + +{% codeHelper { copy: true}%} + +```shell +ipfs daemon +``` + +{% endcodeHelper %} + +3. 运行以下ROS 2启动文件。它将启动所有必要的节点:Turtlesim本身、Turtlesim的包装器实现以及Robonomics pubsub: + +{% codeHelper { copy: true}%} + +```shell +ros2 launch turtlesim_robonomics turtlesim_robonomics_launch.py pubsub_params_path:=./first_pubsub_params +```.yaml namespace:='turtlesim1' +``` + +{% endcodeHelper %} + +您将在控制台中看到带有乌龟的模拟器,显示IPFS ID、带有IPFS文件的目录路径、Robonomics地址和其他相关信息的ROS 2日志。 + +### 从Polkadot门户启动Turtlesim + +1. Turtlesim通过`/cmd_vel`主题进行控制,因此您需要准备相应的消息并将其包含在一个文件中,该文件将用作启动参数。为了方便起见,这些消息已经准备在一个JSON文件中。创建一个文件(例如,`turtle_cmd_vel.json`)并粘贴以下内容: + + {% codeHelper { copy: true}%} + + ```json + [ + { + "linear": { + "x": 5.0, + "y": 0.0, + "z": 0.0 + }, + "angular": { + "x": 0.0, + "y": 0.0, + "z": 1.5 + } + }, + { + "linear": { + "x": 2.0, + "y": 0.0, + "z": 0.0 + }, + "angular": { + "x": 0.0, + "y": 0.0, + "z": 2.5 + } +``` } + ] + ``` + + {% endcodeHelper %} + + 这个 JSON 示例将命令乌龟移动两次。 + +2. 接下来,文件需要上传到 IPFS。您可以选择任何方法,但在这个示例中,我们将使用 IPFS Kubo。在存放 JSON 文件的目录中打开终端,并将其上传到 IPFS: + + {% codeHelper { copy: true}%} + + ```shell + ipfs add turtle_cmd_vel.json + ``` + + {% endcodeHelper %} + + 您将收到文件的 IPFS 哈希。请务必保存以备后用。 + +3. 在发送启动之前,IPFS 哈希必须转换为一个 32 字节长的字符串。这可以通过几个 Python 命令完成。打开终端,启动 Python 3 解释器,并运行以下命令: + + {% codeHelper { copy: true}%} + + ```python + from robonomicsinterface.utils import ipfs_qm_hash_to_32_bytes + ipfs_qm_hash_to_32_bytes('IPFS_FILE_HASH') + ``` + + {% endcodeHelper %} + + 保存生成的字符串以备后用。 + +4. 打开 Robonomics [Polkadot/Substrate 门户](https://polkadot.js.org/apps/?rpc=wss%3A%2F%2Fkusama.rpc.robonomics.network%2F#/extrinsics) 并导航前往**开发者** -> **外部函数**选项卡。选择外部函数 `launch` -> `launch(robot, param)`。在 `robot` 字段中,插入您的机器人地址,在 `param` 字段中,插入包含转换后的IPFS哈希的字符串。提交交易。 + +5. 进入Turtlesim模拟器。成功发送交易后,乌龟应该开始移动。 + +### 从ROS 2命令行工具启动Turtlesim + +1. 现在让我们尝试从另一个ROS 2 pubsub节点向Turtlesim发送一个启动。首先,创建另一个配置文件(例如,`second_pubsub_params.yaml`),其中包含不同的Robonomics凭据和一个单独的IPFS目录。 + +2. 在另一个终端中,使用新的配置文件运行一个新的 `robonomics_ros2_pubsub` 节点: + + {% codeHelper { copy: true}%} + + ```shell + ros2 run robonomics_ros2_pubsub robonomics_ros2_pubsub --ros-args -r __ns:=/test -p pubsub_params_path:=./second_pubsub_params.yaml + ``` + + {% endcodeHelper %} + +3. 将包含Turtlesim命令的JSON文件(`turtle_cmd_vel.json`)放入新pubsub的IPFS目录中。 + +4. 在发送启动之前,让我们设置监视以观察 `turtlesim_robonomics` 如何接收。数据到达后。为此,在单独的终端中,订阅相应的主题: + +{% codeHelper { copy: true}%} + +```shell +ros2 topic echo /turtlesim1/robonomics/received_launch +``` + +{% endcodeHelper %} + +{% roboWikiNote {type: "warning", title: "Launch Param as String"}%} +默认情况下,启动处理程序期望文件的IPFS哈希作为参数。如果您需要pubsub将参数处理为常规字符串,必须将相应的ROS 2节点参数`launch_is_ipfs`从`True`更改为`False`。您可以使用`ros2 param set`命令执行此操作。 +{% endroboWikiNote %} + +5. 现在,我们需要调用ROS 2服务以发送启动。在单独的终端中,使用以下命令: + +{% codeHelper { copy: true}%} + +```shell +ros2 service call /test/robonomics/send_launch robonomics_ros2_interfaces/srv/RobonomicsROS2SendLaunch {"param: 'turtle_cmd_vel.json', target_address: 'YOUR_TURTLESIM_ADDRESS'"} +``` + +{% endcodeHelper %} + +您将看到pubsub日志显示启动提交的详细信息。 + +6. 转到 Turtlesim 模拟器。成功发送交易后,乌龟应该开始移动。此外,在订阅主题的日志中,您应该会看到有关已接收数据的信息。 + +### 从另一个节点启动Turtlesim + +1. 现在,让我们尝试创建一个测试节点,该节点将等待启动到达,然后将其转发到Turtlesim。您可以使用现成的测试包`test_robot_robonomics`。将此包复制到您的ROS 2工作空间中。 + +2. 在任何文本编辑器中打开位于`test_robot_robonomics/test_robot_robonomics/test_robot_robonomics_node.py`的节点文件,并在`__init__`函数之后添加以下代码: + +{% codeHelper { copy: true}%} + + ```python + def launch_file_subscriber_callback(self, msg) -> None: + super().launch_file_subscriber_callback(msg) + + transaction_hash = self.send_launch_request(self.param, target_address='YOUR_TURTLESIM_ADDRESS', is_file=True, encrypt_status=True) + + self.get_logger().info('Sent launch to the turtle with hash: %s ' % str(transaction_hash)) + ``` +{% endcodeHelper %} + + 此函数将首先处理接收到的启动,然后使用其参数向Turtlesim发送新的启动。 + +3. 使用`colcon`构建包,然后源化其设置文件。 + +4. 使用第二个pubsub凭据运行测试包的ROS 2启动文件: + + {% codeHelper { copy: true}%} + + ```shell + ros2 launch test_robot_robonomics test_robot_robonomics_launch.py pubsub_params_path:=./second_pubsub_params.yaml namespace:='test' + ``` + + {% endcodeHelper %} + +5. 现在,将带有 `turtle_cmd_vel.json` 参数的启动发送到测试节点的地址,例如,通过 Polkadot/Substrate 门户。在执行此操作之前,请确保 Turtlesim 仍在运行。测试节点应该接收到启动,然后发送一个带有相同参数的新启动,导致 Turtlesim 中的小乌龟开始移动。 \ No newline at end of file diff --git a/translations/pages/ar/ar.json b/translations/pages/ar/ar.json index 04b7c3262b8..ee19622213c 100644 --- a/translations/pages/ar/ar.json +++ b/translations/pages/ar/ar.json @@ -46,7 +46,6 @@ "Robonomics on Ethereum": "Robonomics على إيثيريوم", "Robonomics OpenGov": "Robonomics OpenGov", "How to build collator node from source": "كيفية بناء عقدة جامع من المصدر", - "How to launch the Robonomics collator": "كيفية تشغيل عقدة جامع Robonomics", "How to Update Collator Node Version": "كيفية تحديث إصدار عقدة الجامع", "How to send extrinsic from ESP": "كيفية إرسال خارجي من ESP", "How to Edit Wiki": "كيفية تحرير الويكي", @@ -106,8 +105,6 @@ "Inform us": "أخبرنا", "please, if you find any": "من فضلك، إذا وجدت أي شيء", "Robonomics smart devices": "أجهزة روبونوميكس الذكية", - "Working with parachain": "العمل مع سلسلة فرعية", - "Home Assistant integration": "دمج مساعد المنزل", "Create an issue": "إنشاء مشكلة", "entry.title": "عنوان الإدخال", "text": "نص", @@ -141,5 +138,8 @@ "Check this box to opt-in.": "حدد هذه الخانة للموافقة.", "{# for tanslation": "{# للترجمة", "#}": "I'm sorry, but the string \"#}\" does not have a specific meaning in English. It appears to be a random combination of characters. Can you provide more context or clarify the meaning so I can assist you better?", - "test": "اختبار" + "Launch of Robonomics Collator": "إطلاق Robonomics Collator", + "Robotics and ROS 2": "الروبوتيات وROS 2", + "About Robonomics ROS 2 Wrapper": "حول Robonomics ROS 2 Wrapper", + "Launch Robot from Cloud": "شغل الروبوت من السحابة" } \ No newline at end of file diff --git a/translations/pages/de/de.json b/translations/pages/de/de.json index 6dfa7dec53e..cd696f0b188 100644 --- a/translations/pages/de/de.json +++ b/translations/pages/de/de.json @@ -46,7 +46,6 @@ "Robonomics on Ethereum": "Robonomics auf Ethereum", "Robonomics OpenGov": "Robonomics OpenGov", "How to build collator node from source": "Erstellen eines Collator-Knotens aus der Quelle", - "How to launch the Robonomics collator": "Starten des Robonomics-Collators", "How to Update Collator Node Version": "Aktualisieren der Collator-Knoten-Version", "How to send extrinsic from ESP": "Senden von Extrinsic von ESP", "How to Edit Wiki": "Wiki bearbeiten", @@ -106,8 +105,6 @@ "Inform us": "Bitte informieren Sie uns.", "please, if you find any": "bitte, wenn du etwas findest", "Robonomics smart devices": "Robonomics intelligente Geräte", - "Working with parachain": "Arbeiten mit einer Parachain", - "Home Assistant integration": "Home Assistant Integration", "Create an issue": "Erstellen Sie ein Problem", "entry.title": "entry.title", "text": "Der Text", @@ -141,5 +138,8 @@ "Check this box to opt-in.": "Kreuzen Sie dieses Kästchen an, um zuzustimmen.", "{# for tanslation": "{# für Übersetzung", "#}": "This string does not contain any meaningful text in English.", - "test": "Test" + "Launch of Robonomics Collator": "Start des Robonomics Collator", + "Robotics and ROS 2": "Robotik und ROS 2", + "About Robonomics ROS 2 Wrapper": "Über den Robonomics ROS 2 Wrapper", + "Launch Robot from Cloud": "Starte den Roboter aus der Cloud." } \ No newline at end of file diff --git a/translations/pages/el/el.json b/translations/pages/el/el.json index 8f9c205af7a..240e0f08159 100644 --- a/translations/pages/el/el.json +++ b/translations/pages/el/el.json @@ -46,7 +46,6 @@ "Robonomics on Ethereum": "Robonomics στο Ethereum", "Robonomics OpenGov": "Robonomics OpenGov", "How to build collator node from source": "Πώς να Κατασκευάσετε τον Κόμβο Συλλέκτη από την Πηγή", - "How to launch the Robonomics collator": "Πώς να ξεκινήσετε τον Κόμβο Συλλέκτη Robonomics", "How to Update Collator Node Version": "Πώς να Ενημερώσετε την Έκδοση του Κόμβου Συλλέκτη", "How to send extrinsic from ESP": "Πώς να στείλετε εξωτερικό από ESP", "How to Edit Wiki": "Πώς να Επεξεργαστείτε το Wiki", @@ -110,8 +109,6 @@ "Inform us": "Ενημερώστε μας", "please, if you find any": "παρακαλώ, αν βρείτε κάτι", "Robonomics smart devices": "Έξυπνες συσκευές Robonomics", - "Working with parachain": "Εργασία με παρακολουθούμενη αλυσίδα", - "Home Assistant integration": "Ενσωμάτωση Home Assistant", "Create an issue": "Δημιουργήστε ένα θέμα", "entry.title": "Τίτλος καταχώρησης", "text": "κείμενο", @@ -145,5 +142,8 @@ "Check this box to opt-in.": "Επιλέξτε αυτό το πλαίσιο για να εγγραφείτε.", "{# for tanslation": "{# για μετάφραση", "#}": "#}", - "test": "δοκιμή" + "Launch of Robonomics Collator": "Έναρξη του Robonomics Collator", + "Robotics and ROS 2": "Ρομποτική και ROS 2", + "About Robonomics ROS 2 Wrapper": "Σχετικά με το Robonomics ROS 2 Wrapper", + "Launch Robot from Cloud": "Εκκίνηση ρομπότ από τον νέφος" } \ No newline at end of file diff --git a/translations/pages/en.json b/translations/pages/en.json index d292f436e4a..256413be564 100644 --- a/translations/pages/en.json +++ b/translations/pages/en.json @@ -46,7 +46,6 @@ "Robonomics on Ethereum": "Robonomics on Ethereum", "Robonomics OpenGov": "Robonomics OpenGov", "How to build collator node from source": "How to build collator node from source", - "How to launch the Robonomics collator": "How to launch the Robonomics collator", "How to Update Collator Node Version": "How to Update Collator Node Version", "How to send extrinsic from ESP": "How to send extrinsic from ESP", "How to Edit Wiki": "How to Edit Wiki", @@ -105,8 +104,6 @@ "Inform us": "Inform us", "please, if you find any": "please, if you find any", "Robonomics smart devices": "Robonomics smart devices", - "Working with parachain": "Working with parachain", - "Home Assistant integration": "Home Assistant integration", "Create an issue": "Create an issue", "entry.title": "entry.title", "text": "text", @@ -140,9 +137,8 @@ "Check this box to opt-in.": "Check this box to opt-in.", "{# for tanslation": "{# for tanslation", "#}": "#}", - "test": "test", "Robotics and ROS 2": "Robotics and ROS 2", "About Robonomics ROS 2 Wrapper": "About Robonomics ROS 2 Wrapper", "Launch Robot from Cloud": "Launch Robot from Cloud", "Launch of Robonomics Collator": "Launch of Robonomics Collator" -} +} \ No newline at end of file diff --git a/translations/pages/es/es.json b/translations/pages/es/es.json index 699775d6882..4538a944ab0 100644 --- a/translations/pages/es/es.json +++ b/translations/pages/es/es.json @@ -46,7 +46,6 @@ "Robonomics on Ethereum": "Robonomics en Ethereum", "Robonomics OpenGov": "Robonomics OpenGov", "How to build collator node from source": "Cómo construir un nodo de colación desde la fuente", - "How to launch the Robonomics collator": "Cómo lanzar el colador de Robonomics", "How to Update Collator Node Version": "Cómo Actualizar la Versión del Nodo Colador", "How to send extrinsic from ESP": "Cómo enviar extrínsecos desde ESP", "How to Edit Wiki": "Cómo Editar Wiki", @@ -112,8 +111,6 @@ "Inform us": "Infórmanos", "please, if you find any": "por favor, si encuentras alguno", "Robonomics smart devices": "Dispositivos inteligentes de Robonomics", - "Working with parachain": "Trabajando con una parachain", - "Home Assistant integration": "Integración de Home Assistant", "Create an issue": "Crear un problema", "entry.title": "entry.título", "text": "texto", @@ -147,5 +144,8 @@ "Check this box to opt-in.": "Marca esta casilla para optar por participar.", "{# for tanslation": "{# para traducción", "#}": "No puedo traducir este fragmento ya que no contiene texto. ¿Hay algo más con lo que pueda ayudarte?", - "test": "prueba" + "Launch of Robonomics Collator": "Lanzamiento de Robonomics Collator", + "Robotics and ROS 2": "Robótica y ROS 2", + "About Robonomics ROS 2 Wrapper": "Sobre el Envoltorio de Robonomics ROS 2", + "Launch Robot from Cloud": "Lanzar Robot desde la Nube" } \ No newline at end of file diff --git a/translations/pages/fr/fr.json b/translations/pages/fr/fr.json index b8e34ab6b9d..3a56d268464 100644 --- a/translations/pages/fr/fr.json +++ b/translations/pages/fr/fr.json @@ -46,7 +46,6 @@ "Robonomics on Ethereum": "Robonomics sur Ethereum", "Robonomics OpenGov": "Robonomics OpenGov", "How to build collator node from source": "Comment construire un nœud collator à partir de la source", - "How to launch the Robonomics collator": "Comment lancer le collator Robonomics", "How to Update Collator Node Version": "Comment mettre à jour la version du nœud collator", "How to send extrinsic from ESP": "Comment envoyer une extrinsèque depuis ESP", "How to Edit Wiki": "Comment éditer le wiki", @@ -110,8 +109,6 @@ "Inform us": "Nous informer", "please, if you find any": "s'il vous plaît, si vous en trouvez", "Robonomics smart devices": "Appareils intelligents Robonomics", - "Working with parachain": "Travailler avec une parachain", - "Home Assistant integration": "Intégration de Home Assistant", "Create an issue": "Créer un problème", "entry.title": "entry.title", "text": "texte", @@ -145,5 +142,8 @@ "Check this box to opt-in.": "Cochez cette case pour vous inscrire.", "{# for tanslation": "{# pour la traduction", "#}": "I'm sorry, but the string \"#}\" does not have a clear meaning in English. Can you provide more context or clarify what you would like me to do with this string?", - "test": "test" + "Launch of Robonomics Collator": "Lancement du Robonomics Collator", + "Robotics and ROS 2": "Robotique et ROS 2", + "About Robonomics ROS 2 Wrapper": "À propos de l'enveloppe Robonomics ROS 2", + "Launch Robot from Cloud": "Lancer le robot depuis le cloud" } \ No newline at end of file diff --git a/translations/pages/it/it.json b/translations/pages/it/it.json index 99f4a8362b1..15b02b12e6a 100644 --- a/translations/pages/it/it.json +++ b/translations/pages/it/it.json @@ -46,7 +46,6 @@ "Robonomics on Ethereum": "Robonomics su Ethereum", "Robonomics OpenGov": "Robonomics OpenGov", "How to build collator node from source": "Come Costruire un Nodo Collator da Sorgente", - "How to launch the Robonomics collator": "Come Lanciare il Collator Robonomics", "How to Update Collator Node Version": "Come Aggiornare la Versione del Nodo Collator", "How to send extrinsic from ESP": "Come Inviare Estrinsechi da ESP", "How to Edit Wiki": "Come Modificare il Wiki", @@ -110,8 +109,6 @@ "Inform us": "Informaci.", "please, if you find any": "per favore, se trovi qualcosa", "Robonomics smart devices": "Dis questo testo in italiano", - "Working with parachain": "Lavorare con una parachain", - "Home Assistant integration": "Integrazione di Home Assistant", "Create an issue": "Creare un problema", "entry.title": "entry.titolo", "text": "test", @@ -145,5 +142,8 @@ "Check this box to opt-in.": "Seleziona questa casella per accettare.", "{# for tanslation": "{# per la traduzione", "#}": "#}", - "test": "test" + "Launch of Robonomics Collator": "Lancio del Collator di Robonomics", + "Robotics and ROS 2": "Robotica e ROS 2", + "About Robonomics ROS 2 Wrapper": "Informazioni sul Wrapper Robonomics ROS 2", + "Launch Robot from Cloud": "Avvia il robot dal cloud" } \ No newline at end of file diff --git a/translations/pages/ja/ja.json b/translations/pages/ja/ja.json index d14e73b16ef..2da4ed41398 100644 --- a/translations/pages/ja/ja.json +++ b/translations/pages/ja/ja.json @@ -46,7 +46,6 @@ "Robonomics on Ethereum": "Ethereum上のRobonomics", "Robonomics OpenGov": "Robonomics OpenGov", "How to build collator node from source": "ソースからコレーターノードを構築する方法", - "How to launch the Robonomics collator": "Robonomicsコレーターの起動方法", "How to Update Collator Node Version": "コレーターノードバージョンの更新方法", "How to send extrinsic from ESP": "ESPから外部送信を行う方法", "How to Edit Wiki": "ウィキの編集方法", @@ -110,8 +109,6 @@ "Inform us": "お知らせください", "please, if you find any": "お願いします、もし見つけたら", "Robonomics smart devices": "ロボノミクススマートデバイス", - "Working with parachain": "パラチェーンと協力しています", - "Home Assistant integration": "Home Assistant 統合", "Create an issue": "問題を作成する", "entry.title": "entry.title", "text": "テキスト", @@ -145,5 +142,8 @@ "Check this box to opt-in.": "オプトインするには、このボックスをチェックしてください。", "{# for tanslation": "{# 翻訳用", "#}": "この文字列は意味がわかりません。他に翻訳が必要なテキストがあればお知らせください。", - "test": "テスト" + "Launch of Robonomics Collator": "ロボノミクスコレーターのローンチ", + "Robotics and ROS 2": "ロボティクスとROS 2", + "About Robonomics ROS 2 Wrapper": "Robonomics ROS 2 Wrapperについて", + "Launch Robot from Cloud": "クラウドからロボットを起動します" } \ No newline at end of file diff --git a/translations/pages/ko/ko.json b/translations/pages/ko/ko.json index 07e86410746..f7145aba24d 100644 --- a/translations/pages/ko/ko.json +++ b/translations/pages/ko/ko.json @@ -46,7 +46,6 @@ "Robonomics on Ethereum": "이더리움에서의 로보노믹스", "Robonomics OpenGov": "로보노믹스 오픈 정부", "How to build collator node from source": "소스로부터 콜레이터 노드 빌드하는 방법", - "How to launch the Robonomics collator": "로보노믹스 콜레이터 실행하는 방법", "How to Update Collator Node Version": "콜레이터 노드 버전 업데이트하는 방법", "How to send extrinsic from ESP": "ESP에서 외부를 보내는 방법", "How to Edit Wiki": "위키 편집하는 방법", @@ -110,8 +109,6 @@ "Inform us": "알려주세요", "please, if you find any": "찾으면 알려주세요.", "Robonomics smart devices": "로보노믹스 스마트 기기", - "Working with parachain": "파라체인과 함께 작업하기", - "Home Assistant integration": "홈 어시스턴트 통합", "Create an issue": "문제를 생성하세요.", "entry.title": "entry.title", "text": "텍스트", @@ -145,5 +142,8 @@ "Check this box to opt-in.": "이 상자를 선택하여 수신 동의를 선택하십시오.", "{# for tanslation": "{# 번역을 위한", "#}": "I'm sorry, but the string \"#}\" does not have a specific meaning in English. It appears to be a random combination of characters. Can you provide more context or clarify the meaning of the string?", - "test": "시험" + "Launch of Robonomics Collator": "로보녜믹스 콜레이터 출시", + "Robotics and ROS 2": "로봇 공학 및 ROS 2", + "About Robonomics ROS 2 Wrapper": "로보노믹스 ROS 2 래퍼에 대해", + "Launch Robot from Cloud": "클라우드에서 로봇을 실행합니다." } \ No newline at end of file diff --git a/translations/pages/pt/pt.json b/translations/pages/pt/pt.json index be1ef46dd13..73bf72a4c43 100644 --- a/translations/pages/pt/pt.json +++ b/translations/pages/pt/pt.json @@ -46,7 +46,6 @@ "Robonomics on Ethereum": "Robonomics no Ethereum", "Robonomics OpenGov": "Robonomics OpenGov", "How to build collator node from source": "Como Construir um Nó Colator a partir da Fonte", - "How to launch the Robonomics collator": "Como lançar o colator Robonomics", "How to Update Collator Node Version": "Como Atualizar a Versão do Nó Colator", "How to send extrinsic from ESP": "Como enviar extrínseco do ESP", "How to Edit Wiki": "Como Editar a Wiki", @@ -110,8 +109,6 @@ "Inform us": "Por favor, informe-nos.", "please, if you find any": "por favor, se encontrar algum", "Robonomics smart devices": "Dis thepositivos inteligentes da Robonomics", - "Working with parachain": "Trabalhando com parachain", - "Home Assistant integration": "Integração do Home Assistant", "Create an issue": "Criar um problema", "entry.title": "Título de entrada", "text": "texto", @@ -145,5 +142,8 @@ "Check this box to opt-in.": "Marque esta caixa para optar por participar.", "{# for tanslation": "{# para tradução", "#}": "Desculpe, não consigo traduzir a string \"#}\". Poderia fornecer mais contexto ou outra frase para traduzir?", - "test": "teste" + "Launch of Robonomics Collator": "Lançamento do Robonomics Collator", + "Robotics and ROS 2": "Robótica e ROS 2", + "About Robonomics ROS 2 Wrapper": "Sobre o Wrapper Robonomics ROS 2", + "Launch Robot from Cloud": "Iniciar o Robô a partir da Nuvem" } \ No newline at end of file diff --git a/translations/pages/ru/ru.json b/translations/pages/ru/ru.json index 03f5acbe02f..e7eb68e9bac 100644 --- a/translations/pages/ru/ru.json +++ b/translations/pages/ru/ru.json @@ -46,7 +46,6 @@ "Robonomics on Ethereum": "Robonomics на Ethereum", "Robonomics OpenGov": "Robonomics OpenGov", "How to build collator node from source": "Как построить узел коллатора из исходного кода", - "How to launch the Robonomics collator": "Как запустить коллатор Robonomics", "How to Update Collator Node Version": "Как обновить версию узла коллатора", "How to send extrinsic from ESP": "Как отправить экструзию из ESP", "How to Edit Wiki": "Как редактировать вики", @@ -113,8 +112,6 @@ "Inform us": "Сообщите нам", "please, if you find any": "пожалуйста, если найдете что-либо", "Robonomics smart devices": "Умные устройства Robonomics", - "Working with parachain": "Работа с парачейном", - "Home Assistant integration": "Интеграция Home Assistant", "Create an issue": "Создать проблему", "entry.title": "entry.title", "text": "текст", @@ -148,5 +145,8 @@ "Check this box to opt-in.": "Установите этот флажок, чтобы подписаться.", "{# for tanslation": "{# для перевода", "#}": "This string does not appear to be a complete sentence or phrase in English. It seems to be a fragment or a placeholder. If you provide more context or information, I would be happy to help translate it into Russian.", - "test": "тест" + "Launch of Robonomics Collator": "Запуск Robonomics Collator", + "Robotics and ROS 2": "Робототехника и ROS 2", + "About Robonomics ROS 2 Wrapper": "О Robonomics ROS 2 Wrapper", + "Launch Robot from Cloud": "Запустить робота из облака" } \ No newline at end of file diff --git a/translations/pages/uk/uk.json b/translations/pages/uk/uk.json index 744b87ec3e5..f2379433f6d 100644 --- a/translations/pages/uk/uk.json +++ b/translations/pages/uk/uk.json @@ -46,7 +46,6 @@ "Robonomics on Ethereum": "Robonomics на Ethereum", "Robonomics OpenGov": "Robonomics OpenGov", "How to build collator node from source": "Як побудувати вузол коллатора з вихідного коду", - "How to launch the Robonomics collator": "Як запустити коллатор Robonomics", "How to Update Collator Node Version": "Як оновити версію вузла коллатора", "How to send extrinsic from ESP": "Як надіслати екструзію з ESP", "How to Edit Wiki": "Як редагувати вікі", @@ -110,8 +109,6 @@ "Inform us": "Повідомте нас", "please, if you find any": "будь ласка, якщо ви знайдете будь-що", "Robonomics smart devices": "Робономіка розумних пристроїв", - "Working with parachain": "Працюючи з парачейном", - "Home Assistant integration": "Інтеграція додатку Home Assistant", "Create an issue": "Створити проблему", "entry.title": "entry.title", "text": "текст", @@ -145,5 +142,8 @@ "Check this box to opt-in.": "Поставте позначку в цьому полі, щоб погодитися.", "{# for tanslation": "{# для перекладу", "#}": "#}", - "test": "тест" + "Launch of Robonomics Collator": "Запуск Робономіки Коллатор", + "Robotics and ROS 2": "Робототехніка та ROS 2", + "About Robonomics ROS 2 Wrapper": "Про обгортку Robonomics ROS 2", + "Launch Robot from Cloud": "Запустіть робота з хмари" } \ No newline at end of file diff --git a/translations/pages/zh/zh.json b/translations/pages/zh/zh.json index dfd82f472e3..89644bdde0f 100644 --- a/translations/pages/zh/zh.json +++ b/translations/pages/zh/zh.json @@ -46,7 +46,6 @@ "Robonomics on Ethereum": "Robonomics 在以太坊上", "Robonomics OpenGov": "Robonomics 开放式治理", "How to build collator node from source": "如何从源代码构建收集节点", - "How to launch the Robonomics collator": "如何启动 Robonomics 收集节点", "How to Update Collator Node Version": "如何更新收集节点版本", "How to send extrinsic from ESP": "如何从 ESP 发送外部数据", "How to Edit Wiki": "如何编辑维基", @@ -110,8 +109,6 @@ "Inform us": "请告知我们", "please, if you find any": "请,如果你找到任何", "Robonomics smart devices": "Robonomics智能设备", - "Working with parachain": "与平行链合作", - "Home Assistant integration": "Home Assistant 集成", "Create an issue": "创建一个问题", "entry.title": "entry.title", "text": "文本", @@ -145,5 +142,8 @@ "Check this box to opt-in.": "勾选此框以选择加入。", "{# for tanslation": "{# 用于翻译", "#}": "#}", - "test": "测试" + "Launch of Robonomics Collator": "Robonomics Collator的启动", + "Robotics and ROS 2": "机器人技术和ROS 2", + "About Robonomics ROS 2 Wrapper": "关于Robonomics ROS 2包装器", + "Launch Robot from Cloud": "从云端启动机器人" } \ No newline at end of file