What if you are in a hurry and have to visit a person inside a building with dozens of rooms and floors? What will you do if you want to shop for clothes from a big mall and do not want to waste time? Here Comes the idea of Indoor navigation. Indoor navigation provides you with inner maps of buildings and malls. Also, it helps you guide all the way through to your required room or shop.

Indoor navigation is being used in many products for a long time. Smartphone apps and hardware-based devices are usually used for this purpose. The major problem in indoor navigation is the extensive use of SLAM using depth cameras or hardware Beacons etc. For example, Bluetooth beacons and other RF-based beacons frequently become under consideration for this purpose. In order to eliminate the need for cameras and beacons and too, to make a stand-alone indoor navigation device, relying just on IMU is inevitable.


The proposed solution is based on a data publishing master node installed at the entrance of a building containing floor layout plan (stored after some preprocessing), and a Client Node (a smart band) with 10 DOF IMU subscribed to the publishing Master node. Both of the Nodes are running ROS (Robot Operating System), in the case of Master node ROS, it is pre-processing and publishing the data to save the processing overhead that might be faced by Client Node. While the Client node, with ROS, is running Odometer and Navigation planning algorithms to allow standalone indoor navigation.


In the implementation, the first thing you need is the Intel’s Joule which will act as your operating system. The Intel Joule Compute Module is Intel’s newest and highest-performing computer module. The platform features high-end compute and graphics, large memory, low-power consumption, a range of high-speed I/Os, and an open software and hardware ecosystem. It’s an ideal platform for innovative IoT edge computer applications and products requiring advanced computer vision. This fast computing device has your building layout plan and a Rviz (a robotic simulation software) based simulation running on robot operating system. In the simulation, you have a humane model walking inside a given layout plan in accordance with the orders given through input.



This simulation is synchronized with the second major module that is a smart wristband. The smart band has the required sensors to measure the direction, acceleration, height and step count of the user. As the band user walks, his direction, acceleration, and steps count values are sent to the processor which assign these values to the simulation model and the person in the simulation moves accordingly. Similarly, when a turn or stairs arrive, Joule quickly processes the layout plan and send the information (turn or climb) to the smart band user. On arriving the room or office, selected from the options on a band, simulation is processed the layout plan and send the message “Goal Reached” to the user. Here is the block diagram showing interaction between devices and cloud.



In the implementation of Indoor navigation, the basic software infrastructure is provided by the Robot operation system. Before going thoroughly deep into the procedure we followed to implement the navigation protocol, one needs to have basic knowledge of Robot Operating system. ROS (Robot Operating System) actually provides libraries and tools to help software developers create robot applications. It provides hardware abstraction, device drivers, libraries, visualizers, message-passing, package management, and more. ROS is licensed under an open source, BSD license.


What is ROS?

Robot Operating System is a software platform that is used to control and process our robots. It allows you with hardware abstraction, low-level device control, and communication between two or more nodes. It actually provides you with all the services that you would expect from other operating systems. Most importantly, it provides algorithms, tools, and libraries for obtaining, building, writing, and running code across multiple computers.

Why ROS?

  • ROS implements several different styles of communication, including synchronous RPC (remote procedure call) style communication over Service, asynchronous streaming of data over topics, and storage of data on a Parameter Server.
  • ROS is a distributed framework of processes that enables executable to be individually designed and loosely coupled at runtime. These processes can be grouped into Packages and Stacks, which can be easily shared and distributed. ROS also supports a federated system of code Repositories that enable collaboration to be distributed as well. This design, from the file system level to the community level, enables independent decisions about development and implementation, but all can be brought together with ROS infrastructure tools.
  • ROS is language independent. It can be programmed in many modern programming languages like C++ Python and Lisp. Some libraries are also written in Java and Lua.
  • As far as accurate sensing and precision is the need, nothing better than ROS. With tilted sensors, lasers and sensors attached to moving parts, it provides you with high accuracy.
  • Ros is a powerful and flexible tool. It uses OpenCV library in many interesting ways. Also, it supports many robot simulation soft wares such as Gazebo and Rviz etc.

Operating System

ROS work only on Unix based platforms. Soft wares integrated with ROS are only tested on Ubuntu and Mac OS. ROS can be used with Windows OS, but it is not fully explored.

ROS Concepts

Coordinate Frames: The “tf” (is a package in ROS that) provides a distributed, ROS-based framework for calculating the positions of multiple coordinate frames over time.

Action or Tasks: provides a standardized interface for interfacing with preempt-able tasks. Examples of this include moving the base to a target location, performing a laser scan and returning the resulting point cloud, detecting the handle of a door, etc.

Message ontology: The Common messages stack provide a base message ontology for robotic systems. It defines several classes of messages, including:

  • actionlib msgs: messages for representing actions
  • diagnostic msgs: messages for sending diagnostic data
  • geometry msgs: messages for representing common geometric primitives
  • nav msgs: messages for navigation
  • sensor msgs: messages for representing sensor data

Plugins: pluginlib provides a library for dynamically loading libraries in C++ code.

Filters: The filter package provides a C++ library for processing data using a sequence of filters.

Client Libraries

A ROS client library is a collection of code that eases the job of the ROS programmer. It takes many of the ROS concepts and makes them accessible via code. In general, these libraries let you write ROS “nodes”, publish and subscribe to “topics”, write and call “services”, and use the Parameter service. Such a library can be implemented in any programming language, though the current focus is on C++ and Python support.

Main client libraries:

  • roscpp: roscpp is a C++ client library for ROS. It is the most widely used ROS client library and is designed to be the high-performance library for ROS
  • rospy: rospy is the pure Python client library for ROS and is designed to provide the advantages of an object-oriented scripting language to ROS. The design of rospy favors implementation speed over runtime performance so that algorithms can be quickly prototyped


Intel’s Joule:

The Intel Joule Compute Module is Intel’s newest and highest-performing computer module. The platform features high-end compute and graphics, large memory, low-power consumption, a range of high-speed I/Os, and an open software and hardware ecosystem. It is an ideal platform for innovative IoT edge computer applications and products requiring advanced computer vision. The Joule dev board is small, about as wide as a quarter, and allows you to quickly prototype a concept and take into production, saving both time and money. Intel’s Joule also offers more memory and storage, 4K video capture and display, varied high-speed physical interfaces, and broader OS support. The Joule Kits will be available in two different versions: the 550x, which features a 1.5GHz quad-core Atom T5500 processor, 3GB of RAM and 8GB of storage; and the 570x includes a 1.7GHz quad-core Atom T5700 CPU, 4GB of RAM and 16GB of storage. Both models have “laptop class” 802.11AC wireless, Intel graphics, and a Linux-based OS.


Node MCU (ESP8266 Wi-Fi Module)

Node MCU is an open source IoT platform. It includes firmware which runs on the ESP8266 Wifi module SoC (System on Chip) from Espressive Systems, and hardware which is based on the ESP-12 module. The term “Node MCU” by default refers to the firmware rather than the development kits. The firmware uses the Lua scripting language. It is based on the eLua project and built on the Espressif Non-OS SDK for ESP8266. It uses many open source projects, such as lua-cjson and spiffs. The main core of the Smart band is the Node MCU. All the sensors, encoders and OLEDs are integrated with it. It has the wifi module (esp8266) which transfers and receives the sensors data from and to the master Node which is Joule and finally operate OLED accordingly.



This board combines 5 sensors into a single tiny package. Convenient to experiment with different sensors or used together as an inertial management unit. They are all accessible via I2C bus.

Sensor Name                            Part Number           I2C Address

3 Axis  Gyro                                    L3G4200D                0x69

3 Axis Accelerometer                 ADXL345                   0x53

3 Axis  Magnetometer               MC5883L                   0x1E

Barometer +Thermometer      BMP085                     0x77


All sensors are accessible via I2C bus for basic operation so you will only need 4 wires to get started:

  • GND – Ground
  • Supply voltage. GY80 is 5v and 3.3v compatible. Use one of the     following depending on your interface voltage:

·         VCC –         +5v power for Arduino UNO, mega e.t.c

·         VCC_3.3v  +3.3v power for boards such as Arduino Due.

  • SCL – I2C Clock
  • SDA – I2C Data

Battery Management System TP4056:


The TP4056 is a complete constant-current/constant-voltage linear charger for single cell lithium-ion batteries. Its SOP package and low external component count make the TP4056 ideally suited for portable applications. In a Navigation Band, small 8000 mAh rechargeable LiPo cell battery is being used to power the internal circuitry of the smart band that is Node MCU, OLED, Rotary Encoder, GY80, and GY471. Over some time of consumption, it needs to be recharged in order to make the band working. TP4650 is a battery charging system IC that automatically start charging the battery when needed and cut off the charging when the battery is full.

  • Programmable Charge Current Up to1000mA
  • No MOSFET, Sense Resistor or blocking diode Required
  • Complete Linear Charger in SOP-8Package for Single Cell Lithium-IonBatteries
  • Constant-Current/Constant-Voltage Charges Single Cell Li-Ion Batteries Directly from USB Port
  • Preset 4.2V Charge Voltage with 1.5%Accuracy
  • Automatic Recharge
  • Two Charge Status Output Pins
  • C/10 Charge Termination
  • 2.9V Trickle Charge Threshold (TP4056)
  • Soft-Start Limits Inrush Current
  • Available Radiator in 8-Lead SOP Package, the Radiator need connect GND or impending

Rotary Encoder:

A rotary encoder, also called a shaft encoder, is an electro-mechanical device that converts the angular position or motion of a shaft or axle to an analog or digital signal. In a smart Band, it is used to shift the menu options up and down and to select the desired option of the OLED screen. The internal circuitry is also shown below.


Communication Protocols

MQTT Protocol:

The Communication protocols used for transfer of data between the master node and the smart band here is the MQTT protocol. MQTT stands for MQ Telemetry Transport. It is a publish/subscribe, extremely simple and lightweight messaging protocol, designed for constrained devices and low-bandwidth, high-latency or unreliable networks. The design principles are to minimize network bandwidth and device resource requirements whilst also attempting to ensure reliability and some degree of assurance of delivery. These principles also turn out to make the protocol ideal of the emerging “machine-to-machine” (M2M) or “Internet of Things” world of connected devices, and for mobile applications where bandwidth and battery power are at a premium. As of March 2013, MQTT is in the process of undergoing standardization at OASIS. The protocol specification has been openly published with a royalty-free license for many years, and companies such as Eurotech (formerly known as Arcom) have implemented the protocol in their products.


You can pass a username and password with an MQTT packet in V3.1 of the protocol. Encryption across the network can be handled with SSL, independently of the MQTT protocol itself (it is worth noting that SSL is not the lightest of protocols and does add significant network overhead). Additional security can be added by an application encrypting data that it sends and receives, but this is not something built-in to the protocol, in order to keep it simple and lightweight.

Advanced Encryption Standard (AES) protocol:

The Advanced Encryption Standard (AES) is a specification for the encryption of electronic data established by the U.S. National Institute of Standards and Technology (NIST) in 2001.

AES is a subset of the Rijndael cipher developed by two Belgian cryptographers, Vincent Rijmen and Joan Daemen, who submitted a proposal to NIST during the AES selection process. Rijndael is a family of ciphers with different key and block sizes.

For AES, NIST selected three members of the Rijndael family, each with a block size of 128 bits, but three different key lengths: 128, 192 and 256 bits.

AES has been adopted by the U.S. government and is now used worldwide. It supersedes the Data Encryption Standard (DES), which was published in 1977. The algorithm described by AES is a symmetric-key algorithm, meaning the same key is used for both encrypting and decrypting the data. This protocol is not used in the project because it is little slower than MQTT protocol and we need is the real-time processing and very fast end to end transfer of data.