ROS on Steam Deck

Not a question, more of a comment… :rofl:

It works a treat! I have up on the package manager as I’m new to Arch Linux but installing Noetic using RoboShack and its worked a treat!

I got my Turtlebot 3 up and running, got teleop working using the built in controllers, and fired up the SLAM package on the Deck and it’s worked an absolute treat!

I’m running a StereoPi board on the Turtlebot, tomorrow I’m going to try and get the stereo cameras working and see if I can generate a 3d map on here.


Nice one, I’ve been waiting for someone to try this and share their thoughts!

I think it seems like a fantastic candidate for development especially for educational contexts as you can (I believe) set it up to boot off the SD card and it could become like a Raspberry Pi. The Deck hardware could be owned by an institution, students could be provided with an SD card preimaged with what is needed, develop on the deck while docked, then unplug it and drive/monitor a robot. You could even imagine supplying 2x paired SD cards, one for a Pi in the robot and one for the Deck.

I’m keen to give it a go once they become available in Australia, but I think we could be waiting a long time…

1 Like

I’d hoped for similar when the Switch was announced but sadly Nintendo are dead against any kind of homebrew so that put an end to that. I am intrigued by running Windows on it to be honest and booting from Micro SD would save installing it if it didn’t work out. I have a Windows Mixed Reality Headset and I’ve been aiming to get ROS in to Unity to see if I can make use of it.

It needs a lot of tuning but with a Stereo Pi on my Turtlebot3 I’m generating a point cloud and rendering it on the Deck!


I had a request to test Foxglove Studio on twitter, the native app installed fine.

I think an actual ROS application in the Steam store would be the best solution, but with the desktop readily available it’s remarkably capable.

I’ve now switched over to building a Unity based controller, looks like it’ll run on most platforms Unity supports.

This was just a proof of concept, I think the concept is proven nicely!

1 Like

Did you need to do anything else than install according this guide?

I get the following error:

This is very exciting!

Also your cat seems remarkably ambivalent about your TurtleBot.

1 Like

That looks great! What OS are you using? directly Steamdeck? Any starting point suggestions for setting up ROS or ROS2 on the steamdeck?

Thank you

Toby is simultaneously afraid of nothing and freaked out by the smallest sounds, we’re pretty certain he’s actually five or six identical cats that live with us and we only see one at a time. It’d explain the different personalities at least!

1 Like

It’s Steam OS, stock and all I did was follow the steps in this video: ROS2 on Steamdeck - YouTube

I can’t remember having to do anything special, other than setting the hard drive to read/write as it’s in read only mode by default.

Hmm, not sure what’s happened there to be honest, I’ll fire up my Deck later and have a look. Pretty sure I just needed to activate the env and it was good to go. I may have changed something without realising it though.

As a workaround for rviz, I found this working: LD_PRELOAD=/home/deck/mambaforge/envs/ros_env/lib/ rviz.

Does anybody know how to make /dev/input/js0 actually output something? I can open the device, but moving the sticks doesn’t yield any output…

So, here’s our guide on setting Steam Deck to act as a ROS 1 robot controller! GitHub - ctu-vras/steam-deck-ros-controller: Steps done to configure Steam Deck as a ROS robot controller . I finally also resolved the gamepad button mapping issue, so now it runs rviz and joy_node without any issue! We will be continually updating the guide as we add more capabilities.

Also, a guide to install jsk_rviz_plugins is included (this package is available in robostack, but it is somehow incorrectly built, so it’s impossible to install it via mamba).


Thanks for sharing the instructions!

I’ve given installing Ubuntu 20.04 on the Deck a shot, but I had quite a bit of issues with the device being in a lizard mode by default. I’ll try to give your approach a shot soon!

+1, thanks for this.

1 Like

I have also try this yesterday.
I think the simpler and safer way is create a Ubuntu container use distrobox in the steamOS

After that, everything will proceed as usual

now I can run gazebo in my steamdeck

or control robot

check how to install distrobox


Oh nice! Just realized you’re using my RoboMaster ROS wrapper, very cool :slight_smile: :raised_hands:


In case anyone is reading this and wants to run ROS2 on a steam deck and is having trouble accessing the joystick values, I have a solution. Instead of making a new post, it seemed better to put this in the thread that pops up when you look up how to do this.

I’m running ROS2-Humble in an Ubuntu 22.04 distrobox container. That’s all well and good but the joy node that comes with Humble just would not run without erroring, and even then, accessing /dev/input/js0 is difficult in the steam deck.

The trick for me was to go into Steam Settings → Controller → Non Game Controller Layouts → Desktop Layout and set the layout to “Gamepad with Mouse Trackpad”.

Then you should be able to read /dev/input/js0 for the joystick data. I then used pygame in order to access the joystick and publish it on a joystick topic. Not sure if this was really simple for everyone else but I couldn’t find concrete ways to access joystick data anywhere, and everyone else’s tutorials didn’t work for me. Hope this helps someone.

Not sure why the site formats the code so weird but here it is

import rclpy
from rclpy.node import Node
from sensor_msgs.msg import Joy
import pygame

class JoystickNode(Node):
def init(self):
self.publisher_ = self.create_publisher(Joy, ‘joystick’, 10)

def get_joystick_input(self):


    # Assuming that you have only one joystick connected
    joystick = pygame.joystick.Joystick(0)

    while True:
        for event in pygame.event.get(): 
            if event.type == pygame.QUIT: 
            elif event.type == pygame.JOYBUTTONDOWN:
                print("Joystick button pressed.")
            elif event.type == pygame.JOYBUTTONUP:
                print("Joystick button released.")
        axes = []
        for i in range(joystick.get_numaxes()):
        buttons = []
        for i in range(joystick.get_numbuttons()):

        joy = Joy()
        joy.axes = axes
        joy.buttons = buttons

def main(args=None):

joystick_node = JoystickNode()

# Destroy the node explicitly

if name == ‘main’: