A little background of my aim
I am in the process of building a mobile autonomous robot which must navigate around an unknown area, must avoid obstacles and receive speech input to do various tasks. It also must recognize faces, objects etc. I am using a Kinect Sensor and wheel odometry data as its sensors. I chose C# as my primary language as the official drivers and sdk are readily available. I have completed the Vision and NLP module and am working on the Navigation part.
My robot currently uses the Arduino as a module for communication and a Intel i7 x64 bit processor on a laptop as a CPU.
This is the overview of the robot and its electronics:
The Problem
I implemented a simple SLAM algorithm which gets robot position from the encoders and the adds whatever it sees using the kinect (as a 2D slice of the 3D point cloud) to the map.
This is what the maps of my room currently look like:
This is a rough representation of my actual room:
As you can see, they are very different and so really bad maps.
- Is this expected from using just dead reckoning?
- I am aware of particle filters that refine it and am ready to implement, but what are the ways in which I can improve this result?
Update
I forgot to mention my current approach (which I earlier had to but forgot). My program roughly does this: (I am using a hashtable to store the dynamic map)
- Grab point cloud from Kinect
- Wait for incoming serial odometry data
- Synchronize using a time-stamp based method
- Estimate robot pose (x,y,theta) using equations at Wikipedia and encoder data
- Obtain a "slice" of the point cloud
- My slice is basically an array of the X and Z parameters
- Then plot these points based on the robot pose and the X and Z params
- Repeat