// ███╗ ███╗ █████╗ ██████╗██╗ ██╗██╗███╗ ██╗ █████╗
// ████╗ ████║██╔══██╗██╔════╝██║ ██║██║████╗ ██║██╔══██╗
// ██╔████╔██║███████║██║ ███████║██║██╔██╗ ██║███████║
// ██║╚██╔╝██║██╔══██║██║ ██╔══██║██║██║╚██╗██║██╔══██║
// ██║ ╚═╝ ██║██║ ██║╚██████╗██║ ██║██║██║ ╚████║██║ ██║
// ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝╚═╝ ╚═╝╚═╝╚═╝ ╚═══╝╚═╝ ╚═╝
//
// ███╗ ██╗███████╗████████╗
// ████╗ ██║██╔════╝╚══██╔══╝
// ██╔██╗ ██║█████╗ ██║
// ██║╚██╗██║██╔══╝ ██║
// ██╗██║ ╚████║███████╗ ██║
// ╚═╝╚═╝ ╚═══╝╚══════╝ ╚═╝
//
// ██████╗██╗ ██╗ █████╗ ███╗ ██╗ ██████╗ ███████╗██╗ ██████╗ ██████╗
// ██╔════╝██║ ██║██╔══██╗████╗ ██║██╔════╝ ██╔════╝██║ ██╔═══██╗██╔════╝
// ██║ ███████║███████║██╔██╗ ██║██║ ███╗█████╗ ██║ ██║ ██║██║ ███╗
// ██║ ██╔══██║██╔══██║██║╚██╗██║██║ ██║██╔══╝ ██║ ██║ ██║██║ ██║
// ╚██████╗██║ ██║██║ ██║██║ ╚████║╚██████╔╝███████╗███████╗╚██████╔╝╚██████╔╝
// ╚═════╝╚═╝ ╚═╝╚═╝ ╚═╝╚═╝ ╚═══╝ ╚═════╝ ╚══════╝╚══════╝ ╚═════╝ ╚═════╝
- Hopefully turn this changelog into something more orthodox
- Make
Machina
types JSON-de/serializable viaDataContract
s - The
HUMAN
compiler doesn't export actions with the real/abs and axis/cartesian problem, even though it should since it doesn't really need to apply the actions to the writer... Same for 'MACHINA' compiler... - Add 'EASE' mode to motion, as an option for UR robots to do MoveL
-
noTool
gets declared on every ABB program, even if not used. Fix this, and probably usetool0
on compilation? - Review if second attachments produce a TCP transformation without undoing the previous tool.
- Added
KUKA
online control thanks to @Arastookhajehee! 🤓
- Added
ArcMotion/To
action. ArcMotion
action compiles to ABB offlineArcMotion
action streams to ABB online- Fixed ABB variable-base compiler, id numbers are now correlative.
- Improvements to the
KUKA
compiler from @Arastookhajehee! 😄
- Fixed bug that wouldn't allow
WriteAnalog
andWriteDigital
to be exected on the same program.
- Fixed a bug with
WriteAnalog
onUR
devices.
Action.Id
generation comes from a static
counter in the Action
class. This had a couple problems:
- The counter is unique to the library. So, if a Robot
was Disposed and a new one created, the first action for the second one would pick up from where the previous robot left (like resetting the Bridge multiple times). Alternatively, if the same assembly manages two robots, their action ids would alternate or be entwined.
- Can't do it instance, because it would require factory methods from the robot to create actions
.
- Solution: new Actions
are created with an id
of -1 (or id-less). This maintains the flexibility of creating robot-agnostic actions. However, when they get issued to a Robot
instance, the instance adds a rolling id
coming from an internal counter.
- Let's see how many things I break by doing this... XD
- In any case, in the future, migration to non-numeric ids would be preferred...
- Shift
Action.Id
generation toOnIssue
.
- Softened exceptions for
RobotStudioManager
: they are now Machina Logger Errors. -
ActionExecuted
events are now raised forActions
that are non-streamable (likeMotionMode
). This is a good improvement, and solves a problem with the Bridge were such actions would not get acknowledged.
- Compilers now have embedded abstract comment characters and encoding
- Compilers now return
MachinaFile
objects instead ofList<string>
. This helps with multi-file program creation. MachinaFiles
serialize to different string lists...KUKA
compiler now returnsdat
andsrc
files.-
MachinaFiles
is nowRobotProgramFile
- Added
RobotProgram
as an aggregator ofRobotProgramFiles
. - Adapt the
ABB
compiler to spit out two files - Adapt the
UR
compiler to spit out thescript
file - Adapt all the other compilers to reflect these changes
- Check that all changes work
- Split
Types
namespace intoTypes.Geometry
andTypes.Data
or similar - Will need to change the GH + Dynamo compilers to adapt to these changes...
- Changed the KUKA compiler with edits suggested by Alexander and Matty from RMIT.
- Picked the project up after a long hiatus...
- Added
[ParseableFromString]
attribute for those methods in the API that can be parsed from primitive values. - Changed
Do()
: it now parses a string and tries to turn it into an action using reflection. - Added
Issue(Action)
: does whatDo()
used to do, take an Action and issue it.
- Add
wobj
code option for ABB driver. - Add quick conversion utility which I will totally revert...
- Fix Example files.
- Revert
RobotCursor
to defaultnull
tool; this was giving a full other set of problems... Let's see what I break now by doing this... - Fix bug where tools changes would accumulate rather than undo...
- New build version to keep up with Dynamo app update.
CustomAction
on ABB now adds action id and statemenet terminator automatically.- Add quick custom action on ABB for Yumi gripping
- Fix check on UR protocol
- Helper methods are now under
Machina.Utilites
namespace. - Add utility parsing functions.
- Added more getters for robot state
- More Type stringification
RobotCursor
now has the"noTool"
tool attached by default.- Unstreamable action now is logged at
Verbose
level
- Workaround to SW3.0 crash problem: #7
- Relative actions now log absolute state on Verbose
- UR now uses
movep
for linear motion, to ensure constant speed and blending radius - Fix UR tool rounding error on weight.
- Fix UR analog out not existing for tool
- Fix UR DO for tool not streaming.
- UR now initializes state (no need to start with a
Transform
...) - Improved native type stringification.
- TCP position and Axes are now displayed upon connection.
- Fix typos on UR compiler
- Reverted back to UR
movel
motion on online due to SW3.0 problems: #7 - Additional error handling for UR dis/connection.
- Reverted default
ToString()
to no labels (must extend this behavior to all the other types)
- Made number stringification on compilers
CultureInvariant
- Add
IInstructionable
interface and implement it onTool
and all Actions - Fix
Tool
not attaching correctly when TCP info is missing - The ABB driver now accepts messages longer than 80 chars.
- Change ABB driver to account for different robtarget and jointtarget ext axes.
- Add
ArmAngle
action to set the value of the arm-angle for 7-dof robotic arms. - Add
ArmAngleTo
to the API. For the time being, we will only have absolute modal for this. RobotCursor
now keeps track of cartesian and joint external axes separately.ExternalAxis
now accepts a third parameter as the target for this action: cartesian targets, joint targets or all.- Changes to drivers, added motion update control and
CustomCode
for real-time streaming
- Fix typos on UR modules
- Add
.prg
program init for ABB modules - Add
GetDeviceDriverModules(params)
as a way of retrieving module files - Quick and dirty fixing of the UR manager not being able to reconnect after disconnection
- Fix tool detachment when robot was coming from axis motion.
- Logger functions are public now, so that external clients can log. Not great, but looking at making the Bridge great again!
id
onMachinaEventArgs
json
fixed to number.- Remove several throws in favor of error logs and unsuccessful connections.
- Adding same tool name was giving errors, fixed.
- Add main task loader for
RobotStudioManager
as quick fix to interface to Yumi robots... - Multiple threads were using the same
_responseChunks
array, fixed using a local variable now. - Started stringifying numbers with
Culture.Invariant
, must find a better, more programmatic and less pain in the ass way.
- Added monitoring module for real-time streaming of full poses.
- Add TCP listener for monitor on
TCPCommunicationManagerABB
MotionUpdate
event is raised if real-time data is available on ABB robot.
- Rename main
Control
RobotCursor
s to match the issue/release/execute pattern. - New
ActionExecuted
event, combines formerMotionCursorUpdated
andActionCompleted
in the same event. - New
ActionReleased
event, raised any time anAction
is sent to the device for execution. - New
ActionIssued
event, raised any time anAction
is successfully issued and scheduled for release or compilation. - Base scaffolding for
MotionUpdate
event.
- Created
DefineTool
,AttachTool
andDetachTool
as the new tool-related actions. - Flagged
Attach
andDetach
for deprecation.
- Removal of all
JointAcceleration
,JointSpeed
andRotationSpeed
actions. - Add version check for ABB robots
- Add
ExternalAxis
init msg from the ABB driver - Make sure correct speed values are being sent and parsed by the drivers...
- ABB
- UR
- Massive API deprecation.
- Split
Action
classes - Removed static
Action
constructors. - Add
:base()
to several childrenAction
classes ActionType
is not an abstract property ofAction
- Add
Machina.Logger
for global message logging. - Subscription to
Machina.Logger.WriteLine
broadcasts formatted messages below the setMachina.Logger.SetLevel(int)
. - Improved Logging system
- Console dump levels: DEBUG (5), VERBOSE (4), INFO (3), WARNING (2), ERROR (1) and NONE (0).
- Create
ToolCreated
event (intern request ;) - Add
MACHINA
compiler: it serializes each Action into itsToInstruction
form.
TCPCommunicationManagerABB
now listens to incoming messages from the driverTCPCommunicationManagerABB
now is initialized with pose + joint data from the controller, which means being able to start with any relative/abs motion.TCPCommunicationManagerABB
now waits for initialization data from the driver before successfully connecting, and fails to do so on timeout.
- Create
MachinaEventArgs
abstract class and derivates perEvent
- Each evenArgs now serializes itself into a
JSON
object - Raising all events is now handled by
Control
- Improve
OnActionCompleted
: it now returns the correct remaining action count, plus the buffer.
- Add
ExternalAxes
Action - Add
eternalAxes
as cursor state - Add
ExternalAxes(double? ext1 = null, double? ext2 = null, double? ext3 = null, double? ext4 = null, double? ext5 = null, double? ext6 = null)
- Update ABB driver to 1.0.2
- Update ABB compiler
- Update
ABBCommunicationProtocol
- Add
ExternalAxes
data type to replacedouble?[]
- Add
.ToArrayString()
method to a bunch of data types, to generate array-like string representations:Vector(500, 200, 300)
-->"[500,200,300]"
- Fix a lot of rounding for String representation.
- Change
ExternalAxes(double? a1...a6)
toExternalAxis(axisNumber, value)
- Add
CustomCode(string statement, bool isDeclaration)
Action
- Remove EOL chars and add double quotes to name in
Tool.ToInstruction()
- Update ABB driver
- Deprecate direct
Tool
constructors, substituted with staticTool.Create(...)
- Add a private
Tool
constructor with all parameters as primitives. - Add
Tool.ToInstruction()
method to produce streamable message - Fix typos in
Actions
- Add safe program name check to avoid
- IOs can now be named with
string
- Remove
Robot.SetIOName()
- Add
toolPin
option for IOs (UR robots)
- Add
ToInstruction()
override to Action: Generates a string representing a "serialized" instruction representing the Machina-API command that would have generated this action. Useful for generating actions to send to the Bridge.
-
Speed/To
can now be adouble
-
Precision/To
can now be adouble
- Tweaks to ABB compiler to accept the above.
- Add
Acceleration
andAccelerationTo
actions: add to Actions, Cursor, Settings- Add acceleration params to UR compiler
- Acceleration values of zero or less reset it back to the robot's default.
- Add
RotationSpeed/To()
option- Add ABB correct compilation with defaults
- Add UR warning compilation message
- Add
JointSpeed/To()
andJointAcceleration/To()
for UR robots- Add UR compilation
- Add ABB compilation warnings
- UR streaming
This release focuses on reworking the Streaming mode to base it off TCP connection with the controller server.
- New factory constructor:
new Robot(...)
is nowRobot.Create(...)
-
Offline
mode working with new architecture - Add
ConnectionManager()
with optionsuser
(they are in charge of setting up communication server/firmatas) ormachina
(the library will try to make its best to figure out connection). - Created a lot of utility classes and managers of different kinds, trying to make the library SOLID
- So many other untracked changes...
- Fix C:/mod permissions for non-admins, use ENV system path
- Rework the ABB real-time connection
- Add an overload for TransformTo that takes single values as x, y, z, xvec0, xvec1, xvec2, yvec0, yvec1, yvec2.
- Add BufferEmpty event
- Add MotionCursorUpdated event
- Add
GetCurrentPosition()
vs.GetVirtualPsotion()
, drawing from state/virtual cursor. - Same for orientation and axes.
- Add
SetUser(name, password)
to specify special logging credentials. - RobotWare options are now checked after log-on: for restricted accounts,
system.xml
is not accessible.
- Remove Undefined from MotionMode
- Add some kind of descriptive text for each MotionMode
- Add
ExtrusionRate
toSettings
-
REMOVE THE REGULAR/TO MODEL, and add a ActionMode("absolute"/"relative") to substitute it!- ActionMode becomes a property of the cursor.
- Under this, Actions cannot be independently defined, but their meaning varies depending on when/where in the program they have been issued! :( This detracts from the conceptual independence of the Action and its platform-agnosticity... This may make sense in command-line environments, but will be quite shitty in VPLs
- Make
Push/PopSettings()
storeActionMode
too? --> Decided not to go for this. The focus of this project is the CORE library, not the VPLs APIS... And when writting Machina code, the ...To() suffix is quite convenient and literal to quickly switch between modes, makes different explicit, is faster to type/read, and works better with auto completion in dev IDEs. Furtehrmore, it is interesting to keep the idea that Actions are agnostic to the medium; it would be weird if the same line of code would mean different things depending on the state of the cursor: the action should be absolute or relative on its own. --> VPLs will have selector tabs to change the mode, or additional parameters to set abs/rel mode (the most typical usage scenario is using abs mode anyway...).
-
Add
ExtrusionRateTo()
andTemperatureTo()
-
Add
ExtrusionRateTo()
andTemperatureTo()
-
Rename "MotionType" to "MotionMode": action API and enum value
-
Rename
Mode()
toControlMode()
-
Rename
RunMode()
toCycleMode()
-
Rename 'Attach
' to 'AttachTool
', and 'Detach
' to 'DetachTools
'...? -
Rename 'PushSettings
' to 'SettingsPush
' and same forPop
? -
Print a disclaimer header for exported code
-
Print a disclaimer header for exported code
- Fix ASCII art --> It is bad when writting text from UTF-8 to ASCII (every filetype but human...)
-
Rename
Zone
andJoints
Actions in actions -
Fix OfflineAPIs
- Make sure Extrusion Actions don't cause weird effects in non-3D printer compilers and viceversa
- Rethink what the 3D printer does automatically and what needs to be managed by the user: temperature, calibration, homing... --> The philosophy of the library is that it is a very low-level 3D printer interface as a result of the ibject being a machine that can move in 3D space. It is for simple custom operations, not really for hi-end printing (user would be much better off using a slicer software).
- Focus on the ZMorph for now; if at some point I use other printer, will expand functionality.
- Add
Initialize()
andTerminate()
for custom initialization and ending boilerplates. -
Change--> let's keep it like this for the moment, might be confusing/tyring to combine them. --> Perhaps add aExtrude(bool)
toExtrude(double)
to include ExtrusionRate, and removeExtrusionRate
Extrude(double)
overload tht combines them both?
- Change Joints/To to Axes/To
- Split Compliers into indiv cs
- Add
Temperature()
- Add
Extrude()
- Add
ExtrusionRate()
- Test 'Temperature' etc
- Implement GCode compiler for ZMorph
- Basic 3D Printing example
- Add
SetIOName()
to customize IO names - Rename and migrate
Zone
toPrecision
- FREAKING IOs ;)
- Remove id comments
- Add option to include robot actions as comments
- Fix TPWrite length message on ABB compilers
- Add Tooling for KUKA+UR
- Test that Tool attach/detachment works good
- Vector.Orthoginalize(...)
- First stub at Plane object:
- Constructors with origin and orientation
- BRobot is now called Machina
- Fix big: TransformTo is not working good, only outputs [0,0,0,1] or [1,0,0,0] quaternions for ABB. There was a typo in RM creation.
- Notes on new Reference system:
- Right now
.Coordinates()
accepts aglobal
(robot base) orlocal
(TCP) setting. This means:- On
global
,.MoveTo()
does absolute XYZ in cartesian space and.Move()
does relative transformations in that system - On
local
,.Move()
uses the dynamic TCP reference frame andMoveTo()
still does absolute location based on global coordinates. This is probably not very consistent.
- On
- For starters,
global
could be renamed tobase
orrobotBase
andlocal
totool
. This is probably more understandable. After that, the following will apply:- On
base
,.MoveTo()
does absolute XYZ in cartesian space and.Move()
does relative transformations in that orientation. ABB compilation would use WObj0 - On
tool
,.Move()
uses the TCP reference frame. Because of the dynamic nature of the TCP,MoveTo()
would effectively have the same effect as.Move()
. ABB compilation would use WObj0 and frame is computed internally? UseRelTool
instead?
- On
- On top of this, this would allow for custom reference systems to be entered.
- Let's say we could do:
ReferenceSystem bench = new ReferenceSystem("bench", new Point(300, 0, 200), new Orientation(1, 0, 0, 0, 1, 0)); bot.Coordinates(bench); // Alternatively: ReferenceSystem gig = ReferenceSystem.FromABBWObj("gig", "...wobj declaration string goes here..."); bot.Coordinates(gig);
- From there, postprocessing/compilation could happen with wobjs or the like.
- Cursors will have two additional properties:
Enum CoordinateType {Base, Tool, Custom}
, andCustomCoodinate {null if Base/Tool, Reference obj if Custom}
- Cursors would have two internal frames: one in the chosen reference system, and another one in robot base coordinates. Both representations would be managed simultaneously.
- Let's say we could do:
- Right now
- Add a bunch of public getters to retrieve the state of the robot (useful for testing)
- Add Tools
- Tool class
- Tool Action
- Tool API
- Tool to cursors
- Tool in CompilerABB
- TEST
- Implement .Detach()
- Rework the Rotation interface!
- Massive rework of all classes...
- Quaternion cleanup
- AxisAngle now features a Vector Axis object
- Internal rework of classes and files
- Point is now Vector:
- All internal instances of Point have been changed to Vector
- There is still a new Point class. This is just for the sake of the public API, for the sake of presenting a perceied difference between a location and a direction. This is just cosmetic, everything is Vectors internally...
- Euler Angles --> Rename to YawPitchRoll
- Create class structure
- EU > Q > EU
- EU > RM > EU
- EU > AA > EU
- EU > RV > EU
- This was really helpful, nice tool: http://danceswithcode.net/engineeringnotes/rotations_in_3d/demo3D/rotations_in_3d_tool.html
- ROTATIONMATRIX
- Create 3x3 matrix
- M33 > Q
- Q > M33
- TESTS
- M33 > Q > M33
- TESTS
- M33.Inverse()
- M33.Transpose()
- Orthogonality checks on creation of a M33
- Q > M33 > Q
- Do two opposed quaternions yield the same RM?
- M33 > AA
- AA > M33
- TEST THE ABOVE
- M33 > RV
- RV > M33
- Acknowledge EuclideanSpace
-
ROTATIONVECTOR
- Simple conversion from AxisAngle
- ... a lot of unlogged goodness
- RV > AA > RV
- RV > Q > RV
-
AXISANGLE
- Add AxisAngle.IsEquivalent()
- Implicit conversion to Point
-
Add Point.CompareDirections() for parallelism, orthogonality and oppositeness.
-
Update readme with KUKA implementation and development levels.
- Rework all rotation definitions, add different definition modes, write testing suit, make this good once and for all!
- QUATERNIONS:
- Quaternion Implementation
- Quaternions are always normalized on construction for proper rotation representation
- Add Quaternion Vector-Normalization: if between {-1, 1}, keep scalar component constant and normalize the rotation axis.
- Add fallback to regular normalization if Vector-Norm is not possible.
- Add fallback to convert the Quaternion to identity if trying to normalize a zero-length Q
- The above fallback takes into account the sign of the rotation to return positive or negative identity quaternions (not sure why, it just feels like it makes sense...)
- Fixed a bug that made quaternions flip the axis for negative leading member on Vector-normalization...
- Quaternion -> AaxisAngle -> Quaternion successful conversion
- AXISANGLES:
- AxisAngle implementation
- Auto-normalization on creation
- .IsZero on zero axis or zero angle
- Working simple AxisAngle to Quaternion conversion.
- Add AA -> Q -> AA tests (account for Q returning always positive rotation)
- AxisAngle.Flip() + .Modulate()
- QUATERNIONS:
- Add KUKA KRL. Still a lot of testing to do!
- Add inline generation of poses, instead of splitting them into variables.
- Add 'id' count to Actions
- Reduce numerical precison on string exports, we don't need 15 decimals:
movej(p[0.2, 0.319848077530122, 0.401736481776669, 0.137046446582579, 1.56644805234647, 0.137046446582579], a=1, v=0.025, r=0.001)
- RobotCursor for ABBs and URs is pretty much identical, except for the utility functions, which pretty much relate to compilation anyway. Move this to Compiler and keep one unitary Cursor.
- Add string to Robot constructor to determine robot make.
- Add
.Comment()
to generate inline custom comments - Add
.Comment()
to the Reference. - On export, add an additional file with human-readable instructions --> Added
.Robot("HUMAN")
! Unrecognized brand names default to this compiler.
- Testing and debugging of UR offline code generation
- Project is now targetting .NET framework 4.6.1 (because of the new ABB.Robotics library...)
- BRobot for Dynamo is now a package
- Renamed Rotation.GetRotationVector() to .GetRotationAxis(), this will only return the unit vector corresponding to the rotation axis.
- Added Rotation.GetRotationVector() to return the axis-angle representation of the Quaternion https://en.wikipedia.org/wiki/Axis%E2%80%93angle_representation
- Add Joint.Scale()
- Fix PushPop actions generating targets on compilation
- Updated old TEST_OfflineAPITests to new abs+rel conventions, specially speeds and zones.
- Rework Actions
- Make a static API that can generate them as objects
- Add the possibility of not inputing speed+zone+mType, and stick to the previous cursor state
- Merge R+T & T+R into one.
- Do Speed(), Zone() and Motion() become Actions as well? How would this work with push+popSettings?
- If they were Actions, relative and absolute modes could be implemented: .Speed(10) is an increase, .SpeedTo(10) is a setting.
- Add a CS constructor from a Rotation object
- R+T vs T+R order in Transform isn't working
- This example doesn't work!
Point dir = new Point(0, 5, 0); for (var i = 0; i < 36; i++) { bot.Move(dir); dir.Rotate(0, 0, 1, -10); // rotate the vector 10 degs around unit Z vector Console.WriteLine("DIR" + dir); }
- Implement Actions in a Dynamo suite of nodes
- Fixed local orientation problem
- Reworked Settings to become Actions: Speed, Zone, Motion and Coordinates.
- Modify walkthoruhg and API with SpeedTo + ZoneTo
- Add static Action constructors mirroring the main API
- Bring back Push and PopSettings with some simple workaround
- Get stream mode working again, with all available actions
- Improved subscription and disposal methods, looks like it might now be reliable if the client always properly disconnects...
- Robot.ControlMode() is now .Mode()
- ProgramGenerator class is now Compiler
- Deactivated Queue class
- Deactivated Path class and all related methods
- Rebirth of Execute mode
- motionCursor
- .Execute() instruction
- Move ActionBuffer and Compiler now to the RobotCursor class
- Add some queue manager for actions released from the virtualCursor and awaiting in the writerCursor. In other words, find a way to .Execute() several buffered actions, and have the queue manager wait for the robot to stop running the program before sending a new batch of instructions. --> Do actionBuffers belong to the virtualCursors?? --> Added this in a rather weird way, not sure if I should rethink this...
- Add comments to all of the above, it is kinda confusing right now...
- Add joint position on Execute cursor initilaization.
- Removed device-specific overloads from primitive DataTypes.
- Quick Dynamo ZeroTouchNodes test
- Rename the project ;)
- List .Export()
- API implementations:
- .Coordinates()
- back to .Move() relying on current CS and .MoveTo() as absolute
- same with .Rotate() and .Transform()
-
transform J options--> will use .Motion(strType) as a setting instead
- Fixed ProgramGenerator bug running actions twice on writeCursor.
- API consolidation: make a decision about the final syntax of rel/abs/local/world transforms
- Write a full 'unit test' program to verify functionality doesn't break
- Add comments to all missing actions
- Rename all syntax instances of 'velocity' (vector) to 'speed' (scalar)
- Refactor .setvel and .setzone to .speed and .zone
- Remove MointType.Joints: there is only one type of ActionJoint, so there is no need to specify this
- Improved ProgramGenerator workflow
-
Resolve inconsistencies between degree and radian angle representation (make everything radians by standard, with special overloads for degrees?)--> Hybrid: all inputs are degs, all return values are radians...
- Add .Message(string) action ;) (will be a good test for program generation with non-movement actions)
- Add .Wait(long millis) action
- Rewrite program generation to accept non-movement actions (or even the ones that don't apply at all) --> This could be done more programmatically, but moving on... :)
- Add .Joints() and .JointsTo() actions
- Refine Actions checks on first type issued as absolute...
- Test Z table limitations with RT + TR transformations
- Port Util methods as static to their appropriate geometry class
- Rewrite relative .Move actions:
- Implement .MoveGlobal() --> moves the TCP this increment in World coordinates
- Implement .MoveLocal() --> moves the TCP this increment in TCP coordinates
- Add Transform() actions: a combination of Move and Rotate at the same time
- .TransformTo()
- .TransformLocal()
- .TransformGlobal()
- Inverse Rot + Trans action
- Implement bot.PushSettings() & bot.PopSettings();
- Necessary geometry implementations for Rotations:
- Quaternion unitization
- Quaternion from vector and angle, including unit vector checks
- Quaternion multiplication
- Transformation of a Point by a Quaternion rotation.
- Get Vector and Angle from a rotation: always return the positive angle solution?
- CHANGE FUCKING Q1..Q4 CONVENTION FOR ABB ROBOTS... XD
- CoordinateSystem class, representing a 3x3 rotation matrix
- A robust Quaternion from vecX, vecY with internal checks
- And back to CS from Quaternion! ;)
- Add Rotate() actions
- RotateTo(q1..q4); // hardcode quat rotation --> NO, not intuitive for the user...
- RotateTo(vecX, vecY); // note this method should take care of normalizing and orthogonizing the vectors, with Z being unnecessary
- RotateTo(Rotation)
- RotateTo(CoordinateSystem)
- RotateGlobal(); // rotates current TCP around world axis
- RotateLocal(); // rotates current TCP aroung local axis
- Code cleanup and commenting
- Create a basic offline example
- Fix broken examples
- Added placeholder API actions
- Add internal names to VirtualPointers
- Renamed RobotPointer to RobotCursor
- Restructure crappy barfed code more programmatically --> Wait till a more complete scope arises.
- Develop 'Offline' mode with the new framework
- Still shaky and narrow, but the main foundation is there... :)
- Implement RobotPointers class
- Low-level state description of Virtual, Streaming and Real robots
- Link the virtual one to API-level instructions
- Implement API-level instructions
- .Move()
- .MoveTo()
- .Rotate()
- .RotateTo()
- .Transform() // movement and rotation combined
- .TRansformTo()
- All the above in J mode (joint movement)
- .Joints() // relative joint movement
- .JointsTo() // absolute joint movement
- .FullTransform() // a full constructor with all
- .FullJoint() // a full constructor
- Create a framework for abstract Actions
- Create Action class, very low-level: mostly just primitive properties.
- Design it to be either two types (transform vs joints) or a single one (how?)
- Add properties for abs/rel Pos, abs/rel Rot, abs/rel Joint, movement type (lin/joint), vel, zone.
- Create an ActionBuffer class where issued actions get buffered until released somewhere (to a file as a module, to the controller as an uploaded program, to he controller as individual targets).
- New class structure:
- Split all the public Robot API from all the internal actual operations
- Centralize private methods into a Control class
- Add placeholder classes for future developments (Tool, Library, Solvers, etc.)
- Create a dedicated Communication class to handle connections to real/virtual controllers
- Port all current functionality into the new structure
- Make sure everything works as before with the new structure
- Add Build number
- Merged ConnectionMode & OnlineMode into ControlMode
- Split off the Comm object
- Remove all references to ABB objects from Control class.
- Big comments review
- Deep port of all functionality (make the Robot class basically a very shallow middleware for API purposes)
- Dead code cleanup
- Recheck all examples are working correctly and nothing is broken before branching
- Previous test and prototyping builds
- Transitioning to a split class architecture and more programmatic implementation