Please find an updated version of this posting for WSL 2 here
The Windows Subsystem for Linux (WSL) is a compatibility layer which allows to run a whole bunch of linux binaries natively on Windows 10. With the advent of the Windows 10 Creators Update in March 2017, the WSL was heavily updated and now is able to run ROS lunar and melodic.
In this blogpost I will show you how to install WSL and setup ROS to get started.
Update Windows 10
A recent version of Windows 10 needs to be installed for ROS to work. If you are in doubt, which version is installed go to Settings -> System -> About and check that you have at least
Version 1809 is recommended for optimal performance.
If you need to update Windows, got to Windows Update and follow the instructions.
Install the WSL and Bash on Windows
To install the Windows Subsystem for Linux and Bash on Windows, follow this guide.
In case you have used the WSL before applying the creators update, you may still have the trusty version (14.04) or the xenial version (16.04). However, to install ros melodic, you need ubuntu bionic 18.04.
To check which version is actually installed, start an instance of bash and run
lsb_release -a. The output should look like
$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 18.04.1 LTS Release: 18.04 Codename: bionic
If it shows an older version, you have to uninstall and then reinstall bash on windows from the windows command line as follows Warning: This will delete all of your existing data in WSL. Make a backup first
lxrun /uninstall /full /y lxrun /install
Since WSL is based on ubuntu, you can follow the official ros installation guide for ubuntu by the word.
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' curl -sSL 'http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xC1CF6E31E6BADE8868B172B4F42ED6FBAB17C654' | sudo apt-key add - sudo apt update sudo apt install -y ros-melodic-desktop-full sudo rosdep init rosdep update
If you want to source ros melodic automatically for ever bash session, then
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc source ~/.bashrc
Run a simple test
Start a new bash prompt and run
- Start a second bash prompt
- Create a new file
publish.pywith the contents
#!/usr/bin/env python import rospy from std_msgs.msg import String pub = rospy.Publisher('chatter', String, queue_size=10) rospy.init_node('talker', anonymous=True) rate = rospy.Rate(10) # 10hz while not rospy.is_shutdown(): hello_str = "hello world %s" % rospy.get_time() rospy.loginfo(hello_str) pub.publish(hello_str) rate.sleep()
Run the publisher
- Start a third bash prompt
- Create a new file
subscribe.pywith the contents
#!/usr/bin/env python import rospy from std_msgs.msg import String def callback(data): rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data) def listener(): rospy.init_node('listener', anonymous=True) rospy.Subscriber("chatter", String, callback) # spin() simply keeps python from exiting until this node is stopped rospy.spin() if __name__ == '__main__': listener()
Run the subscriber
To run applications with graphical output, you need to install an X Server on Windows. To me, VcXsrv now works best.
After you have installed VcXsrv, you also need to configure WSL to use it. To do so modify you .bashrc as follows
echo "export DISPLAY=:0" >> ~/.bashrc source ~/.bashrc
Finally, launch VcXsrv from the start menu. You can keep all default settings except
Native opengl which needs to be unchecked. Otherwise applications such as rviz do not run as expected.
The popular turtle_sim tutorial works fine WSL as well.
- Make sure you have an X Server installed, configured and running as described above.
- Start a new bash prompt and run
roslaunch turtle_tf turtle_tf_demo.launch
You can control the turtle by using the arrow keys by going back to the second prompt.
- Start a second bash prompt and run
rosrun rviz rviz -d `rospack find turtle_tf`/rviz/turtle_rviz.rviz
Some places recommend to force indirect rendering using
export LIBGL_ALWAYS_INDIRECT=1 for better OpenGL performance on WSL. However, with the versions of VcXsrv and Xming I tested, it is not possible to launch
rviz when this indirection is active, thus my recommendation is to not use OpenGL indirection for the time being.