{"id":19134091,"url":"https://github.com/um-arm-lab/conq_ros","last_synced_at":"2026-06-18T02:31:24.894Z","repository":{"id":250216332,"uuid":"833334551","full_name":"UM-ARM-Lab/conq_ros","owner":"UM-ARM-Lab","description":"ROS2 integration for Conq, our Boston Dynamics Spot Robot","archived":false,"fork":false,"pushed_at":"2024-07-25T22:13:18.000Z","size":10689,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":9,"default_branch":"main","last_synced_at":"2025-11-13T02:03:45.532Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/UM-ARM-Lab.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,"publiccode":null,"codemeta":null}},"created_at":"2024-07-24T20:39:07.000Z","updated_at":"2024-07-25T22:14:38.000Z","dependencies_parsed_at":"2024-07-25T23:38:43.580Z","dependency_job_id":null,"html_url":"https://github.com/UM-ARM-Lab/conq_ros","commit_stats":null,"previous_names":["um-arm-lab/conq_ros"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/UM-ARM-Lab/conq_ros","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/UM-ARM-Lab%2Fconq_ros","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/UM-ARM-Lab%2Fconq_ros/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/UM-ARM-Lab%2Fconq_ros/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/UM-ARM-Lab%2Fconq_ros/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/UM-ARM-Lab","download_url":"https://codeload.github.com/UM-ARM-Lab/conq_ros/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/UM-ARM-Lab%2Fconq_ros/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34474063,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-18T02:00:06.871Z","response_time":128,"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":[],"created_at":"2024-11-09T06:25:25.289Z","updated_at":"2026-06-18T02:31:24.878Z","avatar_url":"https://github.com/UM-ARM-Lab.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"spot.jpg\" width=\"350\"\u003e\n  \u003ch1 align=\"center\"\u003eConq ROS2\u003c/h1\u003e\n  \u003cp align=\"center\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/python-3.12.4-blue\"/\u003e\n    \u003ca href=\"https://github.com/astral-sh/ruff\"\u003e\n      \u003cimg src=\"https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json\"/\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/psf/black\"\u003e\n      \u003cimg src=\"https://img.shields.io/badge/code%20style-black-000000.svg\"/\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://github.com/bdaiinstitute/spot_ros2/actions/workflows/ci.yml\"\u003e\n      \u003cimg src=\"https://github.com/bdaiinstitute/spot_ros2/actions/workflows/ci.yml/badge.svg?branch=main\"/\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://coveralls.io/github/bdaiinstitute/spot_ros2?branch=main\"\u003e\n      \u003cimg src=\"https://coveralls.io/repos/github/bdaiinstitute/spot_ros2/badge.svg?branch=main\"/\u003e\n    \u003c/a\u003e\n    \u003ca href=\"LICENSE\"\u003e\n      \u003cimg src=\"https://img.shields.io/badge/license-MIT-purple\"/\u003e\n    \u003c/a\u003e\n  \u003c/p\u003e\n\u003c/p\u003e\n\n# Overview\nThis is a ROS 2 package for Boston Dynamics' Spot, aka. Conq. The package contains all necessary topics, services and actions to teleoperate or navigate Spot. This package currently corresponds to version 4.0.2 of the [spot-sdk](https://github.com/boston-dynamics/spot-sdk/releases/tag/v4.0.2).\n\n## Prerequisites\nThis package is tested for Ubuntu 22.04.4, Python 3.12.4, conda 24.5.0, and ROS2 Humble, which can be installed following [this guide](https://docs.ros.org/en/humble/Installation/Ubuntu-Install-Debians.html). \n\n## Installation\nIn your ROS 2 workspace `src` directory, clone the repository:\n```bash\ngit clone git@github.com:UM-ARM-Lab/conq_ros.git\n```\nor \n```bash\ngit clone https://github.com/UM-ARM-ALB/conq_ros.git\n```\n\nand initialize and install the submodules:\n```bash\ncd conq_ros\ngit submodule init\ngit submodule update\n```\n\nThen run the install script to install the necessary Boston Dynamics and ROS dependencies. The install script takes the optional argument ```--arm64```; it otherwise defaults to an AMD64 install. Run the correct command based on your system:\n```bash\ncd \u003cpath to conq_ros\u003e\n./install_conq_ros.sh\nor\n./install_conq_ros.sh --arm64\n```\nFrom here, build and source the ROS 2 workspace:\n```\ncd \u003cros2 ws\u003e\nsource /opt/ros/humble/setup.bash\ncolcon build --symlink-install --packages-ignore proto2ros_tests\nsource install/local_setup.bash\n```\n\nWe suggest ignoring the `proto2ros_tests` package in the build as it is not necessary for running the driver. If you choose to build it, you will see a number of error messages from testing the failure paths. \n\n# Spot ROS 2 Driver \n\n### FIXME: Some parameters not working as expected \n\nThe Spot driver contains all of the necessary topics, services, and actions for controlling Spot over ROS 2. To launch the driver, run:\n```\nros2 launch spot_driver spot_driver.launch.py [config_file:=\u003cpath/to/config.yaml\u003e] [spot_name:=Conq] [publish_point_clouds:=\u003cTrue|False\u003e] [launch_rviz:=\u003cTrue|False\u003e] [uncompress_images:=\u003cTrue|False\u003e] [publish_compressed_images:=\u003cTrue|False\u003e]\n```\n\n## Configuration\n\nThe Spot login data hostname, username and password can be specified either as ROS parameters or as environment variables.  If using ROS parameters, see [`spot_driver/config/spot_ros_example.yaml`](spot_driver/config/spot_ros_example.yaml) for an example of what your file could look like.  If using environment variables, define `BOSDYN_CLIENT_USERNAME`, `BOSDYN_CLIENT_PASSWORD`, and `SPOT_IP`.\n\n## Simple Robot Commands\nMany simple robot commands can be called as services from the command line once the driver is running. For example:\n\n* `ros2 service call /Conq/sit std_srvs/srv/Trigger`\n* `ros2 service call /Conq/stand std_srvs/srv/Trigger`\n* `ros2 service call /Conq/undock std_srvs/srv/Trigger`\n* `ros2 service call /Conq/power_off std_srvs/srv/Trigger`\n\nIf your Spot has an arm, some additional helpful services are exposed:\n* `ros2 service call /Conq/arm_stow std_srvs/srv/Trigger`\n* `ros2 service call /Conq/arm_unstow std_srvs/srv/Trigger`\n* `ros2 service call /Conq/arm_carry std_srvs/srv/Trigger`\n* `ros2 service call /Conq/open_gripper std_srvs/srv/Trigger`\n* `ros2 service call /Conq/close_gripper std_srvs/srv/Trigger`\n\nThe full list of interfaces provided by the driver can be explored via `ros2 topic list`, `ros2 service list`, and `ros2 action list`. For more information about the custom message types used in this package, run `ros2 interface show \u003cinterface_type\u003e`.\n\n## Examples\nSee [`spot_examples`](spot_examples/) for some more complex examples of using the ROS 2 driver to control Conq, which typically use the action servers provided by the driver. \n\n## Images\nPerception data from Spot is handled through the `spot_image_publishers.launch.py` launchfile, which is launched by default from the driver. If you want to only view images from Spot, without bringing up any of the nodes to control the robot, you can also choose to run this launchfile independently.\n\nBy default, the driver will publish RGB images as well as depth maps from the `frontleft`, `frontright`, `left`, `right`, and `back` cameras on Spot (plus `hand` if your Spot has an arm). You can customize the cameras that are streamed from by adding the `cameras_used` parameter to your config yaml. (For example, to stream from only the front left and front right cameras, you can add `cameras_used: [\"frontleft\", \"frontright\"]`). Additionally, if your Spot has greyscale cameras, you will need to set `rgb_cameras: False` in your configuration YAML file, or you will not receive any image data.\n\nBy default, the driver does not publish point clouds. To enable this, launch the driver with `publish_point_clouds:=True`.\n\nThe driver can publish both compressed images (under `/Conq/camera/\u003ccamera location\u003e/compressed`) and uncompressed images (under `/Conq/camera/\u003ccamera location\u003e/image`). By default, it will only publish the uncompressed images. You can turn (un)compressed images on/off by launching the driver with the flags `uncompress_images:=\u003cTrue|False\u003e` and `publish_compressed_images:=\u003cTrue|False\u003e`.\n\nThe driver also has the option to publish a stitched image created from Conq's front left and front right cameras (similar to what is seen on the tablet). If you wish to enable this, launch the driver with `stitch_front_images:=True`, and the image will be published under `/Conq/camera/frontmiddle_virtual/image`. In order to receive meaningful stitched images, you will have to specify the parameters `virtual_camera_intrinsics`, `virtual_camera_projection_plane`, `virtual_camera_plane_distance`, and `stitched_image_row_padding` (see [`spot_driver/config/spot_ros_example.yaml`](spot_driver/config/spot_ros_example.yaml) for some default values). \n\n\u003e **_NOTE:_**  \nIf your image publishing rate is very slow, you can try \n\u003e - connecting to your robot via ethernet cable \n\u003e - exporting a custom DDS profile we have provided by running the following in the same terminal your driver will run in, or adding to your `.bashrc`:\n\u003e ```\n\u003e export=FASTRTPS_DEFAULT_PROFILES_FILE=\u003cpath_to_file\u003e/custom_dds_profile.xml\n\u003e ```\n\n## Spot CAM\nDue to known issues with the Spot CAM, it is disabled by default. To enable publishing and usage over the driver, add the following command in your configuration YAML file:\n    `initialize_spot_cam: True`\n\nThe Spot CAM payload has known issues with the SSL certification process in https. If you get the following errors:\n\n```\nnon-existing PPS 0 referenced\ndecode_slice_header error\nno frame!\n```\n\nThen you want to log into the Spot CAM over the browser. In your browser, type in:\n\n    https://\u003cip_address_of_spot\u003e:\u003csdp_port\u003e/h264.sdp.html\n\nThe default port for SDP is 31102 for the Spot CAM. Once inside, you will be prompted to log in using your username and password. Do so and the WebRTC frames should begin to properly stream.\n\n\n# Advanced Install\n\n## Install spot_msgs as a deb package\n`spot_msgs` are normally compiled as part of this repository.  If you would prefer to install them as a debian package, follow the steps below:\n```bash\nwget -q -O /tmp/ros-humble-spot-msgs_0.0.0-0jammy_amd64.deb https://github.com/bdaiinstitute/spot_ros2/releases/download/spot_msgs-v0.0-0/ros-humble-spot-msgs_0.0.0-0jammy_amd64.deb\nsudo dpkg -i /tmp/ros-humble-spot-msgs_0.0.0-0jammy_amd64.deb\nrm /tmp/ros-humble-spot-msgs_0.0.0-0jammy_amd64.deb\n```\n\n## Install bosdyn_msgs from source\nThe `bosdyn_msgs` package is installed as a debian package as part of the `install_spot_ros2` script because it's very large.  It can be checked out from source [here](https://github.com/bdaiinstitute/bosdyn_msgs) and then built as a normal ROS 2 package if that is preferred (compilation takes about 15 minutes).\n\n\n## Verify Package Versions\nIf you encounter `ModuleNotFoundErrors` with `bosdyn` packages upon running the driver, it is likely that the necessary Boston Dynamics API packages did not get installed with `install_spot_ros2.sh`. To check this, you can run the following command. Note that all versions should be `4.0.2`. \n```bash\n$ pip list | grep bosdyn\nbosdyn-api                               4.0.2\nbosdyn-api-msgs                          4.0.2\nbosdyn-auto-return-api-msgs              4.0.2\nbosdyn-autowalk-api-msgs                 4.0.2\nbosdyn-choreography-client               4.0.2\nbosdyn-client                            4.0.2\nbosdyn-core                              4.0.2\nbosdyn-graph-nav-api-msgs                4.0.2\nbosdyn-keepalive-api-msgs                4.0.2\nbosdyn-log-status-api-msgs               4.0.2\nbosdyn-metrics-logging-api-msgs          4.0.2\nbosdyn-mission                           4.0.2\nbosdyn-mission-api-msgs                  4.0.2\nbosdyn-msgs                              4.0.2\nbosdyn-spot-api-msgs                     4.0.2\nbosdyn-spot-cam-api-msgs                 4.0.2\n```\nIf these packages were not installed correctly on your system, you can try manually installing them following [Boston Dynamics' guide](https://dev.bostondynamics.com/docs/python/quickstart#install-spot-python-packages).\n\nThe above command verifies the installation of the `bosdyn` packages from Boston Dynamics and the generated protobuf to ROS messages in the `bosdyn_msgs` package (these have `msgs` in the name). You can also verify the `bosdyn_msgs` installation was correct with the following command:\n```bash\n$ ros2 pkg xml bosdyn_msgs -t version\n4.0.2\n```\n\nFinally, you can verify the installation of the `spot-cpp-sdk` with the following command:\n```\n$ dpkg -l spot-cpp-sdk\n||/ Name           Version      Architecture Description\n+++-==============-============-============-=================================\nii  spot-cpp-sdk   4.0.2        amd64        Boston Dynamics Spot C++ SDK\n```\n\n# License\n\nMIT license - parts of the code developed specifically for ROS 2.\nBSD3 license - parts of the code derived from the Clearpath Robotics ROS 1 driver.\n\n# Contributing\nTo contribute, install `pre-commit` via pip, run `pre-commit install` and then run `pre-commit run --all-files` to \nverify that your code will pass inspection. \n```bash\ngit clone https://github.com/bdaiinstitute/spot_ros2.git\ncd spot_ros2\npip3 install pre-commit\npre-commit install\npre-commit run --all-files\n```\n\nNow whenever you commit code to this repository, it will be checked against the `pre-commit` hooks. You can also run\n`git commit --no-verify` if you wish to commit without checking against the hooks. \n\n## Contributors\n\nThis project is a collaboration between the [Mobile Autonomous Systems \u0026 Cognitive Robotics Institute](https://maskor.fh-aachen.de/en/) (MASKOR) at [FH Aachen](https://www.fh-aachen.de/en/) and the [Boston Dynamics AI Institute](https://theaiinstitute.com/).\n\nMASKOR contributors:\n\n* Maximillian Kirsch\n* Shubham Pawar\n* Christoph Gollok\n* Stefan Schiffer\n* Alexander Ferrein\n\nBoston Dynamics AI Institute contributors:\n\n* Jenny Barry\n* Daniel Gonzalez\n* Tao Pang\n* David Surovik\n* Jiuguang Wang\n* David Watkins\n\n[Linköping University](https://liu.se/en/organisation/liu/ida) contributors:\n\n* Tommy Persson\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fum-arm-lab%2Fconq_ros","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fum-arm-lab%2Fconq_ros","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fum-arm-lab%2Fconq_ros/lists"}