Monday, August 30, 2010

Is Erlang feasible option for Robotic applications?

The answer to this question is not straight forward(yes or no). It involves a lot of study about Erlang constructs, key features and current applications. I am currently working in this area and my work is to figure out some robotic application areas where Erlang certainly can be a good option than imperative programming languages(C, C++, Java).

Here I am writing some points which I observed. comments and suggestions are welcome
1. Erlang being a concurrent language helps in creating multiples processes. The communication model of Erlang is message passing which lets us write concurrent applications without worrying about deadlock, race condition etc.For more see this.

2. On the above property we can make a robotic application where multiple robots are performing a task in co-operative centralized environment. Each robot has its own logic which is controlled by an Erlang server. Some examples are swarm robotics, multiple robots cleaning a room or picking a heavy object.
Let us look at why Erlang will be a good option.
In case of languages which use native threads(C,C++ and Java), there will be a cluttered code having shared memory, loops, process synchronization etc but in Erlang we can use message passing system and other OTP feature to achieve same task in more efficient manner.

3. Erlang's functional nature makes program compact(approx 1/5 times) and readable. This increases productivity also because we can implement a product in less time and push the product before our competitor(less reasonable but true).

4. We can also program "robots with artificial intelligence" using ERESYE which is an additive advantage of Erlang over other languages like C, C++ and Java.

Why process creation time in Erlang is less than Java and C#?

Below are the key points collected by me from stackoverflow, Joe Armstrong's PHD thesis and other web resources.
1. First thing to notice about Erlang is that the word "process" is used because processes do not share data and other resources while threads do share resources and memory(except stack). But still process creation is less expensive in Erlang, how? The answer to this question is that Erlang has the concept of so called "Light weight Process".

2. A newly spawned Erlang process uses 309 words of memory in the non-SMP emulator without HiPE support. Link This includes 233 words for heap and stack memory which can be increased by garbage collector as needed. While in case of Java it varies from 32Kb - 512Kb means at least 100 times more than Erlang.

3. The thread model of Java and C# is OS dependent means that when we create thread in these languages they are mapped onto native threads in someway or the other. But in case of Erlang, processes belong to language not OS, operating system sees only one process which is Erlang Run Time System(ERTS). All process creation, deletion and scheduling is done by ERTS which removes the dependency on underlying OS.

4. The above point is important because it creates a lot of difference between Erlang and other languages. In Java there is certain limit(usually some thousands) on the # threads we can create because of underlying OS but In Erlang we can create millions of threads(I have tested it).

Wednesday, August 4, 2010

How to enable wireless in ubuntu 10.04?

Enabling wireless in windows is quite easy. Here I am suggesting easy way of enabling wireless in ubuntu 10.04(lucid).

Go to system -> administration -> synaptic package manager
then install following packages
bcmwl-kernel-source
b43-fwcutter
bcmwl-modaliases


reboot and everything should work fine. If these packages are already installed then reinstall them.
There may be an exception but this works for me.

Tuesday, June 29, 2010

How to enable USB to SERIAL port(FT232R) in linux....


I am currently developing a robot. This robot has to be controlled using wireless module zigbee. I am using usb to serial converter chip FT232R for this purpose. It is easy to configure this device in windows based platform...you have to just download respective driver from this website..http://www.ftdichip.com/Drivers/VCP.htm but when it comes to Linux it is quite troublesome task. After going through so many website I found one easy way of doing this.


steps

1) First plug the device in usb port and type "dmesg" in terminal...u will see lot of stuff but don't worry..just dump the output in a file.. $ dmesg > out and see the out file..u will find a line like

usb 3-1.3: new full speed USB device using uhci_hcd and address 5

this means device has recognised by system.
2) "unplug" the device and type "lsusb" command... output will look like this

Bus 003 Device 003: ID 413c:8161 Dell Computer Corp.
Bus 003 Device 002: ID 0a5c:4500 Broadcom Corp. BCM2046B1 USB 2.0 Hub (part of BCM2046 Bluetooth)
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 004: ID 0c45:63ee Microdia

then "plug" the device again and type "lsusb" again in terminal and see the output...u will see one additional line is there...

Bus 003 Device 003: ID 413c:8161 Dell Computer Corp.
Bus 003 Device 002: ID 0a5c:4500 Broadcom Corp. BCM2046B1 USB 2.0 Hub (part of BCM2046 Bluetooth)
Bus 003 Device 002: ID 4313:6001 FTDI 232r usb to serial....
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 004: ID 0c45:63ee Microdia

In this line 4313 is vendor id and 6001 is product id. just type following line in terminal

sudo modprobe usbserial vendor=0x4313 product=0x6001

type "dmesg" again and u will see something like this in last line of output..

usbserial_generic 3-1:3.0: generic converter detected
usb 3-1: generic converter now attached to ttyUSB0
usbcore: registered new interface driver usbserial

3) type this on terminal:- sudo gedit /etc/modules and add line "usbserial vendor=0x4313 product=0x6001" without quotes.
this will enable linux to automatically detect device...

4) Verification:
type "cd /dev" in terminal and check output...u will find ttyUSB0 there..means u r done...

cheers........

Saturday, March 13, 2010

How to restore Grub in Ubuntu

Boot up your live CD
In the desktop, open terminal (Applications -> Accessories -> Terminal).

sudo grub

This will set it to grub mode

find /boot/grub/stage1

This will locate your boot partition. If you already know the location, you can ignore this step.

root (hd0,0)

Replace the (hd0,0) by your boot partition number. If your Ubuntu is installed in the second partition, then change it to (hd0,1)

setup (hd0)
quit

Reboot your system. You should be able to access the Grub bootloader now.

Thursday, March 11, 2010

Important keywords about functional programming

Pure function:
A function is said to be pure if a function produces the same result when evaluating with same argument(s). Function result should not depend on hidden values or state that may change the result of program. We can say that a pure function depends only on its argument(s). Example Sin(x), Sizeof()...etc

Reactive Systems:
Reactive systems are systems whose role is to maintain an ongoing interaction with their environment at specified rate rather than produce some final value upon termination." Usually all embedded systems and industrial "Real time" systems are reactive in nature. The main feature of these systems are:
  • They involve concurrency.
  • They are usually deterministic.
  • They are generally made of both H/W and S/W.

Referential Transparency:
Referential transparency, a term commonly used in functional programming, means that a function/method invocation can be replaces by its return value without changing algorithm or program semantics. Ex F(x)=x +1 in this function for a given value of x say 5, it can be replaced by 6 easily. This can only be true when
  • function simply compute a value.
  • function is independent of temporal context and has no side effect.
The main advantage of referential transparency is that it makes it much easier to reason about programs, and to apply program transformations... including optimizations and partial evaluations at compile-time (since if a computation has no side-effects, then it doesn't matter whether you calculate it now or later).

Referential Opaqueness:
This concept is just opposite of referential transparent. Functions can't be replaced by their value because they depend on external things. For example if a function getinput() is reading from a file or keyboard then it's output can not be predict because file can be changed or user can enter any char/word/sentence.
Another example is
int a= 10; //global variable
func(int x)
{
return x+a;
}
ny
This function will not always add 10 to given value of x because as a is global it can be changed by other function or assignment.

Why Functional Programming is Important

Functional programming is very important aspect in programming. It is a new way of thinking. This programming style promotes modularity, reusability, and one of the more important aspect readability. Programs are small in this style of programming like for a given problem if we write a program in any imperative language (C, C++, java) then same program in functional languages( Haskell, Erlang) can be written in 1/5 LOC. Some important points are:
  • We focus on What to do rather than how to do.
  • Program looks like a mathematical expression