{"id":48112624,"url":"https://github.com/husarion/rosbot-telepresence","last_synced_at":"2026-04-04T16:09:55.353Z","repository":{"id":92214439,"uuid":"601701584","full_name":"husarion/rosbot-telepresence","owner":"husarion","description":"Real-Time Internet Control and Video Streaming with ROSbot 2R / 2 PRO","archived":false,"fork":false,"pushed_at":"2024-03-04T16:53:43.000Z","size":2283,"stargazers_count":8,"open_issues_count":0,"forks_count":2,"subscribers_count":2,"default_branch":"ros2router","last_synced_at":"2024-03-04T18:31:03.677Z","etag":null,"topics":["dds","foxglove","ros2","telepresence-robot"],"latest_commit_sha":null,"homepage":"","language":"Just","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/husarion.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2023-02-14T16:26:51.000Z","updated_at":"2024-03-04T17:46:49.000Z","dependencies_parsed_at":null,"dependency_job_id":"fb62e819-1d56-4167-bc63-5740e90638a1","html_url":"https://github.com/husarion/rosbot-telepresence","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/husarion/rosbot-telepresence","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/husarion%2Frosbot-telepresence","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/husarion%2Frosbot-telepresence/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/husarion%2Frosbot-telepresence/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/husarion%2Frosbot-telepresence/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/husarion","download_url":"https://codeload.github.com/husarion/rosbot-telepresence/tar.gz/refs/heads/ros2router","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/husarion%2Frosbot-telepresence/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31405620,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T10:20:44.708Z","status":"ssl_error","status_checked_at":"2026-04-04T10:20:06.846Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dds","foxglove","ros2","telepresence-robot"],"created_at":"2026-04-04T16:09:54.719Z","updated_at":"2026-04-04T16:09:55.330Z","avatar_url":"https://github.com/husarion.png","language":"Just","funding_links":[],"categories":[],"sub_categories":[],"readme":"# rosbot-telepresence\n\nManual ROSbot Driving over the Internet with Real-Time Camera Feed\n\n![ROSbot ROS2 user interface](.docs/rosbot-rviz.png)\n\n\u003e [!NOTE]\n\u003e There are two setups on two separate branches available\n\u003e | branch name | description |\n\u003e | - | - |\n\u003e | [**ros2router**](https://github.com/husarion/rosbot-telepresence/tree/ros2router) (the current one)| Running ROS 2 containers on ROSbot and on PC with the interface in RViz |\n\u003e | [**foxglove**](https://github.com/husarion/rosbot-telepresence/tree/foxglove) | Running ROS 2 containers only on ROSbot with a web user interface powered by Foxglove |\n\n## 🛍️ Necessary Hardware\n\nFor the execution of this project **[ROSbot 2R or ROSbot 2 PRO](https://husarion.com/manuals/rosbot/)** is required. \n\nYou can find it at [our online store](https://store.husarion.com/collections/robots/products/rosbot).\n\n## Quick start\n\n\u003e [!NOTE]\n\u003e To simplify the execution of this project, we are utilizing [just](https://github.com/casey/just).\n\u003e\n\u003e Install it with:\n\u003e\n\u003e ```bash\n\u003e curl --proto '=https' --tlsv1.2 -sSf https://just.systems/install.sh | sudo bash -s -- --to /usr/bin\n\u003e ```\n\nTo see all available commands just run `just`:\n\n```bash\nhusarion@rosbot2r:~/rosbot-telepresence$ just\nAvailable recipes:\n    connect-husarnet joincode hostname # connect to Husarnet VPN network\n    flash-firmware    # flash the proper firmware for STM32 microcontroller in ROSbot 2R / 2 PRO\n    start-rosbot      # start containers on ROSbot 2R / 2 PRO\n    start-pc          # start containers on PC\n    run-teleop        # run teleop_twist_keybaord (host)\n    run-teleop-docker # run teleop_twist_keybaord (inside rviz2 container)\n    run-joy           # enable the F710 gemapad (connected to your PC) to control ROSbot\n    sync hostname=\"${ROBOT_NAMESPACE}\" password=\"husarion\" # copy repo content to remote host with 'rsync' and watch for changes\n```\n\n### 🌎 Step 1: Connecting ROSbot and Laptop over VPN\n\nEnsure that both ROSbot 2R (or ROSbot 2 PRO) and your laptop are linked to the same Husarnet VPN network. If they are not follow these steps:\n\n1. Setup a free account at [app.husarnet.com](https://app.husarnet.com/), create a new Husarnet network, click the **[Add element]** button and copy the code from the **Join Code** tab.\n\n2. Run in the linux terminal on your PC:\n\n   ```bash\n   cd rosbot-telepresence/ # remember to run all \"just\" commands in the repo root folder\n   export JOINCODE=\u003cPASTE_YOUR_JOIN_CODE_HERE\u003e\n   just connect-husarnet $JOINCODE my-laptop\n   ```\n\n3. Run in the linux terminal of your ROSbot:\n\n   ```bash\n   export JOINCODE=\u003cPASTE_YOUR_JOIN_CODE_HERE\u003e\n   sudo husarnet join $JOINCODE rosbot2r\n   ```\n\n\u003e [!NOTE]\n\u003e That `rosbot2r` is a default ROSbot hostname used in this project. If you want to change it, edit the `.env` file and change\n\u003e\n\u003e ```bash\n\u003e ROBOT_NAMESPACE=rosbot2r\n\u003e ```\n\n### 📡 Step 2: Sync\n\nCopy the local changes (on PC) to the remote ROSbot\n\n```bash\njust sync\n```\n\n\u003e [!NOTE]\n\u003e This `just sync` automatically sync to device described by `ROBOT_NAMESPACE` inside `.env` file. Script locks the terminal and synchronizes online all changes made locally on the robot.\n\n### 💻 Step 3: Launching the Control Interface on PC\n\nAt first start the ROS 2 Router and RViz:\n\n```bash\njust start-pc\n```\n\nAnd run `teleop_twist_keyboard` directly on the host OS or in Docker (choose one option):\n\n```bash\njust run-teleop-docker\n# or\n# just run-teleop\n```\n\n### 🤖 Step 4: Launching the Containers on ROSbot\n\n\u003e Execute the commands below in the ROSbot's shell (you can access it with `ssh husarion@rosbot2r`)\n\nInside `rosbot-telepresence` run below command to flash the right version of the firmware:\n\n```bash\njust flash-firmware\n```\n\nAnd run the containers\n\n```bash\njust start-rosbot\n```\n\n## Useful tips\n\n### 1. Using Logitech F710 gamepad\n\nRather than employing the `teleop_twist_keyboard` ROS 2 package, you have the option to use the Logitech F710 gamepad. To utilize it, plug it into your PC's USB port and launch the `joy2twist` container on your PC:\n\n```bash\njust run-joy\n```\n\n![ROSbot control with gamepad](.docs/gamepad-legend.jpg)\n\n### 2. Checking a datarate\n\nTo assess the data rate of a video stream being transmitted over the Husarnet VPN (which appears in your OS as the `hnet0` network interface), execute the following:\n\n```bash\nhusarion@rosbot:~$ ifstat -i hnet0\n      wlan0\n KB/s in  KB/s out\n    6.83   2744.66\n    1.67   2659.88\n    1.02   2748.40\n```\n\n### 3. Sending uncompressed video frames over the network\n\nIf raw image data is being transmitted over the network, you need to perform some [DDS-tunning](https://docs.ros.org/en/humble/How-To-Guides/DDS-tuning.html) (both on ROSbot and PC):\n\nFor configs in LAN:\n\n```bash\nsudo sysctl -w net.ipv4.ipfrag_time=3 # 3s\nsudo sysctl -w net.ipv4.ipfrag_high_thresh=134217728 # (128 MB)\n```\n\nFor configs over VPN:\n\n```bash\nsudo sysctl -w net.ipv6.ip6frag_time=3 # 3s\nsudo sysctl -w net.ipv6.ip6frag_high_thresh=134217728 # (128 MB)\n```\n\n## Troubleshooting\n\n### `Packet was not a Theora header` warning\n\nThe log from your computer where you launched `compose.pc.yaml` may contain the following message:\n\n```bash\n[WARN] [1704479601.591809892] [rviz]: [theora] Packet was not a Theora header\n```\n\nDue to an issue in the theora codec, headers are probably sent only at the start. If you've initiated `compose.pc.yaml` following `compose.yaml`, it's essential to restart the `astra` service on ROSbot.\n\nTo do so, execute in the ROSbot's terminal in the `/home/husarion/rosbot-telepresence` folder the following line:\n\n```bash\ndocker compose restart astra\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhusarion%2Frosbot-telepresence","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhusarion%2Frosbot-telepresence","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhusarion%2Frosbot-telepresence/lists"}