From: Vikram H. <har...@op...> - 2003-11-18 07:06:39
|
Hi there, I was wondering if someone could help me. In my client code, what I am doing is gathering the data from the laser sensor to detect an obstacle, calculating what the desired speed and turn rate should, then setting the desired speed and turn rate. My current problem is that it is doing this too fast. I want it to do it every 1.5 seconds. I tried using the usleep() function (in unistd.h) but this doesnt work for me as the laser data is not recent after I wait for 1.5 seconds. Essentially this is what I want to do: for ( ; ; ) { Read data from laser sensor. Calculate desired speed and turnrate. Set desired speed and turnrate. Wait 1.5 seconds before starting again. (this is were I tried using usleep(1500000) to wait for 1.5 seconds but it caused my code to not work properly.) } Thanks for any help you can give me on this. Vikram |
From: john s. <sw...@cs...> - 2003-11-18 07:35:51
|
at least two ways to do this. 1) keep track of time in your for loop, read the laser data every cycle, but only act after 1.5 seconds have passed. do a "man gettimeofday" for more info. 2) set the read mode on the PlayerClient on the laser proxy to be request mode, where it will always get the latest data. That way you can sleep at the end of your loop, but when you do perform a PlayerClient::Read(), you get the latest data only (you have to call PlayerClient::RequestData() prior to calling Read() in this case). This is discussed in the manual, somewhere, I'm pretty sure. BTW, this email more properly belongs on the "users" email list, not "developers". john |
From: Vikram H. <har...@op...> - 2003-11-18 07:56:27
|
Hi John, I gave it a go but I think I'm doing something wrong because Im not getting the newest data. Here is what I am doing: ...... PlayerClient robot(host,port); if (robot.SetDataMode(3)) exit(1); for ( ; ; ) { if (robot.RequestData()) exit(1); if (robot.Read()) exit(1); // Laser scan for obstacles // Calculate desired speeds // Set desired speeds usleep(1000000); // sleep for 1 second before looping again - this is fron the unistd.h file. } What am I doing wrong here? Is it my usleep(1000000) that is incorrect? Thankyou for your help. Vikram P.S. Sorry about posting in the developers mailing list. john sweeney wrote: > at least two ways to do this. > > 1) keep track of time in your for loop, read the laser data every cycle, > but only act after 1.5 seconds have passed. do a "man gettimeofday" > for more info. > > 2) set the read mode on the PlayerClient on the laser proxy to be > request mode, where it will always get the latest data. That way you > can sleep at the end of your loop, but when you do perform a > PlayerClient::Read(), you get the latest data only (you have to call > PlayerClient::RequestData() prior to calling Read() in this case). This > is discussed in the manual, somewhere, I'm pretty sure. > > BTW, this email more properly belongs on the "users" email list, not > "developers". > > john > > ------------------------------------------------------- > This SF. Net email is sponsored by: GoToMyPC > GoToMyPC is the fast, easy and secure way to access your computer from > any Web browser or wireless device. Click here to Try it Free! > https://www.gotomypc.com/tr/OSDN/AW/Q4_2003/t/g22lp?Target=mm/g22lp.tmpl > _______________________________________________ > Playerstage-users mailing list > Pla...@li... > https://lists.sourceforge.net/lists/listinfo/playerstage-users |
From: Vikram H. <har...@op...> - 2003-11-18 08:11:36
|
Hi John, Just another note. I am using my client to connect to a robot in Stage - the pioneer to be exact. I dont know why but I am receiving the newest laser data when I use the code written below. I am using PlayerStage 1.3.1 with librtk 2.1.1 Thanks again for your help on this matter. I am really quite stuck and have no idea how to proceed. Vikram Vikram Harinath wrote: > Hi John, > > I gave it a go but I think I'm doing something wrong because Im not getting > the newest data. Here is what I am doing: > > ...... > PlayerClient robot(host,port); > > if (robot.SetDataMode(3)) > exit(1); > > for ( ; ; ) > { > if (robot.RequestData()) > exit(1); > > if (robot.Read()) > exit(1); > > // Laser scan for obstacles > // Calculate desired speeds > // Set desired speeds > > usleep(1000000); // sleep for 1 second before looping again - this is > fron the unistd.h file. > } > > What am I doing wrong here? Is it my usleep(1000000) that is incorrect? > > Thankyou for your help. > > Vikram > > P.S. Sorry about posting in the developers mailing list. > > john sweeney wrote: > > > at least two ways to do this. > > > > 1) keep track of time in your for loop, read the laser data every cycle, > > but only act after 1.5 seconds have passed. do a "man gettimeofday" > > for more info. > > > > 2) set the read mode on the PlayerClient on the laser proxy to be > > request mode, where it will always get the latest data. That way you > > can sleep at the end of your loop, but when you do perform a > > PlayerClient::Read(), you get the latest data only (you have to call > > PlayerClient::RequestData() prior to calling Read() in this case). This > > is discussed in the manual, somewhere, I'm pretty sure. > > > > BTW, this email more properly belongs on the "users" email list, not > > "developers". > > > > john > > > > ------------------------------------------------------- > > This SF. Net email is sponsored by: GoToMyPC > > GoToMyPC is the fast, easy and secure way to access your computer from > > any Web browser or wireless device. Click here to Try it Free! > > https://www.gotomypc.com/tr/OSDN/AW/Q4_2003/t/g22lp?Target=mm/g22lp.tmpl > > _______________________________________________ > > Playerstage-users mailing list > > Pla...@li... > > https://lists.sourceforge.net/lists/listinfo/playerstage-users > > ------------------------------------------------------- > This SF. Net email is sponsored by: GoToMyPC > GoToMyPC is the fast, easy and secure way to access your computer from > any Web browser or wireless device. Click here to Try it Free! > https://www.gotomypc.com/tr/OSDN/AW/Q4_2003/t/g22lp?Target=mm/g22lp.tmpl > _______________________________________________ > Playerstage-users mailing list > Pla...@li... > https://lists.sourceforge.net/lists/listinfo/playerstage-users |
From: Vikram H. <har...@op...> - 2003-11-18 08:12:54
|
Oooops. That should be i am NOT receiving the newest laser data when I use the code below. Sorry. Vikram Vikram Harinath wrote: > Hi John, > > Just another note. > > I am using my client to connect to a robot in Stage - the pioneer to be exact. > I dont know why but I am receiving the newest laser data when I use the code > written below. > > I am using PlayerStage 1.3.1 with librtk 2.1.1 > > Thanks again for your help on this matter. I am really quite stuck and have no > idea how to proceed. > > Vikram > > Vikram Harinath wrote: > > > Hi John, > > > > I gave it a go but I think I'm doing something wrong because Im not getting > > the newest data. Here is what I am doing: > > > > ...... > > PlayerClient robot(host,port); > > > > if (robot.SetDataMode(3)) > > exit(1); > > > > for ( ; ; ) > > { > > if (robot.RequestData()) > > exit(1); > > > > if (robot.Read()) > > exit(1); > > > > // Laser scan for obstacles > > // Calculate desired speeds > > // Set desired speeds > > > > usleep(1000000); // sleep for 1 second before looping again - this is > > fron the unistd.h file. > > } > > > > What am I doing wrong here? Is it my usleep(1000000) that is incorrect? > > > > Thankyou for your help. > > > > Vikram > > > > P.S. Sorry about posting in the developers mailing list. > > > > john sweeney wrote: > > > > > at least two ways to do this. > > > > > > 1) keep track of time in your for loop, read the laser data every cycle, > > > but only act after 1.5 seconds have passed. do a "man gettimeofday" > > > for more info. > > > > > > 2) set the read mode on the PlayerClient on the laser proxy to be > > > request mode, where it will always get the latest data. That way you > > > can sleep at the end of your loop, but when you do perform a > > > PlayerClient::Read(), you get the latest data only (you have to call > > > PlayerClient::RequestData() prior to calling Read() in this case). This > > > is discussed in the manual, somewhere, I'm pretty sure. > > > > > > BTW, this email more properly belongs on the "users" email list, not > > > "developers". > > > > > > john > > > > > > ------------------------------------------------------- > > > This SF. Net email is sponsored by: GoToMyPC > > > GoToMyPC is the fast, easy and secure way to access your computer from > > > any Web browser or wireless device. Click here to Try it Free! > > > https://www.gotomypc.com/tr/OSDN/AW/Q4_2003/t/g22lp?Target=mm/g22lp.tmpl > > > _______________________________________________ > > > Playerstage-users mailing list > > > Pla...@li... > > > https://lists.sourceforge.net/lists/listinfo/playerstage-users > > > > ------------------------------------------------------- > > This SF. Net email is sponsored by: GoToMyPC > > GoToMyPC is the fast, easy and secure way to access your computer from > > any Web browser or wireless device. Click here to Try it Free! > > https://www.gotomypc.com/tr/OSDN/AW/Q4_2003/t/g22lp?Target=mm/g22lp.tmpl > > _______________________________________________ > > Playerstage-users mailing list > > Pla...@li... > > https://lists.sourceforge.net/lists/listinfo/playerstage-users |
From: brian g. <ge...@ro...> - 2003-11-18 16:49:19
|
hi Vik, What John suggested was the following: don't sleep at all. While you sleep, data backs up on the socket from Player. When you wake up and read it, you'll get old data. Instead, Read() every loop; you get data by default at 10Hz, so the PlayerClient::Read() call is like usleep(100000). Then either: (1) count the number of loops since the last time you set speeds, on the assumption that each loop takes 100ms, and only write every 15th time; or (2) actually calculate the exact time since last you set speeds; note that if you're working with Stage, you should use the timestamps that come from the server, rather than wallclock time (e.g., gettimeofday()); the latest time from the server is stored in PlayerClient::timestamp. brian. |