How can I augment a toolbox to improve its capabilities?

2 次查看(过去 30 天)
I am using the Robotics Systems Toolbox and its rotm2eul() function only takes in 3 possible rotation orders, XYZ, ZYX, and ZYZ. With permutations of these types there are 12 possibilities and matlab only works with a quarter of them. Adding support for the others is trivial thanks to the intelligent way the others were programmed. I only need to add 9 lines of code and remove a number of duplicated code statements in various code blocks.
  2 个评论
Walter Roberson
Walter Roberson 2021-1-6
Can the other quarter be build by composing two calls to the function?
Andrew Roley
Andrew Roley 2021-1-6
编辑:Andrew Roley 2021-1-6
@Walter, other quarter? Do you mean the other 3/4?
I think it's a paid toolbox so I don't want to get into hot water posting the full file, but here's the section where only 3 of 12 are implemented. My lines are notated with % ADDED
The function is called with only a Rotation matrix (3x3) and a 3 character string as inputs, and outputs a row vector of the euler angles, so there is not enough new data to call again unless you reconstructed a new rotation matrix in just the right way that you could deconstruct it in the allowed order, which seems like an awefully big workaround.
% Pre-populate settings for different axis orderings
% Each setting has 4 values:
% 1. firstAxis : The right-most axis of the rotation order. Here, X=1,
% Y=2, and Z=3.
% 2. repetition : If the first axis and the last axis are equal in
% the sequence, then repetition = 1; otherwise repetition = 0.
% 3. parity : Parity is 0 if the right two axes in the sequence are
% YX, ZY, or XZ. Otherwise, parity is 1.
% 4. movingFrame : movingFrame = 1 if the rotations are with
% reference to a moving frame. Otherwise (in the case of a static
% frame), movingFrame = 0.
seqSettings.ZYX = [1, 0, 0, 1];
seqSettings.YZX = [1, 0, 1, 1]; % ADDED
seqSettings.XYX = [1, 1, 0, 1]; % ADDED
seqSettings.XZX = [1, 1, 1, 1]; % ADDED
seqSettings.XZY = [2, 0, 0, 1]; % ADDED
seqSettings.ZXY = [2, 0, 1, 1]; % ADDED
seqSettings.YZY = [2, 1, 0, 1]; % ADDED
seqSettings.YXY = [2, 1, 1, 1]; % ADDED
seqSettings.YXZ = [3, 0, 0, 1]; % ADDED
seqSettings.XYZ = [3, 0, 1, 1];
seqSettings.ZXZ = [3, 1, 0, 1]; % ADDED
seqSettings.ZYZ = [3, 1, 1, 1];

请先登录,再进行评论。

采纳的回答

Rik
Rik 2021-1-6
The answer by dpb is what you should do, but the answer to the question as posed is this:
Matlab is closed-source. Mathworks will probably not accept any changes to their code that they didn't write themselves. The cost is not just the edit itself, but also editing the documentation, added testing load to confirm no bugs are (re)introduced, and opportunity cost. The time spent on this function can't be spent elsewhere.
However, you can send an enhancement request which they may act on. It does happen, but they have to be convinced it is worth the cost.
  1 个评论
Andrew Roley
Andrew Roley 2021-1-6
编辑:Andrew Roley 2021-1-6
Hadn't heard of this before, apparently it's a subset of the service request form, found by googling "enhancement request", detailed instructions here .
Thanks!

请先登录,再进行评论。

更多回答(1 个)

dpb
dpb 2021-1-6
Don't have the TB in Q? so can't go look to see, but if it is an m-file, there are two ways -- you can just edit the copy in place although this is strongly discouraged.
Alternatively, shadow the function by creating a copy in a MATLABPATH location that aliases the supplied version -- it will be called preferentially before the original.
A third possiblity is to not use the builtin function directly but write a front end interface routine for it that your code calls and which, in turn, prepares the input into the form needed to call the original and then does so.
  9 个评论
Rik
Rik 2021-1-17
What we mean is something like the code below. The isequal function only compares two objects. This extends that
function tf=all_isqual(varargin)
%Compare all inputs to the first.
%This would be equivalent to isequal(varargin{:}) if isequal would allow multiple inputs.
tf=true;
try elem1=varargin{1};catch,end%reduce the number of times varargin{} is indexed
for n=2:nargin
tf= tf && isequal(elem1,varargin{n});
end
end
dpb
dpb 2021-1-17
I understand there's no real motivation on your end since you have a solution that works and that is the better implementation.
It would only be from your end the intellectual challenge you've outlined plus offering a tool to other users. And that may not be a very large pool, granted.
I can see you choosing either path and either is a perfectly valid choice.

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Source Control Integration 的更多信息

标签

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by