How to follow the line with the vision of the webcam and move along in this

Hello world

I have a question that I can't really find a topic about it.

Currently, I had made my rover robot wireless control using a 3-axis joystick and works perfectly.

But I want to add some features to the vision on board the rover system.

I'm doing the webcam to detect a black line on a white background, and then, he moves just independently along the the line black.

The thing is that I only know abit about installation in a vision... So, if anyone here able to guide me on the way?

I use filtering color or color matching or model of a match?

How to make sure that the black line remains in the middle of the vision? (Eg. moving itself at the center of the line within his vision)

How can I control the engines using the achievements of the vision of the foregoing?

Hey,.

Your questions:

I use filtering color or color matching or model of a match?

Pattern Matching or Color Pattern Matching would slow down.

I would use a 1 d Simple edge detection that returns the coordinates and the edge angle.

How to make sure that the black line remains in the middle of the vision? (Eg. moving itself at the center of the line within his vision)

You must control your motors that for example the angle is 0 degrees or 90 degrees (depending on your coordinate system) all the time.

How can I control the engines using the achievements of the vision of the foregoing?

This robot manual should tell you how to control the motors.

Hope this helps,

Christian

Tags: NI Software

Similar Questions

  • How to duplicate the artboard and move it over the original?

    Basically, I have a document open and want to duplicate its work plan and then move it to a new location (the X axis, the original 50pixels). Doesn't seem too hard, but I can't understand it. This is for CS5.

    var app.activeDocument = docRef;

    var abSrc = docRef.artboards [0];

    var abSrcX = abSrc.artboardRect [0];

    var abSrcY = abSrc.artboardRect [1];

    var abSrcW = abSrc.artboardRect [2];

    var abSrcH = abSrc.artboardRect [3];

    abSrcX = abSrcX + 1221;

    var abSrcRect = [abSrcY, abSrcW, abSrcX, abSrcH];

    dupAB var = docRef.artboards.add (abSrcRect);

    The above works a bit. Original work plan is 17 "x 11" (1224px x 792px) and when I put abSrcX to the foregoing 1221, extendscript throws an error PARM. During one of my sessions of trials and errors, I decided to see what was the document geometricBounds:

    $.writeln (docRef.geometricBounds); = 45-12, 1221.154296875,-780

    So now, I see a bit where I can't go more than 1221, but why can't I?

    I moved the artboard for everything at the top left of the document and I got the geometricBounds again and they were - 6754.5,7038.5,-6463.5, 6736.5, but still can not abSrcX anything about 1221.

    the error is "error Illustrator: 1246458189 ("PARM").

    I tried to understand this is what courses I can think, but nothings working. Any input or help would be GREATLY appreciated!

    EDIT:

    So I tried this for the hell of it:

    var abSrcX = 0;

    var abSrcY = 1224;

    var abSrcW = 1224;

    var abSrcH = 792; (for some reason any 792 translates into 6 "inside the Illustrator, so I put this 432 to make 11")

    var abSrcRect = [abSrcY, abSrcW, abSrcX, abSrcH];

    dupAB var = docRef.artboards.add (abSrcRect);

    and it adds a new work plan and move to X, Y, such that designated. Not exactly what I want, but narrowing down the issue.

    I'm trying

    var abSrcX = 1224;

    var abSrcY = 0;

    var abSrcW = 1224;

    var abSrcH = 792;

    var abSrcRect = [abSrcY, abSrcW, abSrcX, abSrcH];

    dupAB var = docRef.artboards.add (abSrcRect);

    and he throws that error PARM still once, then now there is really no sense!

    Edit2: I changed abSrcY to 10000 and now the height of the artboard is really long, which is insane even more... I don't have the (x, y, width, height) artboardRect down wrong?

    Edit3: If after one more google search, I found out what the problem is. artboardRect is HIGH, LOW, LEFT, RIGHT; and when I do:

    var abSrcX = 1368;

    var abSrcY = 0;

    var abSrcW = 2592;

    var abSrcH = - 792;

    var abSrcRect = [abSrcY, abSrcW, abSrcX, abSrcH];

    top down right and left;

    dupAB var = docRef.artboards.add (abSrcRect);

    This works. BUT I have no idea what the numbers are in relationship with. The center of the artboard? The document Centre? And if I run it again and change... oh dear.

    I think that I just thought of it.

    abSrcX is on the LEFT;

    abSrcY is HIGH;

    abSrcW is RIGHT;

    abSrcH is DOWN;

    Considering that if I add (1224 + 144) to abSrcX and abSrxW, it creates another work plan 2 "away from the previous 17" x 11 ". If I want to run again, I just have to add (1224 + 144) abSrcX and abSrxW again. Now to find a way to do it dynamically on the fly.

    I still like to hear comments on the question of whether this is good or bad, and how I can improve!

    @clrx01,.

    Why do you work with width and height work plan?

    IMHO you need what only once.

    Try something like this:

    // ArtboardCopy.jsx
    // http://forums.adobe.com/thread/1320239?tstart=0
    //        How to duplicate artboard and move it relative to original?
    // regards pixxxelschubser
    
    var docRef = app.activeDocument;
    //var abSrc = docRef.artboards[0];
    var abIdx = docRef.artboards.getActiveArtboardIndex ();
    var abSrc = docRef.artboards[abIdx];
    
    var moveX = 50;
    
    var abSrc_L = abSrc.artboardRect[0];
    var abSrc_T = abSrc.artboardRect[1];
    var abSrc_R = abSrc.artboardRect[2];
    var abSrc_B = abSrc.artboardRect[3];
    
    var next_ab_L = abSrc_R + moveX;
    var next_ab_T = abSrc_T;
    var next_ab_R = next_ab_L + (abSrc_R - abSrc_L) ;
    var next_ab_B = abSrc_B;
    
    //top left right bottom;
    
    var next_ab = docRef.artboards.add([next_ab_L, next_ab_T, next_ab_R, next_ab_B]);
    

    Have fun

  • How to animate a line with the pen tool to give the impression that it is plotted?

    How to animate a line with the pen tool to give the impression that it is plotted?

    Or you can choose the pen tool (g), set the padding to zero and the race to what you want, then draw a path, then press U twice to reveal all of the properties that have been changed for the layer, and then click Add (top-right) and select Connect the tracks.

    To make the race work just animate the start or end point and sent to paint on original or reveal original or normal.

  • How to follow the port on my router ipstar

    How to follow the port on my router ipstar

    Nothing to do with Windows.

    (1) read the help/documentation that accompanies it.
    2) go to the ipstar website and look for information.

  • Recently purchased captivate subscription 9 and installed on mac. When I try to open I get the message ' to open Adobe Captivate for must install legacy Java SE 6 runtime. " I followed the links and recommended all intalled the update of Java. How the % $

    Recently purchased captivate subscription 9 and installed on mac. When I try to open I get the message ' to open Adobe Captivate for must install legacy Java SE 6 runtime. " I followed the links and installed all updates Java recommended. How the % $# & not one open and use 9 Captivate? Any suggestions?

    Hello

    This link may help: easy to install Java SE 6 Runtime | Mac OS 10.9

    Kind regards

    Sheena

  • Recently upgraded to El Capitan, I had that problem for Mail stop unexpectedly when I saw some posts.  I followed the steps and was able to remove the trouble messages.   Now I can't restore the mail window message viewer component.

    Recently upgraded to El Capitan, I had that problem for Mail stop unexpectedly when I saw some posts.  I followed the steps and was able to remove the trouble messages.   Now I can't restore the mail window message viewer component.  When I try to catch the separator bar to go back to the left, only half of the small arrow icon and line appears, and it cannot be moved.   Can open the message by double clicking a message viewer.

    Hi there, alicefrompa!

    Thank you for using communities Support from Apple. From your post, I understand that you do not see the Message Viewer box which allows you to read your e-mails; only see you the Inbox that includes a brief overview of the message and are unable to restore access using the separator bars. I have had this happen to my own Mail app and am happy to let you know how I could fix!

    You are really on the right track - you want to roll your mouse over the divider between the Inbox and sections Message Viewer (which should now be on the extreme right edge of your mail window) and drag it to the left.  When you click on the receipt/Message Viewer box, the cursor turns into a line continuous black with a single arrow pointing to the left. When you see the cursor change, click with the left button of the mouse and (while holding down the mouse button in) drag the combination line / arrow to the left. You may need to drag a little further than before to get it. I had to hang mine almost completely in the middle of my Mail app before the display of the message box appeared.

    From there, you should be able to adjust the boxes to your widths you want as expected.

    If you are still not able to get the display of the messages visible after have try this, here are a few more things that you can do.

    1. Press command + O on your keyboard.
    2. Exit the Mail application, and then press on and hold the SHIFT key on your keyboard while reopening.
    3. Restart your Mac by selecting the menu  Apple in the upper right of your screen restart from the menu drop down.

    See you soon!

  • How to calculate the second and minisecond for audio landmark

    I'm doing a sound synchronization for the clip audio and video in Flash. I found a tutorial on the web, and it seems to work. However, I do not know how to calculate the second and the mini (deuxieme from mp3 file. The first frame has the following lines to set the duration for each animation:
    Import class
    Import net.quip.sound.SoundSync;

    Stop the main timeline
    Stop();

    Create an instance of SoundSync
    var ss:SoundSync = new SoundSync();

    ss.addCuePoint ("IT", 20100);
    ss.addCuePoint ("admin", 20000);
    ss.addCuePoint ("maintenance", 19800);
    ss.addCuePoint ("treatment", 16479);
    ss.addCuePoint ("engineering", 14598);
    as.addCuePoint ("logo_epa_npdes", 12356);
    ss.addCuePoint ("construction", 8967);
    ss.addCuePoint ("370 mg/j", 7896);
    ss.addCuePoint ("mc_650, 000 ', 5439);
    ss.addCuePoint ("130 mg/j", 3254);
    ss.addCuePoint ("1938", 2439);
    ss.addCuePoint ("vintage_mc", 0);

    Use the instance of loading external MP3
    ss.loadSound ("Scn04 - 05.mp3", true);

    Create a listener object for the
    cuePoint and onSoundComplete events
    var listener: Object = new Object();
    listener.cuePoint = function (): Void {}
    Play();
    }
    listener.onSoundComplete = function (): Void {}
    Play();
    }
    ss.addEventListener ("cuePoint", listener);
    ss.addEventListener ("onSoundComplete", listener);

    and the soundsync.as file as follows:
    Import mx.events.EventDispatcher;
    Import mx.utils.Delegate;
    class net.quip.sound.SoundSync extends its {}
    PROPERTIES
    private var _cuePoints:Array;
    private var _currentCuePoint:Number;
    private var _interval:Number;
    private var _intervalDuration:Number;
    private var _secondOffset:Number;
    Event dispatcher
    public var dispatchEvent:Function;
    public var addEventListener:Function;
    private var removeEventListener:Function;
    CONSTRUCTOR
    public void SoundSync(target:MovieClip) {}
    Super (target);
    init();
    }
    METHODS
    private function init (): Void {}
    Initialize properties
    _cuePoints = new Array();
    _currentCuePoint = 0;
    _intervalDuration = 200;
    _secondOffset = 0;
    Initialize the instance of the class as the valid event broadcaster
    EventDispatcher.initialize (this);
    }
    Add Cue Point
    public void addCuePoint(cuePointName:String,_cuePointTime:Number):Void {}
    () _cuePoints.push
    {
    type: "cuePoint",.
    name: cuePointName,.
    time: cuePointTime,.
    target: this
    }
    );
    _cuePoints.sortOn ("time", Array.NUMERIC);
    }
    Get cue point
    public void getCuePoint(nameOrTime:Object):Object {}
    var counter: Number = 0;
    While (counter < _cuePoints.length) {}
    If (typeof (nameOrTime) == 'string') {}
    If (_cuePoints [meter] .name == nameOrTime) {}
    return _cuePoints [counter];
    }
    } Else if (typeof (nameOrTime) == 'number') {}
    If (_cuePoints [meter] .time == nameOrTime) {}
    return _cuePoints [counter];
    }
    }
    counter ++;
    }
    Returns a null value.
    }
    Get the Index of the current Cue Point
    private void getCurrentCuePointIndex(cuePoint:Object):Number {}
    var counter: Number = 0;
    While (counter < _cuePoints.length) {}
    If (_cuePoints [meter] .name == cuePoint.name) {}
    return the meter;
    }
    counter ++;
    }
    Returns a null value.
    }
    Get the next Cue Point index
    private void getNextCuePointIndex(seconds:Number):Number {}
    seconds (seconds) =? seconds: 0;
    var counter: Number = 0;
    While (counter < _cuePoints.length) {}
    If (_cuePoints [meter] .time > = seconds * 1000) {}
    return the meter;
    }
    counter ++;
    }
    Returns a null value.
    }
    Benchmark deleted
    public void removeCuePoint(cuePoint:Object):Void {}
    _cuePoints.splice (getCurrentCuePointIndex (cuePoint), 1);
    }
    Remove all Cue Points
    public function removeAll_cuePoints (): Void {}
    _cuePoints = new Array();
    }
    Beginning
    public void start(secondOffset:Number,_loops:Number):Void {}
    Super.Start (secondOffset, loops);
    dispatchEvent ({type: "onStart", target: this});
    Reset benchmark
    _secondOffset = secondOffset;
    _currentCuePoint = getNextCuePointIndex (secondOffset);
    Poll for cue points
    clearInterval (_interval);
    _interval = setInterval (Delegate.create (this, pollCuePoints), _intervalDuration);
    }
    Load sound
    public void loadSound(url:String,_isStreaming:Boolean):Void {}
    super.loadSound (url, isStreaming);
    clearInterval (_interval);
    _interval = setInterval (Delegate.create (this, pollCuePoints), _intervalDuration);
    }
    Stop
    public void stop(linkageID:String):Void {}
    If {(linkageID)
    Super.Stop (linkageID);
    } else {}
    Super.Stop ();
    }
    dispatchEvent ({type: "onStop", target: this});
    Kill the ballot
    clearInterval (_interval);
    }
    Survey benchmarks
    private function pollCuePoints (): Void {}
    If the current position is close to the cue point.
    var time: Number = _cuePoints [_currentCuePoint] .time;
    var span: Number = (_cuePoints [_currentCuePoint + 1] .time)? _cuePoints [_currentCuePoint + 1] .time: time + _intervalDuration * 2;
    If (position > = time & & position < = span) {}
    Send event
    dispatchEvent (_cuePoints [_currentCuePoint]);
    Advance to the next landmark...
    If (_currentCuePoint < _cuePoints.length) {}
    _currentCuePoint ++;
    } else {}
    _currentCuePoint = getNextCuePointIndex (_secondOffset);
    }
    }
    }
    EVENT HANDLERS
    onSoundComplete
    public function onSoundComplete (): Void {}
    Kill the ballot
    clearInterval (_interval);
    Reset benchmark
    _currentCuePoint = 0;
    Send event
    dispatchEvent ({type: "onSoundComplete", target: this});
    }
    }

    any help will be greatly appreciated.

    Wuzhishan,

    > Hi Dave, your tutorial is very cute and it is very useful.

    Thank you! My daughter is cute. She inherited all of
    me, so I have not left. ;)

    > I'm sorry that I don't have my question clearly.

    No worries. :)

    > I have listen mp3 in Windows Media Player and try to
    > get both for the tail, I found it on the bottom of the
    > player time indicates 00:26.

    I'm with you.

    > How can I writer this number in the code? Is it 0026 or 26?

    The code expects milliseconds, then 26 seconds would be written as
    this:

    26000

    If he said 01:22 (one minute and 22 seconds), you must write it like this:

    82000

    ... which is 60 seconds for now, 22 seconds
    side, then multiplied by 1,000 to get milliseconds.

    David Stiller
    Adobe Community Expert
    Dev blog, http://www.quip.net/blog/
    "Luck is the residue of good design."

  • How to open the sounds and audio properties by using Labview

    Hi all

    How to open the sounds and audio properties of the control panel using the exe from system Labview vi.

    Y at - it all dll also open this property.

    If there is some dll which is which and how to program the dll to achieve my goal.

    Wow, you followed after a few...

    Open the command window is because to open the Control Panel, you need to execute it in the context of a shell, and it's what is done with the "cmd /c mmsys.cpl. To open the applet without using cmd you use RunDll32.exe, like this:

  • How to use the rescue and recovery and product recovery discs?

    Hello world

    I just recently became a new owner of a T61 and really enjoy. I did have a chance yet to test the hotline of lenovo, as I've not yet screwed anything up if badly needing their help. I tried a factory clean reinstall from the service partition and it worked fine. I would like to know, how one uses it the rescue and the recovery boot disk and the recovery disks of the product I created myself? From my previous experience with Dell and HP, I didn't insert the one and restart the computer, and the rest followed. But the ThinkPads, if I ever wanted to bring a State own factory using these disks, can I use with rescue and recovery first, followed by the recovery of product? I'm curious, what is the difference between the two?

    art140 wrote:

    From my previous experience with Dell and HP, I didn't insert the one and restart the computer, and the rest followed. But the ThinkPads, if I ever wanted to bring a State own factory using these disks, can I use with rescue and recovery first, followed by the recovery of product? I'm curious, what is the difference between the two?

    1. Place the rescue and recovery disc in the drive, and then restart.  This disc contains the same program that you used when you restored your system from the service partition.  Once the program is loaded, you will see the same screen with the same options as before.
    2. Choose to restore your system as you did with the service partition.  You will not see an option to do a custom restore.  When the program is run from the disk, it automatically performs a full restore.
    3. The program will rebuild the service partition and copy the program files on him.  When you are prompted, insert the product recovery disks.  The compressed system and application files contained on these discs will be copied to the new service partition.  Once the copy process is completed, your system will be restored from the service partition.
    4. After restoration, you will be able to make a new set of recovery discs if you wish.  You will also be able to do a restore custom through the service partition.

    Don

  • How to get all the names of files in the folder and move it to another folder

    Hello
    How to read the files in a particular directory with PL/SQL, without knowing the exact name? My application interface with another system that puts the files in a specific directory on the server. UTL_FILE method reads a file when you know the name of the file, but I don't know the name in advance. Is it possible to output the name of the file? I also used the method of Tom "http://asktom.oracle.com/pls/asktom/f?p=100:11:0:P11_QUESTION_ID:439619916584" (related to the Java stored procedure) but am getting error of procedure "ORA-00900: invalid SQL statement. Here's the code I used Tom - forums

    CREATE or REPLACE AND compile java source named 'DirList '.
    AS
    import java. IO;
    import java.sql. *;

    public class DirList
    {
    Public Shared Sub getList (string directory)
    throws SQLException
    {
    Path = new file (directory);
    List of strings [] = path.list ();
    Element string;

    for (int i = 0; i < list.length; i ++)
    {
    item = list;
    #sql {INSERT INTO DIR_LIST (FILENAME)
    {VALUES (: element)};
    }
    }

    }
    /
    **********************************************************************
    CREATE OR REPLACE PROCEDURE get_dir_list (p_directory in VARCHAR2) AS java language
    name ' DirList.getList (java.lang.String) htp.p (p_directory) ";
    **********************************************************************
    get_dir_list exec (' / CERT_XML');
    **********************************************************************

    I would like to know is there any alternative approach to retrieve all the names of the files in the folder of the server and move these files to a different folder?

    Thank you
    Amit Bhandari

    Hello

    It is a limitation of UTL_FILE in Oracle that we can do with Java stored procedures in Oracle.

    We can read the files in Server directory using the following steps:

    Please follow the steps below:

    1. creating a Type of Type Varchar2.

      CREATE OR REPLACE TYPE file_list AS TABLE OF VARCHAR2(255);
    

    2. next, we need create a library of Java file

    CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED "ListVirtualDirectory" AS
      import java.io.*;
      import java.security.AccessControlException;
      import java.sql.*;
      import oracle.sql.driver.*;
      import oracle.sql.ArrayDescriptor;
      import oracle.sql.ARRAY;
    
      public class ListVirtualDirectory {
        public static ARRAY getList(String path) throws SQLException, AccessControlException {
    
        Connection conn = DriverManager.getConnection("jdbc:default:connection:");
    
        File directory = new File(path);
    
        ArrayDescriptor arrayDescriptor = new ArrayDescriptor("FILE_LIST",conn);
    
        ARRAY listed = new ARRAY(arrayDescriptor,conn,((Object[])directory.list()));
      return listed; }}
    

    The most advanced method overrides by removing information about java.properties of exception management settings. You can do this by catching the exception thrown in native mode and rethrow it or ignore it. The example it up again.

    3. then, you must create a Wrapper function:

    CREATE OR REPLACE FUNCTION list_files(path VARCHAR2) RETURN FILE_LIST IS
    LANGUAGE JAVA
    NAME 'ListVirtualDirectory.getList(java.lang.String) return oracle.sql.ARRAY';
    

    4 grant permissions to the Driectory:

    BEGIN
      DBMS_JAVA.GRANT_PERMISSION('USER_NAME'
                                 ,'SYS:java.io.FilePermission'
                                 ,'C:\JavaDev\images'
                                 ,'read');
      END;
    

    5. then you can read the contents of the directory

    SELECT column_value FROM TABLE(list_files('C:\JavaDev\images'));
    

    That displays all the files in the mentioned directory.

    Thank you
    Shankar

  • How to use the capture and the print button

    I tried to figure out how to use the capture and the "print" button, or add or what you call. I press it and the whole page of a different color changes, so I try to cut the section I want but I don't know how to send it to the printer. Can someone help me with this. I'm not at savvy with tech stuff, but when I find a recipe or something and it doesn't have an option to print a certain area, I can't understand how to use it?

    Thank you

    Andi Starbuck

    That happens to me is, I click and drag to make a rectangle of yellow selection, and as soon as I raise my finger on the mouse button, the part I've selected is captured as an image, a new tab opens and preview before printing, the image display. I can use the installation of the Page or simply print. But if I close the preview, this temporary image vanishes and I'm back on the page where I started. You see something different?

  • How do you the bookmarks and history buttrons open boxes in Firefox 33?

    How I make the bookmarks and history buttons open their respective boxes instead of having to use the submenu stupid button on the sidebar?

    Apparently, the Restorer of classic theme worked for Firefox 29, but it does not work for 33:
    https://support.Mozilla.org/en-us/questions/991080

    There are two sets of buttons of toolbar tools for history and bookmarks in the palette to customize with the CTR extension installed. You need those without drop marker to open the sidebar.

  • How I change the fonts and colors of default return?

    I changed the font and the color of the text through the Tools button and the button options and the tab content. I can't find anything tell me how to change the fonts and colors to the colors and fonts by default. Can you advise me? I use Windows 7 Home Premium OS. Thank you.

    Hi Brenda19605,

    You can use this article to set the fonts and colors: https://support.mozilla.org/en-US/kb/change-fonts-and-colors-websites-use?esab=a & s = do & r = 0 & s = as

    The default settings for the police are in this article:
    https://support.Mozilla.org/en-us/KB/some%20text%20shows%20up%20bold%20after%20upgrade

    Unfortunately for the default color has no good reference. For the text, but it is black (most lower-left), the background is white (color above left). Unvisited links is blue (column 8, line 5) and the visited link is purple (column 9, line 5).

    Let me know if you need help more!

    Lordfreak

  • How to adjust the brightness and contrast for Compaq Presario all-in-One CQ1-1007 D desktop PC

    How to adjust the brightness and contrast for Compaq Presario all-in-One CQ1 - 1007 D desktop PC? THX.

    There were buttons No. brightness and contrast on the front of the monitor-no onscreen menu.

    On your desktop,.
    Right-click to select graphic properties->

    in display settings, click Advanced settings
    Here you go, you can do almost anything with the brightness

    Hope it helps

  • Satellite A80: How to restore the audio and video codecs?

    How to restore the audio and video codecs that are installed by default on my Satellite A80 with XP Home edition?
    I removed the safe mode, due to a problem with the Pinnacle Codec installed by Pinnacle Studio 10.
    Now, I need to put the video standard in audio codecs.
    I already downloaded the Microsoft Mediaplayer codec package and video sound new fr in Media Player.
    Unfortunately I have always its program to diagnose Toshiba during the test of its Midi and Wave.
    System Restore came with the message that the restoration was not possible because no changes had been made.

    Post edited by: roel

    Hello

    Try to use the tool "system restore."
    This application restores the operating system to the beginning.
    Maybe it will work.

Maybe you are looking for