Revision: 6615
http://playerstage.svn.sourceforge.net/playerstage/?rev=6615&view=rev
Author: thjc
Date: 2008-06-16 20:35:12 -0700 (Mon, 16 Jun 2008)
Log Message:
-----------
merged p2os kinematics fix from trunk [6579,6584]
Modified Paths:
--------------
code/player/branches/release-2-1-patches/server/drivers/mixed/p2os/kinecalc.cc
Modified:
code/player/branches/release-2-1-patches/server/drivers/mixed/p2os/kinecalc.cc
===================================================================
---
code/player/branches/release-2-1-patches/server/drivers/mixed/p2os/kinecalc.cc
2008-06-17 03:24:37 UTC (rev 6614)
+++
code/player/branches/release-2-1-patches/server/drivers/mixed/p2os/kinecalc.cc
2008-06-17 03:35:12 UTC (rev 6615)
@@ -28,6 +28,7 @@
*/
#include <libplayercore/playercommon.h>
+#include <libplayercore/error.h>
#include "kinecalc.h"
#include <math.h>
@@ -129,9 +130,19 @@
{
KineVector result;
double length = sqrt (vector.x * vector.x + vector.y * vector.y + vector.z *
vector.z);
- result.x = vector.x / length;
- result.y = vector.y / length;
- result.z = vector.z / length;
+ if (length != 0)
+ {
+ result.x = vector.x / length;
+ result.y = vector.y / length;
+ result.z = vector.z / length;
+ }
+ else
+ {
+ PLAYER_WARN ("P2OS: Tried to normalise a vector of zero length.");
+ result.x = 0;
+ result.y = 0;
+ result.z = 0;
+ }
return result;
}
@@ -141,6 +152,27 @@
result.x = pose.o.y * pose.a.z - pose.a.y * pose.o.z;
result.y = pose.o.z * pose.a.x - pose.a.z * pose.o.x;
result.z = pose.o.x * pose.a.y - pose.a.x * pose.o.y;
+ if (result.x == 0 && result.y == 0 && result.z == 0)
+ {
+ PLAYER_WARN ("P2OS: Approach and orientation cannot be the same vector -
their cross product cannot be zero.");
+ // Ensures that a different orientation vector is created
+ KineVector orient;
+ if (pose.a.y == 0 && pose.a.z == 0)
+ {
+ orient.x = 0;
+ orient.y = 1;
+ orient.z = 0;
+ }
+ else
+ {
+ orient.x = 1;
+ orient.y = 0;
+ orient.z = 0;
+ }
+ result.x = orient.y * pose.a.z - pose.a.y * orient.z;
+ result.y = orient.z * pose.a.x - pose.a.z * orient.x;
+ result.z = orient.x * pose.a.y - pose.a.x * orient.y;
+ }
return Normalise (result);
}
@@ -202,7 +234,7 @@
// Next, using theta1_a, calculate thetas 2 and 3 (a and b)
// First up is calculating r and rz
double r = 0.0f, rz = 0.0f;
- if (sin (solutions[0][0]) < 0.1f || sin(solutions[0][0]) > -0.1f)
+ if (sin (solutions[0][0]) < 0.1f && sin(solutions[0][0]) > -0.1f)
{
r = ((p.x - (link5 * a.x)) / cos (solutions[0][0])) - link1;
}
@@ -258,7 +290,7 @@
// First up is calculating r and rz
r = 0.0f;
rz = 0.0f;
- if (sin (solutions[2][0]) < 0.1f || sin(solutions[2][0]) > -0.1f)
+ if (sin (solutions[2][0]) < 0.1f && sin(solutions[2][0]) > -0.1f)
{
r = (p.x - link5 * a.x) / cos (solutions[2][0]) - link1;
}
@@ -477,7 +509,7 @@
{
for (int ii = 0; ii < 5; ii++)
{
- if (angles[ii] < jointMin[ii] || angles[ii] > jointMax[ii])
+ if (angles[ii] < jointMin[ii] || angles[ii] > jointMax[ii] ||
isnan(angles[ii]))
return false;
}
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php
_______________________________________________
Playerstage-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/playerstage-commit