<div dir="ltr">Thanks Chris for sharing your experiences.<br><a href="https://www.youtube.com/watch?v=qT5PWlmwydc">https://www.youtube.com/watch?v=qT5PWlmwydc</a> (~30 secs) - RPLidar mounted on my robot <br>It is ready to move around the house<br><br><span style="font-family:Calibri,sans-serif;font-size:16px">"you need to take the robot’s actual current pose (x, y, theta) into account" - need to figure out how to do this</span><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Nov 21, 2021 at 12:52 PM Chris N <<a href="mailto:netterchris@gmail.com">netterchris@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div lang="EN-US" style="overflow-wrap: break-word;"><div class="gmail-m_-1259438599545823872WordSection1"><p class="MsoNormal"><span style="font-size:12pt">Kumar,<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:12pt"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:12pt">What you are looking for is called an “occupancy grid map”.  There are other types of maps, but the occupancy grid map is conceptually the easiest one to understand and work with I believe.<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:12pt"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:12pt">Conceptually, its straight forward how it is created.  This type of map is really no different from an image – every pixel corresponds to, for example,  one square inch of space, and the pixel values correspond to definitely empty (black),   definitely something there (white),   unsure (grey).     <u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:12pt"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:12pt">In a way, it is just an extension of the real-time display code that you have running.  The key differences between real-time display of lidar data and using this data to build a map are:<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:12pt"><u></u> <u></u></span></p><ol style="margin-top:0in" start="1" type="a"><li class="gmail-m_-1259438599545823872MsoListParagraph" style="margin-left:0in"><span style="font-size:12pt">For map making, you need to take the robot’s actual current pose (x, y, theta) into account.   (For real-time display, you essentially pretend your robot is always at x,y=0,0  and orientation= 0 degrees)<u></u><u></u></span></li><li class="gmail-m_-1259438599545823872MsoListParagraph" style="margin-left:0in"><span style="font-size:12pt">For map making, you remember the point that is drawn into the map, instead of starting with a clean canvas every cycle<u></u><u></u></span></li><li class="gmail-m_-1259438599545823872MsoListParagraph" style="margin-left:0in"><span style="font-size:12pt">For map making, the size of your map needs to be larger than the range of your Lidar, otherwise it won’t be of much use.  <u></u><u></u></span></li></ol><p class="MsoNormal"><span style="font-size:12pt"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:12pt">You have 3 options:<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:12pt"><u></u> <u></u></span></p><ol style="margin-top:0in" start="1" type="1"><li class="gmail-m_-1259438599545823872MsoListParagraph" style="margin-left:0in"><span style="font-size:12pt">Create the algorithm more or less completely from scratch or adapt some sample code that seems to be easy enough to work with.    I’m sure such sample code for python and C++ is out there…. Quick google search found this python code for example:  </span><a href="https://gist.github.com/superjax/33151f018407244cb61402e094099c1d" target="_blank">An occupancy grid mapping example · GitHub</a>.  It says “# This is an implementation of Occupancy Grid Mapping as Presented  in Chapter 9 of "Probabilistic Robotics" By Sebastian Thrun et al.   In particular, this is an implementation of Table 9.1 and 9.2”<br><br><span style="font-size:12pt"><u></u><u></u></span></li><li class="gmail-m_-1259438599545823872MsoListParagraph" style="margin-left:0in"><span style="font-size:12pt">Find a library that contains the necessary building blocks.   Maybe all you need is a ready to use grid map data structure along with an API for putting things into that grid map.   Or maybe the library also provides functions that take care of all the processing of the laser scan data.   Etc, etc.     Then figure out how to use this library.    MRPT comes to mind but there are probably others.   </span><a href="https://www.mrpt.org/" target="_blank">MRPT – Empowering C++ development in robotics</a>.     <a href="https://openslam-org.github.io/" target="_blank">OpenSLAM.org (openslam-org.github.io)</a> is also a possible resource.<br><br><span style="font-size:12pt"><u></u><u></u></span></li><li class="gmail-m_-1259438599545823872MsoListParagraph" style="margin-left:0in"><span style="font-size:12pt">Use ROS and pick one of the mapping algorithms that are available, such as<u></u><u></u></span></li><ol style="margin-top:0in" start="1" type="a"><li class="gmail-m_-1259438599545823872MsoListParagraph" style="margin-left:0in"><span style="font-size:12pt">Gmapping<u></u><u></u></span></li><li class="gmail-m_-1259438599545823872MsoListParagraph" style="margin-left:0in"><span style="font-size:12pt">Google cartographer<u></u><u></u></span></li><li class="gmail-m_-1259438599545823872MsoListParagraph" style="margin-left:0in"><span style="font-size:12pt">etc<u></u><u></u></span></li></ol></ol><p class="MsoNormal"><span style="font-size:12pt"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:12pt"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:12pt">I have gone down road # 1 and road # 2 some 5+ years ago, but I did not reach my destination </span><span style="font-size:12pt;font-family:"Segoe UI Emoji",sans-serif">☹</span><span style="font-size:12pt">    I probably didn’t try hard enough…..<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:12pt"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:12pt">I have also started going down road #3 on more than one occasion, but find my self often going in circles and not getting anywhere </span><span style="font-size:12pt;font-family:"Segoe UI Emoji",sans-serif">☹</span><span style="font-size:12pt">  <u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:12pt"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:12pt">I find that no matter which road you take, it requires a substantial time commitment to fully master the underlying technologies.   I find that unless I’m at it every day, I start to forget things I’ve learned….<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:12pt"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:12pt"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:12pt">Chris.<u></u><u></u></span></p><p class="MsoNormal"><span style="font-size:12pt"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:12pt"><u></u> <u></u></span></p><p class="MsoNormal"><span style="font-size:12pt"><u></u> <u></u></span></p><div style="border-right:none;border-bottom:none;border-left:none;border-top:1pt solid rgb(225,225,225);padding:3pt 0in 0in"><p class="MsoNormal" style="border:none;padding:0in"><b>From: </b><a href="mailto:dprglist@lists.dprg.org" target="_blank">Thalanayar Muthukumar via DPRGlist</a><br><b>Sent: </b>Sunday, November 21, 2021 12:36 PM<br><b>To: </b><a href="mailto:dprglist@lists.dprg.org" target="_blank">DPRG</a><br><b>Subject: </b>[Dprglist] Need help with getting a map of the house using RPLidarwith RPi</p></div><p class="MsoNormal"><u></u> <u></u></p><div><p class="MsoNormal"><a href="https://learn.adafruit.com/slamtec-rplidar-on-pi/cpython-on-raspberry-pi" title="https://learn.adafruit.com/slamtec-rplidar-on-pi/cpython-on-raspberry-pi" target="_blank"><span style="font-size:12pt;font-family:Helvetica,sans-serif;border:1pt none windowtext;padding:0in">https://learn.adafruit.com/slamtec-rplidar-on-pi/cpython-on-raspberry-pi</span></a><span style="font-size:12pt;font-family:Helvetica,sans-serif;color:rgb(220,221,222)"> -<span style="background:white"> </span></span><span style="font-size:12pt;font-family:Helvetica,sans-serif;color:black;background:white">The relevant code is below </span><u></u><u></u></p><pre style="vertical-align:baseline"><code><span style="font-family:Consolas;color:black;background:white">def process_data(data):<u></u><u></u></span></code></pre><pre style="vertical-align:baseline"><code><span style="font-family:Consolas;color:black;background:white">    global max_distance<u></u><u></u></span></code></pre><pre style="vertical-align:baseline"><code><span style="font-family:Consolas;color:black;background:white">    lcd.fill((0,0,0))<u></u><u></u></span></code></pre><pre style="vertical-align:baseline"><code><span style="font-family:Consolas;color:black;background:white">    for angle in range(360):<u></u><u></u></span></code></pre><pre style="vertical-align:baseline"><code><span style="font-family:Consolas;color:black;background:white">        distance = data[angle]<u></u><u></u></span></code></pre><pre style="vertical-align:baseline"><code><span style="font-family:Consolas;color:black;background:white">        if distance > 0:                  # ignore initially ungathered data points<u></u><u></u></span></code></pre><pre style="vertical-align:baseline"><code><span style="font-family:Consolas;color:black;background:white">            max_distance = max([min([5000, distance]), max_distance])<u></u><u></u></span></code></pre><pre style="vertical-align:baseline"><code><span style="font-family:Consolas;color:black;background:white">            radians = angle * pi / 180.0<u></u><u></u></span></code></pre><pre style="vertical-align:baseline"><code><span style="font-family:Consolas;color:black;background:white">            x = distance * cos(radians)<u></u><u></u></span></code></pre><pre style="vertical-align:baseline"><code><span style="font-family:Consolas;color:black;background:white">            y = distance * sin(radians)<u></u><u></u></span></code></pre><pre style="vertical-align:baseline"><code><span style="font-family:Consolas;color:black;background:white">            point = (160 + int(x / max_distance * 119), 120 + int(y / max_distance * 119))<u></u><u></u></span></code></pre><pre style="vertical-align:baseline"><code><span style="font-family:Consolas;color:black;background:white">            lcd.set_at(point, pygame.Color(255, 255, 255))<u></u><u></u></span></code></pre><pre style="vertical-align:baseline"><code><span style="font-family:Consolas;color:black;background:white">    pygame.display.update()</span></code><span style="font-family:Consolas"><u></u><u></u></span></pre></div><p class="MsoNormal"><span style="font-size:12pt;font-family:Helvetica,sans-serif;color:black;background:white">This code is used to update the TFT display and is working for me. Instantaneously, the RPLidar's surroundings are displayed on the TFT display. I would like to adapt this to move the RPLidar through the rooms of the house to create a map. @Chris - Any suggestions or pointers? I do not have ROS installed. Regards. - Kumar </span></p><p class="MsoNormal"><u></u> <u></u></p></div></div></blockquote></div>