This node provides HTTP streaming of ROS image topics in various formats, making it easy to view robot camera feeds and other image topics in a web browser without requiring special plugins or extensions.
- Stream ROS image topics over HTTP in multiple formats:
- MJPEG (Motion JPEG)
- VP8 (WebM)
- VP9 (WebM)
- H264 (MP4)
- PNG streams
- ROS compressed image topics
- Adjustable quality, size, and other streaming parameters
- Web interface to browse available image topics
- Single image snapshot capability
- Support for different QoS profiles in ROS 2
- ROS (Noetic) or ROS 2 (Humble+)
- OpenCV
- FFmpeg/libav
- Boost
- async_web_server_cpp
For newer ROS2 distributions (humble, jazzy, rolling) it is possible to install web_video_server as a package:
sudo apt install ros-${ROS_DISTRO}-web-video-server
Create a ROS workspace if you don't have one:
mkdir -p ~/ros_ws/src
cd ~/ros_ws/src
Clone this repository:
# ROS 2
git clone https://github.com/RobotWebTools/web_video_server.git
# ROS 1
git clone https://github.com/RobotWebTools/web_video_server.git -b ros1
Install dependencies with rosdep:
cd ~/ros_ws
rosdep update
rosdep install --from-paths src -i
Build the package and source your workspace:
colcon build --packages-select web_video_server
source install/setup.bash
# ROS 1
rosrun web_video_server web_video_server
# ROS 2
ros2 run web_video_server web_video_server
Parameter | Type | Default | Possible Values | Description |
---|---|---|---|---|
port |
int | 8080 | Any valid port number | HTTP server port |
address |
string | "0.0.0.0" | Any valid IP address | HTTP server address (0.0.0.0 allows external connections) |
server_threads |
int | 1 | 1+ | Number of server threads for handling HTTP requests |
ros_threads |
int | 2 | 1+ | Number of threads for ROS message handling |
verbose |
bool | false | true, false | Enable verbose logging |
default_stream_type |
string | "mjpeg" | "mjpeg", "vp8", "vp9", "h264", "png", "ros_compressed" | Default format for video streams |
publish_rate |
double | -1.0 | -1.0 or positive value | Rate for republishing images (-1.0 means no republishing) |
You can configure the server by passing parameters via the command line:
# ROS 1
rosrun web_video_server web_video_server _port:=8081 _address:=localhost _server_threads:=4
# ROS 2
ros2 run web_video_server web_video_server --ros-args -p port:=8081 -p address:=localhost -p server_threads:=4
http://localhost:8080/
The interface allows quick navigation between different topics and formats without having to manually construct URLs.
This page displays:
- All available ROS image topics currently being published
- Direct links to view each topic in different formats:
- Web page with streaming image
- Direct stream
- Single image snapshot
There are two ways to stream the Image, as a HTML page via
http://localhost:8080/stream_viewer?topic=/camera/image_raw
or as a HTTP multipart stream on
http://localhost:8080/stream?topic=/camera/image_raw
The following parameters can be added to the stream URL:
Parameter | Type | Default | Possible Values | Description |
---|---|---|---|---|
topic |
string | (required) | Any valid ROS image topic | The ROS image topic to stream |
type |
string | "mjpeg" | "mjpeg", "vp8", "vp9", "h264", "png", "ros_compressed" | Stream format |
width |
int | 0 | 0+ | Width of output stream (0 = original width) |
height |
int | 0 | 0+ | Height of output stream (0 = original height) |
quality |
int | 95 | 1-100 | Quality for MJPEG and PNG streams |
bitrate |
int | 100000 | Positive integer | Bitrate for H264/VP8/VP9 streams in bits/second |
invert |
flag | not present | present/not present | Invert image when parameter is present |
default_transport |
string | "raw" | "raw", "compressed", "theora" | Image transport to use |
qos_profile |
string | "default" | "default", "system_default", "sensor_data", "services_default" | QoS profile for ROS 2 subscribers |
Examples:
# Stream an MJPEG at 640x480 with 90% quality
http://localhost:8080/stream?topic=/camera/image_raw&type=mjpeg&width=640&height=480&quality=90
# Stream H264 with higher bitrate
http://localhost:8080/stream?topic=/camera/image_raw&type=h264&bitrate=500000
# Stream with inverted image (rotated 180°)
http://localhost:8080/stream?topic=/camera/image_raw&invert
It is also possible to get a single image snapshot
http://localhost:8080/snapshot?topic=/camera/image_raw
Parameter | Type | Default | Possible Values | Description |
---|---|---|---|---|
topic |
string | (required) | Any valid ROS image topic | The ROS image topic to stream |
width |
int | 0 | 0+ | Width of output picture (0 = original width) |
height |
int | 0 | 0+ | Height of output picture (0 = original height) |
quality |
int | 95 | 1-100 | Quality for JPEG snapshots |
invert |
flag | not present | present/not present | Invert image when parameter is present |
default_transport |
string | "raw" | "raw", "compressed", "theora" | Image transport to use |
qos_profile |
string | "default" | "default", "system_default", "sensor_data", "services_default" | QoS profile for ROS 2 subscribers |
This project is released as part of the Robot Web Tools effort.
web_video_server is released with a BSD license. For full terms and conditions, see the LICENSE file.
See the AUTHORS file for a full list of contributors.