This service is slightly different that controlling the SSC-32. The major difference is this line from Lynx6Arm.cs:
[AlternateContract(armproxy.Contract.Identifier)]
This specifies the arm not only supports it’s own contract, it also supports the generic arm contract to control it. Where this gets confusing is in the file Lynx6ArmTypes.cs where you see
public class Lynx6ArmOperations : PortSet<
DsspDefaultLookup,
DsspDefaultDrop,
Get>
This makes it looks like the arm can only be queried for information (Get) without sending it any new commands. Not very helpful.
However, while the _mainPort named /Lynx6Arm only supports these operations there is a second port named /arm which supports a whole new set of operations.
I find the simplest way to deetermine what you can do with the arm is to right-click on the type for the /arm port (ArticulatedArmOperations) and select “Go To Definition”.
This will move to a metadata file and show you a whole group of operations:
[code] public static implicit operator Port(ArticulatedArmOperations portSet);
public static implicit operator Port(ArticulatedArmOperations portSet);
public static implicit operator Port(ArticulatedArmOperations portSet);
public static implicit operator Port(ArticulatedArmOperations portSet);
public static implicit operator Port(ArticulatedArmOperations portSet);
public static implicit operator Port(ArticulatedArmOperations portSet);
public static implicit operator Port(ArticulatedArmOperations portSet);
public static implicit operator Port(ArticulatedArmOperations portSet);
public static implicit operator Port(ArticulatedArmOperations portSet);
public static implicit operator Port(ArticulatedArmOperations portSet);
public virtual PortSet<DefaultDropResponseType, Fault> DsspDefaultDrop();
public virtual PortSet<DefaultDropResponseType, Fault> DsspDefaultDrop(DropRequestType body);
public virtual PortSet<LookupResponse, Fault> DsspDefaultLookup();
public virtual PortSet<LookupResponse, Fault> DsspDefaultLookup(LookupRequestType body);
public virtual PortSet<ArticulatedArmState, Fault> Get();
public virtual PortSet<ArticulatedArmState, Fault> Get(GetRequestType body);
public virtual PortSet<GetEndEffectorPoseResponse, Fault> GetEndEffectorPose();
public virtual PortSet<GetEndEffectorPoseResponse, Fault> GetEndEffectorPose(GetEndEffectorPoseRequest body);
public void Post(DsspDefaultDrop item);
public void Post(DsspDefaultLookup item);
public void Post(Get item);
public void Post(GetEndEffectorPose item);
public void Post(ReliableSubscribe item);
public void Post(Replace item);
public void Post(SetEndEffectorPose item);
public void Post(SetJointTargetPose item);
public void Post(SetJointTargetVelocity item);
public void Post(Subscribe item);
public virtual PortSet<SubscribeResponseType, Fault> ReliableSubscribe(IPort notificationPort);
public virtual PortSet<SubscribeResponseType, Fault> ReliableSubscribe(ReliableSubscribeRequestType body, IPort notificationPort);
public virtual PortSet<DefaultReplaceResponseType, Fault> Replace();
public virtual PortSet<DefaultReplaceResponseType, Fault> Replace(ArticulatedArmState body);
public virtual PortSet<DefaultUpdateResponseType, Fault> SetEndEffectorPose();
public virtual PortSet<DefaultUpdateResponseType, Fault> SetEndEffectorPose(SetEndEffectorPoseRequest body);
public virtual PortSet<DefaultUpdateResponseType, Fault> SetJointTargetPose(SetJointTargetPoseRequest body);
public virtual PortSet<DefaultUpdateResponseType, Fault> SetJointTargetPose(string jointName, Vector3 targetPosition, AxisAngle targetOrientation);
public virtual PortSet<DefaultUpdateResponseType, Fault> SetJointTargetVelocity(SetJointTargetVelocityRequest body);
public virtual PortSet<DefaultUpdateResponseType, Fault> SetJointTargetVelocity(string jointName, Vector3 targetVelocity);
public virtual PortSet<SubscribeResponseType, Fault> Subscribe(IPort notificationPort);
public virtual PortSet<SubscribeResponseType, Fault> Subscribe(SubscribeRequestType body, IPort notificationPort);
[/code]
Most of these aren’t helpful, but you are interested in a couple of them: SetEndEffectorPose and GetEndEffectorPose. These will allow you to control the position of the gripper using inverse kinematics. If you wish to control the joints more directly you can use SetJointTargetPose which allows you to specify absolute joint positions.
As a test you can bring up the simple dashboard that comes with MSRS and open the arm to control it directly.