This is a ROS2 based project for the University of Iowa Robotics Club's Mars Rover. It is primarily designed around remote operation with future plans for partial or full autonomy. The rover is equipped with a 6 wheeled rocker bogie suspension system, a 5 DOF custom arm, and a variety of sensors. The onboard computing is handled by an Nvidia Jetson Orin coupled with a Teensy 4.1 microcontroller to assist with IO. The rover is equipped with an Intel Realsense depth camera, 3 Cameras, GPS, and a suite of miscellanious sensors for improved situational awareness.
Native Install:
- Ubuntu 24.04 LTS
Docker install:
- Any Unix based OS (Windows will also work, but has limititations)
- Docker
- Systemd based init system (for udev rules)
Clone the repository to your workspace
git clone https://github.com/roboticsatiowa/Rover.git
cd RoverInstall ROS2 (you may skip this step if you already followed install instructions from their documentation)
./tools/ros/install_ros.shInstall rosdep dependencies
./tools/ros/rosdep.shInstall additional dependencies
./tools/ros/install_dependencies.shInstall udev rules. These create more descriptive device names in /dev for example /dev/ttyACM0 -> /dev/ttyTEENSY and are required for ROS2 nodes to properly recognize hardware. More info in the man page ($ man udev)
./tools/misc/setup_udev.shA convenience script is provided to build the project
./tools/ros/build.sh
source install/setup.bashNote
You must source the install/setup.bash file in every new terminal so ROS2 can find the uirover packages. Otherwise you will see errors like package 'uirover_bringup' not found.
Important
Running source install/setup.bash will automatically set the appropriate environment variables for Zenoh Middleware. It defaults to using the basestation config file (zenoh_basestation.config.json5). If you are working on the rover you must manually set the ZENOH_ROUTER_CONFIG_URI environment variable to point to zenoh_rover.config.json5 in ~/.bashrc or manually before launching any nodes.
It is recommended to occasionally clean out the workspace. This will remove any generated files which can sometimes cause issues.
./tools/ros/clean.shBasestation launch
ros2 launch uirover_bringup basestation.launch.pyRover launch
ros2 launch uirover_bringup rover.launch.pyPreview the robot model in RViz. Useful when manually tweaking urdf files.
ros2 launch uirover_description preview.launch.pyMapproxy is a map tile provider which allows map data to be cached locally for offline use. To use it offline, the map cache must first be "seeded" with data from an online source.
To seed the map cache with data, run:
ros2 launch uirover_basestation mapproxy_seed.launch.pythis launch file starts the mapproxy server:
ros2 launch uirover_basestation mapproxy.launch.pyMap proxy UI can be found at http://localhost:8080/demo/ while the service is running.
Map tiles will be served at http://localhost:8080/tiles/satellite/webmercator/{z}/{x}/{y}.png where {x}, {y}, and {z} are the tile coordinates.
More info can be found in the mapproxy docs
MoveIt2 is a motion planning framework for ROS2. It will do inverse kinematics, path planning, and collision checking for the rover arm.
To view the demo for our arm, run:
ros2 launch uirover_moveit demo.launch.pyMore info can be found in the MoveIt2 docs
Warning
As of October 2025, MoveIt2's setup assistant has a fatal issue caused by a version incompatibility with Rviz2. The current workaround is to downgrade to an older version of Rviz2. The GitHub issue is found here. A script is provided to automate this process:
./tools/misc/moveit_rviz_workaround.shCamera streams (sources) and viewers (sinks) can be launched with the following commands:
ros2 launch uirover_perception gstream_source.launch.py
ros2 launch uirover_perception gstream_sink.launch.pyThe realsense D435i can be demoed with this file
ros2 launch uirover_perception realsense.launch.pyA more complete SLAM demo using the realsense can be run with
ros2 launch uirover_perception stereo_slam.launch.pyNote
To make full use of the D435i make sure that you are using a USB 3.0 compatible port and cable.
VCAN (Virtual Controller Area Network) is a linux kernel module which allows a CAN bus network to be simulated entirely on-system. This allows firmware to be tested in conditions nearly identical to the real world. The following script can be used to enable it
./tools/misc/enable_vcan.shyou can then check its working with
ip linkand you should see something like this
9: vcan0: <NOARP,UP,LOWER_UP> mtu 72 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/can
More info in the linux netmodule docs
To test nodes under lossy/delayed network conditions you may want to artificially induce packet loss, delay, and/or bandwidth restrictions on localhost. The following command will enable it:
sudo tc qdisc add dev lo root netem delay 200ms loss 20% 50%To disable this you may run
sudo tc qdisc delete dev lo root netemMore information can be found in the man page ($ man tc-netem)
- Ethan Holter @ethanholter
- Charlie Killian @charlie-killian
