Message Boards Message Boards

0
|
12802 Views
|
35 Replies
|
1 Total Likes
View groups...
Share
Share this post:

Stewart Platform

Posted 9 years ago
Attachments:
POSTED BY: novio8
35 Replies
Posted 9 years ago
POSTED BY: novio8

Hi Mario,

Did you use something like:

ExportMotionPlan[motionPlan,legoffsets_: -{0.17035,0.17035,0.17035,0.17035,0.17035,0.17035}]?

The legoffsets_:{...} idiom is only used in the definition of the function. When you call the function, use:

ExportMotionPlan[ motionPlan, -{0.17035,0.17035,0.17035,0.17035,0.17035,0.17035} ]

Note that using an offset of 1.1313669977935081 is not realistic because the platform height is only 0.15 units. You will get leg lengths, but they won't be very meaningful. The purpose of subtracting the offsets is to get control values for the servo actuators.

Eric

POSTED BY: Eric Johnstone
Posted 9 years ago

Hi Eric, I copied your Code at the end of the Notebook. Replaced Zeroes with Offset Value and I'v received the following error: Syntax::sntxf: "legoffsets_:" cannot be followed by "{1.1313669977935081,1.1313669977935081,1.1313669977935081,1.1313669977935081,1.1313669977935081,1.1313669977935081}". Mario

POSTED BY: novio8
POSTED BY: Eric Johnstone
Posted 9 years ago
POSTED BY: Updating Name
POSTED BY: Eric Johnstone
Posted 9 years ago

Hi Eric, yes that's what I had in mind to import path file back at the end of this Notebook or even a new one.

Mario

POSTED BY: novio8
POSTED BY: Eric Johnstone
Posted 9 years ago

Hi Eric, I'm also confused about leg offsets purpose.

What I would like to do is to read PlatformPath.txt that was generated by ExportMotionPlan....

and substract initial leg length or any other arbitrary number from all of leg lengths written in file PlatformPath.txt and save it as PlatformPath 2.txt

Mario

POSTED BY: novio8
POSTED BY: Eric Johnstone
Posted 9 years ago
POSTED BY: novio8

Hi mario,

It's its own plan. The long and short plans are just longer or shorter. Their structure is the same.

But the motionPlan I implemented doesn't use the Block[]. That was necessary for the substitutions of dx and dtheta.

Inside the Blocks[] you will see the basic structure; a List[] of List[]s.

Eric

POSTED BY: Eric Johnstone
Posted 9 years ago
POSTED BY: Updating Name
POSTED BY: Eric Johnstone
Posted 9 years ago

Hi Eric, yeah me too. I would like to modify the code so that I can enter pose data in Long demonstration motion plan but every second as it is now, but instead only at certain time positions: like the following example:

pose 1 at 1sec,

pose 2 at 4sec,

pose 3 at 4,5sec,

etc. Any suggestions ? Mario

POSTED BY: novio8

Hi Mario,

I learned a lot from this discussion. Please keep asking.

Eric

POSTED BY: Eric Johnstone
Posted 9 years ago
POSTED BY: novio8
POSTED BY: Eric Johnstone
Posted 9 years ago
POSTED BY: novio8
POSTED BY: Eric Johnstone
Posted 9 years ago
POSTED BY: novio8

Hi Mario,

Mathematica seems to flip the meanings of theta and phi. According to the documentation for SphericalPlot3D:

(Pi/2 - theta) corresponds to "latitude"; theta is 0 at the "north pole", and Pi at the "south pole".

Phi corresponds to "longitude", varying from 0 to 2 Pi counterclockwise looking from the north pole.

My text books reverse the definitions of theta and phi.

So, with this in mind, there is nothing wrong with the PoseLegEndpoints[] function. If theta is zero, the vector is pointing towards the north pole, so the value of phi is immaterial.

Eric

POSTED BY: Eric Johnstone
Posted 9 years ago

Hi Eric, I tested your workaround and it works. It is also unusual that z vertical is in second position,

so instead x,y,z it is x,z,y. You are right phi get's calculated only if theta is not 0.

Mario

POSTED BY: novio8
POSTED BY: Eric Johnstone
Posted 9 years ago

yes Leg Lengths are what I'm looking for, but they are not calculated correctly. If you change Long Demonstration Motion Plan, just one Angle at a time to something like this

demoMotionPlan =
  Block[{dx = 0.05, d\[Theta] = 0.5},
   {
    {0, 0, 0, 0, 0, 0},
    {0, 0, 0, d\[Theta], 0, 0},
    {0, 0, 0, 0, 0, 0},
    {0, 0, 0, 0, 0, 0},
    {0, 0, 0, -d\[Theta], 0, 0},
    {0, 0, 0, 0, 0, 0},
    {0, 0, 0, 0, 0, 0},
    {0, 0, 0, 0, d\[Theta], 0},
    {0, 0, 0, 0, 0, 0},
    {0, 0, 0, 0, 0, 0},
    {0, 0, 0, 0, -d\[Theta], 0},
    {0, 0, 0, 0, 0, 0},
    {0, 0, 0, 0, 0, 0},
    {0, 0, 0, 0, 0, d\[Theta]},
    {0, 0, 0, 0, 0, 0},
    {0, 0, 0, 0, 0, -d\[Theta]},
    {0, 0, 0, 0, 0, 0}
    }
   ];

Leg lengths are not calculated for [Phi]. Any Ideas Mario

POSTED BY: novio8
Posted 9 years ago

Hi Mario,

It took a while to go through the code, but I finally get the problem. I don't know what it is; you may have found a bug in Mathematica. But if you use separate RotationTrransforms like this:

PoseLegEndpoints[{x_, y_, z_, \[Theta]_, \[Phi]_, \[Tau]_}] := 
 Table[Composition[
    TranslationTransform[{x, y, z} + {0, platformHeight, 0}], 
    RotationTransform[\[Theta], {1, 0, 0}],
    RotationTransform[\[Phi], {0, 0, 1}],
    RotationTransform[\[Tau], {0, 1, 0}]][p], {p, 
   relativePlatformPoints}]

the second angle calculates.

For a motion path of

testMotionPlan =
  Block[{dx = 0.05, d\[Theta] = 0.5},
   {
    {0, 0, 0, 0, 0, 0},    {0, 0, 0, 0, d\[Theta], 0},
    {0, 0, 0, 0, 0, 0},
    {0, 0, 0, 0, -d\[Theta], 0},
    {0, 0, 0, 0, 0, 0}
    }
   ];

the platform returns to its rest position at the {0, 0, 0, 0, 0, 0} points.

I used the ExportMotionPlan[] function with the last line commented out, as above.

Use MatrixPlot[] to see how the leg lengths change.

Eric

POSTED BY: Updating Name
POSTED BY: Eric Johnstone
Posted 9 years ago
POSTED BY: Updating Name
Posted 9 years ago

Hi, yes it seems that Y is the vertical, which is weird and I can't figure it why. I'v run Evaluate Notebook in Mathematica only, without System Modeler running and it seems OK

It looks like PlatformPath.txt is saved in folder DocumentationFiles that has to be on the same root as Mathematica file StewartPlatform.nb

As I can see you'v saved Mathematica file in to Temp Folder

C:\Documents and Settings\Eric Johnstone\Local Settings\Temp\wz4602\StewartPlatform\DocumentationFiles\PlatformPath.txt. >>

ExportMotionPlan[poses_List, legoffsets_: {0, 0, 0, 0, 0, 0}] :

 Module[{framerate = 10, lengths, tabledata},
  lengths = {First[poses]};
  Do[lengths = 
    Join[lengths, 
     Rest@PoseRange[{Last[lengths], wp}, framerate]], {wp, 
    Rest[poses]}]; AppendTo[lengths, Last[lengths]];
  lengths = Map[PoseLegLengths, lengths];
  lengths = Map[# + legoffsets &, lengths];
  tabledata = 
   MapIndexed[Prepend[#, (First[#2] - 1)/framerate] &, 
    lengths]; {Export[
    FileNameJoin[{NotebookDirectory[], "DocumentationFiles", 
      "PlatformPath.txt"}], {{"LegLengths", tabledata}}, 
    "ModelicaCombiTimeTable"], First[Last[tabledata]]}
  ]

Mario

POSTED BY: novio8
Posted 9 years ago
POSTED BY: novio8
POSTED BY: Eric Johnstone

Maybe I should leave this to the experts, but I've dug my hole now.

As above,

platformHeight=1;
relativePlatformPoints := 
 Table[{Cos[\[Theta]], Sin[\[Theta]], 0}, {\[Theta],  Range[0, 5]/6 2 Pi}]

But the RotationTransform seems to be much simpler:

PoseLegEndpoints[{x_,y_,z_,\[Theta]_,\[Phi]_,\[Tau]_}]:=
Table[
    Composition[
        TranslationTransform[{x,y,z}+{0,0,platformHeight}],
        RotationTransform[\[Theta],{1,0,0}],
        RotationTransform[\[Phi],{0,1,0}],
        RotationTransform[\[Tau],{0,0,1}]
    ]
    [p], {p,relativePlatformPoints}
]

    ListPlot3D[PoseLegEndpoints[{0,0,0,0,0,0}]//N,PlotRange->{{-1.5,1.5},{-1.5,1.5},{-1,2}}]

    Manipulate[
     ListPlot3D[
      PoseLegEndpoints[{x, y, z, \[Theta], \[Phi], \[Tau]}] // N, 
      PlotRange -> {{-1.5, 1.5}, {-1.5, 1.5}, {-1, 2}}], 
        {{x, 0}, -1, 1}, {{y, 0}, -1, 1}, {{z, 0}, -1, 1}, 
        {{\[Theta], 0}, -1, 1}, {{\[Phi], 0}, -1, 1}, {{\[Tau], 0}, -1, 1}]
POSTED BY: Eric Johnstone
Posted 9 years ago
POSTED BY: novio8
POSTED BY: Eric Johnstone
Posted 9 years ago
POSTED BY: novio8
Reply to this discussion
Community posts can be styled and formatted using the Markdown syntax.
Reply Preview
Attachments
Remove
or Discard

Group Abstract Group Abstract