{"id":24916856,"url":"https://github.com/bitmeal/rosproxy","last_synced_at":"2026-04-19T14:09:28.358Z","repository":{"id":57151283,"uuid":"394050772","full_name":"bitmeal/rosproxy","owner":"bitmeal","description":"A proxy for the Robot Operating System (ROS)","archived":false,"fork":false,"pushed_at":"2022-03-02T16:41:25.000Z","size":204,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-08-16T13:33:35.820Z","etag":null,"topics":["container","docker","proxy","ros"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bitmeal.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}},"created_at":"2021-08-08T19:17:34.000Z","updated_at":"2023-06-19T04:04:35.000Z","dependencies_parsed_at":"2022-08-31T20:02:36.341Z","dependency_job_id":null,"html_url":"https://github.com/bitmeal/rosproxy","commit_stats":null,"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/bitmeal/rosproxy","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bitmeal%2Frosproxy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bitmeal%2Frosproxy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bitmeal%2Frosproxy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bitmeal%2Frosproxy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bitmeal","download_url":"https://codeload.github.com/bitmeal/rosproxy/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bitmeal%2Frosproxy/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32009243,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T20:23:30.271Z","status":"online","status_checked_at":"2026-04-19T02:00:07.110Z","response_time":55,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["container","docker","proxy","ros"],"created_at":"2025-02-02T08:18:41.657Z","updated_at":"2026-04-19T14:09:28.336Z","avatar_url":"https://github.com/bitmeal.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ROSProxy\n\u003e 📌 Companion paper\n\u003e * DOI: [10.1109/SII52469.2022.9708884](https://doi.org/10.1109/SII52469.2022.9708884)\n\u003e * arXiv: [arXiv:2201.01613](https://arxiv.org/abs/2201.01613)\n\nTransparently proxy ROS communication between different networks - physical or virtual - or connect local containers to an external ROS network.\n\n## Get it!\n### npm\nthe npm package allows you to run the rosproxy cli as `rosproxy`; from everywhere when installed globally.\n```\nnpm install -g rosproxy\n```\n\n### container\nget it in a container form *ghcr.io*\n```\ndocker pull ghcr.io/bitmeal/rosproxy\n```\n\n## Use it\n* point the proxy to your ROS master\n* configure the proxy `http://\u003cinternal_hostname\u003e:\u003cport\u003e/master` as master for nodes to proxy\n* 🎉\n\n\n```\nrosproxy [options] [port]\n```\n* `--port/-p` (*default: copied from `$ROS_MASTER_URI`*): management/XMLRPC API port to listen on; must be available on internal (to be proxied) network segment\n* `--ros-master-uri/-m` or `$ROS_MASTER_URI`: ROS master address\n* `--hostname/-n` or `$ROS_HOSTNAME`/`$ROS_IP` (*default: machines hostname*): hostname to report to all ROS nodes for proxied endpoints; has to be available from the external (to be proxied to) network\n* `--port-range/-r` (*default: none/random allocation*): limit all port allocations (except master API) to given range; enables exposing nodes from containers\n* `--quiet/-q`: suppress output\n* `--debug/-d`: set log level `debug`\n\n### Example\nRunning ROSProxy using node/npm package. Will read master address and hostname from ROS environment variable configuration and use same port as your ROS master:\n```bash\n# assuming configured ROS environment:\n# ROS_MASTER_URI=http://yourmasteruri:11311/\n# ROS_HOSTNAME=myhost\nrosproxy\n```\n\nRun a node with proxied connection:\n```bash\nROS_MASTER_URI=http://myhost:11311/ rosrun \u003cpkg\u003e \u003cnode\u003e\n```\n\n### Proxying containerized ROS nodes\nUsing ROSProxy you can enable containerized ROS nodes to communicate with nodes running \"directly\" on a network - and vice versa.\nBelow *docker-compose* file uses a container *node* running some ROS node, and a *rosproxy* container. As in the example above, `ROS_MASTER_URI` is set to the actual masters address for the proxy and the proxy address for the node. We configure ROSProxy to allocate all its proxy ports from the range `50000-50100`, which should serve *~50* nodes (*n/2*). This port range gets forwarded to the host and will make all containerized nodes using the proxy available from the outside.\n```yaml\nversion: '3.8'\n\nservices:\n  node:\n    image: ros:noetic-ros-core\n    environment:\n    - ROS_MASTER_URI=http://rosproxy:11311/\n    - ROS_HOSTNAME=node\n    command: ['rosrun', '\u003cpkg\u003e', '\u003cnode\u003e']\n    depends_on:\n    - rosproxy\n  \n  rosproxy:\n    image: ghcr.io/bitmeal/rosproxy\n    environment:\n    - ROS_MASTER_URI=http://roscore:11311/\n    - ROS_HOSTNAME=rosproxy\n    command: ['-r', '50000-50100']\n    ports:\n    - \"50000-50100\"\n```\n\n\n## Development\n### Testing\n\u003e ⚠ Test requires *docker*/*docker-compose* (and *WSL* on Windows)\n\n```bash\nnpm test\n```\n\nTests use `bats` testing framework. Running `npm test` will take care of most things and report what's missing.\nInfo and error messages generated by `npm test` may **not** be *TAP* compliant! To ensure machine readable output, init submodules manually and ensure all dependencies to be available.\n\n* Tests are executed in a *docker-compose* setup, recreating a NAT routed setup with internal and external networks.\n* Use ASCII collation order `LC_COLLATE=C` when running bats without using `test/test.bash`\n\n## License and citing\nThe source code provided in this repository is licensed under MPL 2.0. *A different license may apply to binary versions of this software!*\n\nIf used in published research, please cite as:\n* A. Wendt and T. Schüppstuhl, \"Proxying ROS communications — enabling containerized ROS deployments in distributed multi-host environments,\" 2022 IEEE/SICE International Symposium on System Integration (SII), 2022, pp. 265-270, DOI: [10.1109/SII52469.2022.9708884](https://doi.org/10.1109/SII52469.2022.9708884).\n\nYou may use following BibTeX entry:\n```bibtex\n@inproceedings{Wendt_Schuppstuhl_2021_ROSProxy,\n    author={Wendt, Arne and Sch{\\\"u}ppstuhl, Thorsten},\n    booktitle={{2022 IEEE/SICE International Symposium on System Integration (SII)}},\n    title={{Proxying ROS communications — enabling containerized ROS deployments in distributed multi-host environments}},\n    year={2022},\n    pages={265-270},\n    doi={10.1109/SII52469.2022.9708884}\n}\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbitmeal%2Frosproxy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbitmeal%2Frosproxy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbitmeal%2Frosproxy/lists"}