Asked — Edited

Vr Options?

Does anyone know if the SDK of the Oculus Rift package would work with EZB if there was a plug in developed for it? It doesn't really need to be something as big and bulky as that. Very unfortunate that Vuzix is no longer offering support with EZB. That would work great.

Like the Vuzix, I'd like to pull from the IMU data to move servos and transfer the camera feed from the EZ camera to the goggles over two complete separate computers in different places.

Any ideas or suggestions on how to POC this, would be grateful.


ARC Pro

Upgrade to ARC Pro

ARC Pro is your passport to a world of endless possibilities in robot programming, waiting for you to explore.

#177  

I will just try something here...and this could work! And hopefully @ptp can come up with a codeable solution for my idea!:D

PRO
USA
#178  

Obs:

  1. You have a single connection to the EZB. EZBController is a "Singleton" it's shared, so all the RotNew instances call Connect, the first call connects the other calls are ignored. EZB only accepts one TCP/Serial client connection. You can't have your Unity, ARC or a custom SDK application all connected at same time to the same EZB.

The function SetServo (EZB servo position) sends 2 bytes via TCP/Wifi to the controller. No EZ-Script is involved, faster than that only sending the same 2 bytes via Serial Port (EZB wired).

3) The concurrency is handled inside the EZB library. No problem if you have 2 or 20 joints (RotNew instances) sending values at same time, all the values will be serialized (FIFO - First In First Out) and transmitted via the existent connection (point 1).

and yes, you can have a single Unity script capturing the joint values and sending all them with a single API call:


EZB's method signature:
public void SetServoPosition(ServoPositionItem[] servos);

the advantage is a single TCP payload message (e.g. 10 servo positions 10 x 2 bytes = 20 bytes), versus individual 20 messages of 2 bytes.

Don't expect a huge improvement , unless you have bad WIFI connection.

I assume you have configured a RotNew instance per joint, if you have a way to assign a single instance script, i can create another script.

#179  

@ptp thanks for explaining in detail how this works!

1 I understood! 2 Very good, the faster the better for us!:)

Quote:

No problem if you have 2 or 20 joints (RotNew instances) sending values at same time, all the values will be serialized
When I hook up two instances of the script to the BioJoints, the board drops out.

Quote:

I assume you are configure a RotNew instance per joint, if you have a way to assign a single instance script, i can create another script.
This is correct...but there will be three separate scripts, one for X, Y, and one for Z rotations. When I am having one script lets say RotNew_Y and ond RotNew_Z the second script gives me an error saying it cannot connect to the EZ_B... This is why I guess we will have to have one script which can be used to either extract all rotations at once, or works in a way that you can change it to whichever rotation we would want to extract?

PRO
USA
#180  

@Fxrtst:

Quote:

how do we choose X,Y,Z axis for all the joints from the root IK?

Each servo can only represent a single axis (X/Y/Z) rotation e.g. (Yaw/Pitch/Roll).

Mickey666Maus script:


var value = joint.Y.GetTargetValue();
var position = Mathf.RoundToInt((float)value);

Is only looking for the Y part and then only Mickey666Maus knows why:) he adds +90


ZBController.Instance.SetServo(this.name, position + 90 );

So only Y+90 is sent to the EZB Servo.

I'm not an expert in 3D Math... but some points to think:

  1. is the joint.Y.GetTargetValue(), joint.X.GetTargetValue(), joint.Z.GetTargetValue() positions or rotation values ?

  2. If they are positions, does not help. You will need at least 2 reference points and calculate the angles, for each rotation.

  3. If they are rotation values are Radians or Degrees ?

  4. Are rotation values absolute, or related to the Parent's joint ?

  5. Rotation system: Left Hand or Right Hand, you need to understand where X,Y,Z are pointing and if the value increases to the left/right or up/down or CW/CCW.

  6. Each servo represents a Joint Rotation, for example the JD Ankle has two servos: S0 (rotation on axis X) foot servo, S1 (rotation on axis Y) the next servo up. ROS/Right Hand System

So for the servo S0 you want the X rotation value, for the servo S1 you want Y.

  1. Servo rotation is not related to a specific standard (Left/Right hand). Rotation 0 = is the 90 degrees of the servo, if goes positive to the left, and the servo goes to the other side you need to invert the value.

To summarize, if you are communicating directly to the EZB servo, this means you need to find away to setup (Unity) for each servo (not per joint) the following information:

  1. Joint name
  2. Axis value X,Y,Z
  3. Inverted calculation or a Formula

So you have some homework to do:)

PRO
USA
#181  

Is the drop out specific to EZB/ ARC Wi-Fi? I Don't have a FTDI breakout board or I would test.

PRO
USA
#182  
PRO
USA
#183  

Quote:

Is the drop out specific to EZB/ ARC Wi-Fi? I Don't have a FTDI breakout board or I would test.

I don't know, but the update method is called at each frame, and you can't expect to have servos responding so fast.

I think the best option is to print the values in a debug window and see the values and how fast they are being collected (updated).

#184  

@ptp The joint values are rotations in degrees...you get get Radians if you pass GetTargetValue(true) During the setup stage in BioIK it me and @fxrtst both setup our model with degrees that were ranging from -90/+90 degrees in our angle values, so I just put a lazy +90 to the script, it has no other meaning...we could set up the 3D model differently and the +90 is obsolete!:D