
<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://wiki.robotika.sk/robowiki/index.php?action=history&amp;feed=atom&amp;title=Robot_Following_using_Camera_%28Marian_Vysluzil%29</id>
		<title>Robot Following using Camera (Marian Vysluzil) - Revision history</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.robotika.sk/robowiki/index.php?action=history&amp;feed=atom&amp;title=Robot_Following_using_Camera_%28Marian_Vysluzil%29"/>
		<link rel="alternate" type="text/html" href="https://wiki.robotika.sk/robowiki/index.php?title=Robot_Following_using_Camera_(Marian_Vysluzil)&amp;action=history"/>
		<updated>2026-05-06T06:09:31Z</updated>
		<subtitle>Revision history for this page on the wiki</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>https://wiki.robotika.sk/robowiki/index.php?title=Robot_Following_using_Camera_(Marian_Vysluzil)&amp;diff=7388&amp;oldid=prev</id>
		<title>Robot at 13:23, 27 June 2014</title>
		<link rel="alternate" type="text/html" href="https://wiki.robotika.sk/robowiki/index.php?title=Robot_Following_using_Camera_(Marian_Vysluzil)&amp;diff=7388&amp;oldid=prev"/>
				<updated>2014-06-27T13:23:56Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revision as of 13:23, 27 June 2014&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l116&quot; &gt;Line 116:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 116:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Video==&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Video==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;youtube&amp;gt;&amp;lt;/youtube&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;youtube&amp;gt;&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;UdL64V4SIzA&lt;/ins&gt;&amp;lt;/youtube&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Zdrojové súbory==&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Zdrojové súbory==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Media:RobotSrc.zip|RobotSrc.zip]]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Media:RobotSrc.zip|RobotSrc.zip]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Robot</name></author>	</entry>

	<entry>
		<id>https://wiki.robotika.sk/robowiki/index.php?title=Robot_Following_using_Camera_(Marian_Vysluzil)&amp;diff=7387&amp;oldid=prev</id>
		<title>Robot at 13:23, 26 June 2014</title>
		<link rel="alternate" type="text/html" href="https://wiki.robotika.sk/robowiki/index.php?title=Robot_Following_using_Camera_(Marian_Vysluzil)&amp;diff=7387&amp;oldid=prev"/>
				<updated>2014-06-26T13:23:39Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Revision as of 13:23, 26 June 2014&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l15&quot; &gt;Line 15:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 15:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Image: bluetoothModule.jpg|Bluetooth Modul&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;|left&lt;/del&gt;][Image: schemaOdporovyDelic.png|Odporovy delic&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;|right&lt;/del&gt;]]&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;[[Image: bluetoothModule.jpg|Bluetooth Modul]&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;][&lt;/ins&gt;[Image: schemaOdporovyDelic.png|Odporovy delic]]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Software==&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;==Software==&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Robot</name></author>	</entry>

	<entry>
		<id>https://wiki.robotika.sk/robowiki/index.php?title=Robot_Following_using_Camera_(Marian_Vysluzil)&amp;diff=7385&amp;oldid=prev</id>
		<title>Robot: New page: ==Zadanie==  Úlohou bolo zostrojiť robota platformy Acrob, ktorý bude sledovať čiaru pomocou kamery  mobilného telefónu z ktorého budú dáta odosielané pomocou technológie bluet...</title>
		<link rel="alternate" type="text/html" href="https://wiki.robotika.sk/robowiki/index.php?title=Robot_Following_using_Camera_(Marian_Vysluzil)&amp;diff=7385&amp;oldid=prev"/>
				<updated>2014-06-26T13:21:46Z</updated>
		
		<summary type="html">&lt;p&gt;New page: ==Zadanie==  Úlohou bolo zostrojiť robota platformy Acrob, ktorý bude sledovať čiaru pomocou kamery  mobilného telefónu z ktorého budú dáta odosielané pomocou technológie bluet...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;==Zadanie== &lt;br /&gt;
Úlohou bolo zostrojiť robota platformy Acrob, ktorý bude sledovať čiaru pomocou kamery &lt;br /&gt;
mobilného telefónu z ktorého budú dáta odosielané pomocou technológie bluetooth.&lt;br /&gt;
&lt;br /&gt;
==Hardware==&lt;br /&gt;
Ako základ bol použitý robot Acrob založený na platforme Arduino.&lt;br /&gt;
&lt;br /&gt;
[[Image: Rsz_acrob.jpg|Robot Acrob]]&lt;br /&gt;
&lt;br /&gt;
Bluetooth prijímač/vysielač bol použitý JY-MCU v1.02 ktorý , &lt;br /&gt;
ale pracuje na napätí 3.3V na rozdiel od Acroba ktorý pracuje na 5V. &lt;br /&gt;
Preto bolo treba upraviť komunikačný signál smerom od robota k bluetooth modulu. &lt;br /&gt;
Úprava bola spravená odporovým deličom ktorý zmenšil výstupné napätie z robota &lt;br /&gt;
na 3V ktoré modulu postačovalo. Vstupné napätie z modulu do robota upravované nebolo. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image: bluetoothModule.jpg|Bluetooth Modul|left][Image: schemaOdporovyDelic.png|Odporovy delic|right]]&lt;br /&gt;
&lt;br /&gt;
==Software==&lt;br /&gt;
'''Komunikácia:'''&lt;br /&gt;
&lt;br /&gt;
Aplikácia pre mobilný telefón bola napísaná v Jave pre operačný systém Android. &lt;br /&gt;
Pre komunikáciu bola pridaná upravená knižnica Amarino, ktorá slúži pre komunikáciu s&lt;br /&gt;
Arduinom na robotovi Arcob (knižnicu Amarino si treba nainštalovať aj do mobilného telefónu) &lt;br /&gt;
a oproti štandardnej verzií obsahuje nový konštruktor, ktorý namiesto HardwareSerial komunikácie &lt;br /&gt;
použije SoftwareSerial aby bolo možné naraz používať SerialMonitor Arduina a bluetooth modul.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 MeetAndroid::MeetAndroid(int rxPin, int txPin, long int baud)&lt;br /&gt;
 {&lt;br /&gt;
        customErrorFunc = false;&lt;br /&gt;
        SoftwareSerial *softSerial = new SoftwareSerial(rxPin, txPin);&lt;br /&gt;
        softSerial-&amp;gt;begin(baud);&lt;br /&gt;
        stream = softSerial;&lt;br /&gt;
        init();&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''Riadenie robota:'''&lt;br /&gt;
&lt;br /&gt;
Na riadenie bol použitý jednoduchý PID kontroler ktorý upravuje rýchlosť motorov. &lt;br /&gt;
Robot sa snaží držať v strede čiary ktorú nájde pomocou funkcie findTape(), &lt;br /&gt;
ktorá nájde najvzdialenejšiu čiaru väčšiu ako 10 pixlov v prvej polovici „videnia robota“, &lt;br /&gt;
čo je vlastne obrázok z kamery, ak takú čiaru nenájde robot pokračuje v ceste rovno.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 public int findTape(int[] rgb, int width, int height) {&lt;br /&gt;
        int tapeStart = -1;&lt;br /&gt;
        int tapeEnd = -1;&lt;br /&gt;
        int tmpStart = -1;&lt;br /&gt;
        int tmpEnd = -1;&lt;br /&gt;
        int scanline = -1;&lt;br /&gt;
        for (int x = height/2; x &amp;lt; height; x += 5) {&lt;br /&gt;
            for (int pix = 0; pix &amp;lt; height; pix++) {&lt;br /&gt;
                int pixVal = (0xff &amp;amp; (int) rgb[x + pix * width]);&lt;br /&gt;
                if (pixVal == 0) {&lt;br /&gt;
                    if (tmpStart == -1) {&lt;br /&gt;
                        tmpStart = pix;&lt;br /&gt;
                    } else {&lt;br /&gt;
                        tmpEnd = pix;&lt;br /&gt;
                        if (tmpEnd - tmpStart &amp;gt; minPixels&lt;br /&gt;
                                &amp;amp;&amp;amp; (Math.abs((tmpEnd - tmpStart) / 2 - height&lt;br /&gt;
                                        / 2) &amp;lt; Math.abs((tapeEnd - tapeStart)&lt;br /&gt;
                                        / 2 - height / 2))) {&lt;br /&gt;
                            tapeEnd = tmpEnd;&lt;br /&gt;
                            tapeStart = tmpStart;&lt;br /&gt;
                            scanline = x;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                } else {&lt;br /&gt;
                    tmpStart = -1;&lt;br /&gt;
                    tmpEnd = -1;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            if(tapeStart&amp;gt;-1){&lt;br /&gt;
                break;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (tapeStart &amp;gt; -1 &amp;amp;&amp;amp; tapeEnd &amp;gt; -1 &amp;amp;&amp;amp; scanline &amp;gt; -1) {&lt;br /&gt;
            for (int pix = tapeStart; pix &amp;lt;= tapeEnd; pix++) {&lt;br /&gt;
                rgb[scanline + pix * width] = 0xff000000 | (0 &amp;lt;&amp;lt; 16)&lt;br /&gt;
                        | (255 &amp;lt;&amp;lt; 8) | 0;&lt;br /&gt;
            }&lt;br /&gt;
        } else {&lt;br /&gt;
            return -1;&lt;br /&gt;
        }&lt;br /&gt;
        return (tapeEnd + tapeStart) / 2;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Rozlíšenie kamery bolo nastavene na 176x144 pixlov. Keď robot vypočíta výchylku&lt;br /&gt;
odošle dáta na Arduino (pre každý motor zvlášť), kde sa príjmu a ak sú v rozsahu &lt;br /&gt;
od 0-30 daný motor ostane stáť , v opačnom prípade sa rozbehnú. &lt;br /&gt;
Ak robot nedostane dáta do 500ms zastaví. Robot po každej úprave rýchlostí motorov &lt;br /&gt;
odošle na Android číslo ako kontrolu spojenia.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
 void set_motor_speed(byte flag, byte numOfValues)&lt;br /&gt;
 {&lt;br /&gt;
    int data[numOfValues];&lt;br /&gt;
    meetAndroid.getIntValues(data);&lt;br /&gt;
    meetAndroid.send(1);&lt;br /&gt;
    motor1speed = data[1];&lt;br /&gt;
    motor2speed = data[0];  &lt;br /&gt;
    lastcmd = millis();&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Záver==&lt;br /&gt;
Robot fungoval dobre a dráhu zvládol.&lt;br /&gt;
Občasný problém v kontrole robota bol odraz svetla na leskom povrchu dráhy &lt;br /&gt;
ktorú mal robot absolvovať. Riešenie by bolo napríklad aby mobil svietil na&lt;br /&gt;
dráhu osvetlením pre fotoaparát , čo by znamenalo opätovné nastavenie premennej&lt;br /&gt;
treshold ktorá určuje ktorá farba je čierna. &lt;br /&gt;
&lt;br /&gt;
==Video==&lt;br /&gt;
&amp;lt;youtube&amp;gt;&amp;lt;/youtube&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Zdrojové súbory==&lt;br /&gt;
[[Media:RobotSrc.zip|RobotSrc.zip]]&lt;/div&gt;</summary>
		<author><name>Robot</name></author>	</entry>

	</feed>