model BasicRelativePosition "Basic sensor to measure relative position vector"
import Modelica.Mechanics.MultiBody.Types.ResolveInFrameAB;
extends Modelica.Mechanics.MultiBody.Sensors.Internal.PartialRelativeBaseSensor;
Modelica.Blocks.Interfaces.RealOutput r_rel[3](each final quantity = "Length", each final unit = "m") "Relative position vector frame_b.r_0 - frame_a.r_0 resolved in frame defined by resolveInFrame"
annotation (Placement(transformation(
origin = {0, -110},
extent = {
{-10, -10},
{10, 10}},
rotation = 270)));
parameter Modelica.Mechanics.MultiBody.Types.ResolveInFrameAB resolveInFrame = Modelica.Mechanics.MultiBody.Types.ResolveInFrameAB.frame_a "Frame in which output vector r_rel is resolved (world, frame_a, frame_b, or frame_resolve)";
equation
if resolveInFrame == ResolveInFrameAB.frame_a then
r_rel = Frames.resolve2(frame_a.R, frame_b.r_0 - frame_a.r_0);
elseif resolveInFrame == ResolveInFrameAB.frame_b then
r_rel = Frames.resolve2(frame_b.R, frame_b.r_0 - frame_a.r_0);
elseif resolveInFrame == ResolveInFrameAB.world then
r_rel = frame_b.r_0 - frame_a.r_0;
elseif resolveInFrame == ResolveInFrameAB.frame_resolve then
r_rel = Frames.resolve2(frame_resolve.R, frame_b.r_0 - frame_a.r_0);
else
assert(false, "Wrong value for parameter resolveInFrame");
r_rel = zeros(3);
end if;
annotation (
Icon(
coordinateSystem(
preserveAspectRatio = true,
extent = {
{-100, -100},
{100, 100}}),
graphics = {
Text(
extent = {
{12, -76},
{96, -106}},
textString = "r_rel"),
Text(
extent = {
{-127, 95},
{134, 143}},
textString = "%name",
lineColor = {0, 0, 255})}),
Documentation(info = "<html>\n<p>\nThis basic sensor is aimed to be used within advanced sensors where\nthe relative position vector between the origins of frame_a and frame_b should be determined.\nThis vector is provided at the output signal connector <strong>r_rel</strong>.\n</p>\n\n<p>\nVia parameter <strong>resolveInFrame</strong> it is defined in which frame\nthe position vector is resolved:\n</p>\n\n<table border=1 cellspacing=0 cellpadding=2>\n<tr><th><strong>resolveInFrame =<br>Types.ResolveInFrameAB.</strong></th><th><strong>Meaning</strong></th></tr>\n<tr><td>world</td>\n <td>Resolve vector in world frame</td></tr>\n\n<tr><td>frame_a</td>\n <td>Resolve vector in frame_a</td></tr>\n\n<tr><td>frame_b</td>\n <td>Resolve vector in frame_b</td></tr>\n\n<tr><td>frame_resolve</td>\n <td>Resolve vector in frame_resolve</td></tr>\n</table>\n\n<p>\nIn this basic sensor model, <strong>the connector frame_resolve\nis always enabled and must be connected</strong>.\nIf resolveInFrame = Types.ResolveInFrameAB.frame_resolve, the vector r_rel is\nresolved in the frame to which frame_resolve is connected.\n</p>\n\n<h4>Example</h4>\n<p>\nIf resolveInFrame = Types.ResolveInFrameAB.frame_a, the output vector is\ncomputed as:\n</p>\n\n<blockquote><pre>\nr_rel = MultiBody.Frames.resolve2(frame_a.R, frame_b.r_0 - frame_a.r_0);\n</pre></blockquote>\n</html>"));
end BasicRelativePosition;