Re: [Bug 1044] New: Broken error propogation logic within solvers

Sagar Behere <[email protected]>
Newsgroups gmane.science.robotics.orocos.devel
Message-ID <CAOFH51vrXa0Gyjuu+nyRzCXoXQRCFjHMOVRSOeVb=a_eTzbW2Q@mail.gmail.com>
On Oct 8, 2013 7:55 PM, "Ruben Smits" <[email protected]> wrote:
>
> Hi Herman,
>
>
> On Tue, Oct 8, 2013 at 7:22 PM, Herman Bruyninckx <
[email protected]> wrote:
>>
>> On Tue, 8 Oct 2013, S Roderick wrote:
>>
>> > http://bugs.orocos.org/show_bug.cgi?id=1044
>> >
>> >           Summary: Broken error propogation logic within solvers
>> >           Product: KDL
>> >           Version: kdl-trunk
>> >          Platform: All
>> >        OS/Version: All
>> >            Status: NEW
>> >          Severity: enhancement
>> >          Priority: P3
>> >         Component: Kinematic Solvers
>> >        AssignedTo: [email protected]
>> >        ReportedBy: [email protected]
>> >   Estimated Hours: 0.0
>> >
>> > [I've discussed this separately with Ruben, and hope that the following
>> > description makes sense]
>> >
>>
>> Thanks for the nice summary of problems described below! They are exactly
>> the reason why I started to fight severely against class libraries for
>> "solvers" of any kind, and the "information hiding behind standardized
>> APIs" that goes naturally with it. Both are not scalable, and too
>> restrictive.
>>
>> Instead, we are now developing a "function blocks on steroids" framework,
>> based on Markus Klotzbuecher's ideas and code. These "micro blocks" are
>> positioned somewhere between OO class libraries and RTT components,
>> introducing "scheduling" and "composable Ports" as the major primitives
to
>> deal with the mentioned problems.
>
>
> Could you elaborate a bit on how this framework would deal with the
specific problem Stephen describes?

+1

I am interested in this too.

/Sagar

> Ruben
>
>>
>>
>> Stay tuned!
>>
>> > A number of KDL solvers use underlying solvers or separate
computations to do
>> > part of their work (e.g. chainiksolverpos_nr uses an IK velocity solver
>> > provided to it, while chainiksolvervel_wdls uses an SVD computation
underneath
>> > it), but fail to correctly propogate failure of any underlying
computation.
>> > There is also a question of what should be propogated if an underlying
>> > computation fails. Should it be a) the raw return code from the
underlying
>> > computation, or b) a return code specific to this solver that simply
indicates
>> > that the underlying computation failed. The first approach means you
have to
>> > avoid duplicate error codes between the parent and any underlying
>> > solver/computation (as one will mask the other), while the second
approach
>> > loses any information on the actual error that occured in the
underlying
>> > solver/computation. Both cases are particularly prevalent if user
created (ie
>> > non-KDL) solvers are used instead of KDL solvers.
>> >
>> > Example
>> > {{{
>> > KDL::Chain = some chain;
>> > ChainFkSolverPos_recursive fksolver1(chain);
>> > ChainIkSolverVel_pinv iksolvervel(chain);
>> > ChainIkSolverPos_NR iksolverpos(chain,fksolver,iksolvervel);
>> > ...
>> > int rc = iksolverpos->CartToJnt(...);
>> > }}}
>> > If the velocity solver iksolvervel, which is used by iksolverpos in the
>> > CartToJnt() call fails, then how do we find out what actually happened
in
>> > iksolvervel? Was it a convergence error? Was it a singularity? etc.
>> >
>> > Currently iksolverpos in the above case will return -3 and any error
code from
>> > iksolvervel is lost. Why would we care? Well with certain solvers,
failure to
>> > converge may result in different behaviour from hitting a singularity
(e.g. you
>> > may continue moving with a degraded result in one case, but not the
other).
>> >
>> > If you modify my patch for #1043 to return the "rc" error code from
the IK
>> > velocity solver, then you're assuming that any set of error codes from
any
>> > given IK velocity solver (as given to the iksolverpos in it's
constructor) are
>> > disjoint from the error codes of the IK position solver. This isn't
scalable to
>> > larger systems.
>> >
>> > Now in the example cod eabove the user has access to both iksolvervel
and
>> > iksolverpos, and so if iksolverpos returned an error code indicating
that the
>> > given IK velocity solver failed, then the caller could query the
iksolvervel
>> > object directly to determine its last error code (presuming it was
modified to
>> > store the last error code ala errno). If all solvers had the same error
>> > behaviour then arbitrary hierarchies of solvers could be used, and
each solver
>> > need only store its last error code, and be able to inform the user
when a
>> > particular underlying solver failed (and so the user would have to
query the
>> > underlying solver directly to determine how it actually failed). This
decouples
>> > the parent solver from having to know anything about the error codes
of the
>> > underlying, child solvers.
>> >
>> > Note that cases like chainiksolvervel_wdls, which use an SVD
computation
>> > underneath, will have to either store the SVD result separately,
provide some
>> > way to map all the SVD error codes into the error codes of the WDLS
solver, or
>> > the SVD computation should be wrapped like a solver with it's own last
error
>> > code made available.
>>
>> Herman
>> --
>> Orocos-Dev mailing list
>> [email protected]
>> http://lists.mech.kuleuven.be/mailman/listinfo/orocos-dev
>
>
>
>
> --
> Ruben Smits, CTO
> +32 479 511 786
> Intermodalics - Kapeldreef 60, 3001 Heverlee - BELGIUM
> www.intermodalics.eu
>
> --
> Orocos-Dev mailing list
> [email protected]
> http://lists.mech.kuleuven.be/mailman/listinfo/orocos-dev
>

-- 
Orocos-Dev mailing list
[email protected]
http://lists.mech.kuleuven.be/mailman/listinfo/orocos-dev
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.