linorobot2 is a ROS2 port of the linorobot package

Overview

linorobot2

linorobot2

linorobot2 is a ROS2 port of the linorobot package. If you're planning to build your own custom ROS2 robot (2WD, 4WD, Mecanum Drive) using accessible parts, then this package is for you. This repository contains launch files to easily integrate your DIY robot with Nav2 and a simulation pipeline to run and verify your experiments on a virtual robot in Gazebo.

Once the robot's URDF has been configured in linorobot2_description package, users can easily switch between booting up the physical robot and spawning the virtual robot in Gazebo.

linorobot2_architecture

Assuming you're using one of the tested sensors, linorobot2 automatically launches the necessary hardware drivers, with the topics being conveniently matched with the topics available in Gazebo. This allows users to define parameters for high level applications (ie. Nav2 SlamToolbox, AMCL) that are common to both virtual and physical robots.

The image below summarizes the topics available after running bringup.launch.py. linorobot2_microcontroller

An in-depth tutorial on how to build the robot is available in linorobot2_hardware.

Installation

This package requires ros-foxy or ros-galactic. If you haven't installed ROS2 yet, you can use this installer script that has been tested to work on x86 and ARM based dev boards ie. Raspberry Pi4/Nvidia Jetson Series.

1. Robot Computer - linorobot2 Package

The easiest way to install this package on the robot computer is to run the bash script found in this package's root directory. It will install all the dependencies, set the ENV variables for the robot base and sensors, and create a linorobot2_ws (robot_computer_ws) on the robot computer's $HOME directory. If you're using a ZED camera with a Jetson Nano, you must create a custom Ubuntu 20.04 image for CUDA and the GPU driver to work. Here's a quick guide on how to create a custom image for Jetson Nano.

source /opt/ros/
   
    /setup.bash
cd /tmp
wget https://raw.githubusercontent.com/linorobot/linorobot2/master/install_linorobot2.bash
bash install_linorobot2.bash 
     
      
      
       
source ~/.bashrc

      
     
    
   

robot_type:

  • 2wd - 2 wheel drive robot.
  • 4wd - 4 wheel drive robot.
  • mecanum - Mecanum drive robot.

laser_sensor:

Sensors marked with an asterisk are depth sensors. If a depth sensor is used as a laser sensor, the launch files will run depthimage_to_laserscan to convert the depth sensor's depth image to laser scans.

depth_sensor:

Alternatively, follow this guide to do the installation manually.

2. Host Machine / Development Computer - Gazebo Simulation (Optional)

This step is only required if you plan to use Gazebo later. This comes in handy if you want to fine-tune parameters (ie. SLAM Toolbox, AMCL, Nav2) or test your applications on a virtual robot.

2.1 Install linorobot2 Package

Install linorobot2 package on the host machine:

cd 
   
    
git clone https://github.com/linorobot/linorobot2 src/linorobot2
rosdep update && rosdep install --from-path src --ignore-src -y --skip-keys microxrcedds_agent --skip-keys micro_ros_agent
colcon build
source install/setup.bash

   
  • microxrcedds_agent and micro_ros_agent dependency checks are skipped to prevent this issue of finding its keys. This means that you have to always add --skip-keys microxrcedds_agent --skip-keys micro_ros_agent whenever you have to run rosdep install on the ROS2 workspace where you installed linorobot2.

2.2 Define Robot Type

Set LINOROBOT2_BASE env variable to the type of robot base used. Available env variables are 2wd, 4wd, and mecanum. For example:

> ~/.bashrc source ~/.bashrc ">
echo "export LINOROBOT2_BASE=2wd" >> ~/.bashrc
source ~/.bashrc

You can skip the next step (Host Machine - RVIZ Configurations) since this package already contains the same RVIZ configurations to visualize the robot.

3. Host Machine - RVIZ Configurations

Install linorobot2_viz package to visualize the robot remotely specifically when creating a map or initializing/sending goal poses to the robot. The package has been separated to minimize the installation required if you're not using the simulation tools on the host machine.

cd 
   
    
git clone https://github.com/linorobot/linorobot2_viz src/linorobot2_viz
rosdep update && rosdep install --from-path src --ignore-src -y 
colcon build
source install/setup.bash

   

Hardware and Robot Firmware

All the hardware documentation and robot microcontroller's firmware can be found here.

URDF

1. Define robot properties

linorobot2_description package has parameterized xacro files that can help you kickstart writing the robot's URDF. Open .properties.urdf.xacro in linorobot2_description/urdf directory and change the values according to the robot's specification/dimensions. All pose definitions must be measured from the base_link (center of base) and wheel positions (ie wheel_pos_x) are referring to wheel 1.

For custom URDFs, you can change the urdf_path in description.launch.py found in linorobot2_description/launch directory.

Robot Orientation:

--------------FRONT--------------

WHEEL1 WHEEL2 (2WD/4WD)

WHEEL3 WHEEL4 (4WD)

--------------BACK--------------

Build the robot computer's workspace to load the new URDF:

cd 
   
    
colcon build

   

The same changes must be made on the host machine's .properties.urdf.xacro if you're simulating the robot in Gazebo. Remember to also build the host machine's workspace after editing the xacro file.

cd 
   
    
colcon build

   

2. Visualize the newly created URDF

Robot Computer:

ros2 launch linorobot2_description description.launch.py

Optional parameters for simulation on host machine:

  • rviz - Set to true to visualize the robot in rviz2 and only if you're configuring the URDF from the host machine. For example:

      ros2 launch linorobo2_description description.launch.py rviz:=true
    

Host Machine:

The rviz argument on description.launch.py won't work on headless setup but you can visualize the robot remotely from the host machine:

ros2 launch linorobot2_viz robot_model.launch.py

Quickstart

All commands below are to be run on the robot computer unless you're running a simulation or rviz2 to visualize the robot remotely from the host machine. SLAM and Navigation launch files are the same for both real and simulated robots in Gazebo.

1. Booting up the robot

1.1a Using a real robot:

ros2 launch linorobot2_bringup bringup.launch.py

Optional parameters:

  • base_serial_port - Serial port of the robot's microcontroller. The assumed value is /dev/ttyACM0. Otherwise, change the default value to the correct serial port. For example:

    ros2 launch linorobot2_bringup bringup.launch.py base_serial_port:=/dev/ttyACM1
    
  • joy - Set to true to run the joystick node in the background. (Tested on Logitech F710).

Always wait for the microROS agent to be connected before running any application (ie. creating a map or autonomous navigation). Once connected, the agent will print:

| Root.cpp             | create_client     | create
| SessionManager.hpp   | establish_session | session established

The agent needs a few seconds to get reconnected (less than 30 seconds). Unplug and plug back in the microcontroller if it takes longer than usual.

1.1b Using Gazebo:

ros2 launch linorobot2_bringup gazebo.launch.py

linorobot2_bringup.launch.py or gazebo.launch.py must always be run on a separate terminal before creating a map or robot navigation when working on a real robot or gazebo simulation respectively.

2. Controlling the robot

2.1 Keyboard Teleop

Run teleop_twist_keyboard to control the robot using your keyboard:

ros2 run teleop_twist_keyboard teleop_twist_keyboard

Press:

  • i - To drive the robot forward.
  • , - To reverse the robot.
  • j - To rotate the robot CCW.
  • l - To rotate the robot CW.
  • shift + j - To strafe the robot to the left (for mecanum robots).
  • shift + l - To strafe the robot to the right (for mecanum robots).
  • u / o / m / . - Used for turning the robot, combining linear velocity x and angular velocity z.

2.2 Joystick

Pass joy argument to the launch file and set it to true to enable the joystick. For example:

ros2 launch linorobot2_bringup bringup.launch.py joy:=true
  • On F710 Gamepad, the top switch should be set to 'X' and the 'MODE' LED should be off.

Press Button/Move Joystick:

  • RB (First top right button) - Press and hold this button while moving the joysticks to enable control.
  • Left Joystick Up/Down - To drive the robot forward/reverse.
  • Left Joystick Left/Right - To strafe the robot to the left/right.
  • Right Joystick Left/Right - To rotate the robot CW/CCW.

3. Creating a map

3.1 Run SLAM Toolbox:

ros2 launch linorobot2_navigation slam.launch.py

Optional parameters for simulation on host machine:

For example:

ros2 launch linorobot2_navigation slam.launch.py rviz:=true sim:=true
  • sim - Set to true for simulated robots on the host machine. Default value is false.
  • rviz - Set to true to visualize the robot in RVIZ. Default value is false.

3.1 Run rviz2 to visualize the robot from host machine:

The rviz argument on slam.launch.py won't work on headless setup but you can visualize the robot remotely from the host machine:

ros2 launch linorobot2_viz slam.launch.py

3.2 Move the robot to start mapping

Drive the robot manually until the robot has fully covered its area of operation. Alternatively, the robot can also receive goal poses to navigate autonomously while mapping:

ros2 launch nav2_bringup navigation_launch.py
  • Pass use_sim_time:=true to the launch file when running in simulation.

More info here.

3.3 Save the map

cd linorobot2/linorobot2_navigation/maps
ros2 run nav2_map_server map_saver_cli -f 
   
     --ros-args -p save_map_timeout:=10000

   

4. Autonomous Navigation

4.1 Load the map you created:

Open linorobot2/linorobot2_navigation/launch/navigation.launch.py and change MAP_NAME to the name of the newly created map. Build the robot computer's workspace once done:

cd 
   
    
colcon build

   

Alternatively, map argument can be used when launching Nav2 (next step) to dynamically load map files. For example:

ros2 launch linorobot2_navigation navigation.launch.py map:=
   
    /
    
     .yaml

    
   

4.2 Run Nav2 package:

ros2 launch linorobot2_navigation navigation.launch.py

Optional parameter for loading maps:

  • map - Path to newly created map .

Optional parameters for simulation on host machine:

  • sim - Set to true for simulated robots on the host machine. Default value is false.
  • rviz - Set to true to visualize the robot in RVIZ. Default value is false.

4.3 Run rviz2 to visualize the robot from host machine:

The rviz argument for navigation.launch.py won't work on headless setup but you can visualize the robot remotely from the host machine:

ros2 launch linorobot2_viz navigation.launch.py

Check out Nav2 tutorial for more details on how to initialize and send goal pose.

Troubleshooting Guide

1. The changes I made on a file are not taking effect on the package configuration/robot's behavior.

  • You need to build your workspace every time you modify a file:

    cd 
         
          
    colcon build
    #continue what you're doing...
    
         

2. [slam_toolbox]: Message Filter dropping message: frame 'laser'

  • Try to up transform_timeout by 0.1 in linorobot2_navigation/config/slam.yaml until the warning is gone.

3. target_frame - frame does not exist

  • Check your .properties.urdf.xacro and ensure that there's no syntax errors or repeated decimal points.

Useful Resources:

https://navigation.ros.org/setup_guides/index.html

http://gazebosim.org/tutorials/?tut=ros2_overview

Owner
linorobot
linorobot
This a Chess PGN saver which allows you to save your game pgns, in a .pgn file

PGN Saver This a Chess PGN saver which allows you to save your game pgns, in a .pgn file This can be a very useful tool for the people using chessbase

3 Jan 06, 2022
Text-Adventure-Game [Open Source] A group project by the Python TASK Force

Text-Adventure-Game [Open Source] A group project by the Python TASK Force

Mircea Dumitrescu 2 Sep 17, 2021
Chess - A python gui application

Chess Python version 3.10 or greater is required to play. Note This is a gui application, and as such will not run inside WSL.

Jonxslays 1 Dec 16, 2021
Simple implementation of the classic Snake Game in under 100 lines of code

Snake_Game Simple python implementation of the classic Snake Game in under 100 lines of code. Printscreen of the game: Imported Libraries: random; pyg

Raffaele Fiorillo 2 Jun 13, 2022
Tic-Tac-Toe Game in python3 Tkinter

Tic Tac Toe Tic-Tac-Toe Game in python3 Tkinter About: Tic Tac Toe or Noughts and Crosses as called in British is a pencil and paper game for two play

Sai Swarup Yakkala 5 Nov 06, 2022
This repository has the lessons of the gamming programming course

learning-python-game-programming This repository has the lessons of the gamming programming course Na faculdade, estou fazendo a disciplina de program

Mateus Faustino 1 Nov 16, 2021
Quiz game made entirely with python and pygame for school work

Tabela de conteúdo Descrição Como instalar Linguagens usadas Contribuidores Créditos Problemas com o jogo? Contate-nos Descrição Quiz feito inteiramen

3 Apr 12, 2022
A pygame implementation of John Conway's Game of Life

Game of Life A Pygame Simulation This is a Pygame implementation of the famous Conway's Game of Life. The game features a set of very simple rules: An

1 Jan 06, 2022
Repository containing documentation about the Minecraft Legacy FUI file structure

Repository containing documentation about the Minecraft Legacy FUI file structure

Miku-666 6 Dec 29, 2022
Inflitator is a classic doom and wolfenstein3D like game made in Python, using the famous PYGAME module.

INFLITATOR Raycaster INFLITATOR is a raycaster made in Python3 with Pygame. It is a game built on top of a simple engine of the same name. An example

Zanvok Corporation 1 Jan 07, 2022
Pyout - A little Krakout clone called Pyout written in Python 3

Pyout My little Krakout clone called Pyout written in Python 3

Jan Karger ツ ☀ 4 Feb 20, 2022
:tada: 2048 in your terminal

term2048 term2048 is a terminal-based version of 2048. Install pip install term2048 To upgrade a previous installation, use: pip install -U term2048

Baptiste Fontaine 798 Nov 21, 2022
A classic alien shooting game.

Space-Invaders A classic alien shooting game. Description An open source game created by me and friends. How to play Install the latest python version

Phạm Thanh Sơn 1 Feb 08, 2022
PyCharge is an open-source computational electrodynamics Python simulator

PyCharge PyCharge is an open-source computational electrodynamics Python simulator that can calculate the electromagnetic fields and potentials genera

Matthew Filipovich 28 Jan 03, 2023
A simple matrix code rain created using Python with Pygame.

Matrix4_code_rain A simple matrix code rain created using Python with Pygame. To run the code you will need Pygame and MS Mincho font. Create a projec

7 Nov 06, 2022
This is a simple tic tac toe game that runs in the command line.

Tic Tac Toe Game This is a simple tic tac toe game that runs in the command line. Game Description: The game is made up of a square grid with 9 portio

Josias Aurel 2 Nov 12, 2022
An asynchronous Minecraft server wrapper written in python3 with asyncio

mark3 (WIP) A modern Minecraft server wrapper written in python3 with asyncio TODO Note: The order of the following checklist doesn't necessarily mean

Colin Andress 7 Jul 29, 2022
Chess GUI

Lucas Chess Lucas Chess is a GUI of chess: To learn to play chess. To play chess against engines. Dependencies Python 2.7 PyQt4 PyAudio psutil Python

Lucas 322 Dec 20, 2022
AI that plays Flappy Bird Game using the python module NEAT.

Flappy Bird AI [NEAT] AI that plays Flappy Bird Game using the python module NEAT. Instructions Install Python Modules: pip3 install -r requirements.t

Abhisht 5 Jan 26, 2022
A python3 project for generating WorldEdit shematics for the MineClone2 game for Minetest from images.

MineClone2 MapArt This is a python3 project you can use with the MineClone2 game for Minetest. This project take an image and output a WorldEdit shema

3 Jan 06, 2023