uicontrol fails to callback

classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

uicontrol fails to callback

Octave User
Dear Sir

I run a robotic simulation code to octave and encounter some callback issue. I hope experts on this forum can help me to go through it.

the original code is here. 

when it executes to uicontrol('sty','pu','callback',@pp,'string','Go','backgroundcolor','w')

the error shows:
error: @setmap: no function and no method found
error: called from
    testUncontrolCallback at line 20 column 11
error: evaluating argument list element number 8
error: called from
    testUncontrolCallback at line 20 column 11
error: octave_base_value::int_value (): wrong type argument 'scalar'
error: octave_base_value::int_value (): wrong type argument 'scalar'


However, the function pp is just at the bottom of the same code.

In order to verify the question, I also run the matlab uicontrol example code on octave. It also didn't work with the same error.

I would appreciate if anyone can help. Thank you very much

Finally, in case some one does not have a matlab account, I post the code at below as reference.




===============================================================

function roboticsc(varargin)
        global tts ss5 T2 f kkx kky kkz
        figure('un','n','num','off','nam','Robot','color','w','pos',[.1 .1 .8 .8])
       
        ma = axes('pos',[.15 .15 1 1]);
        axis off
        view(3)
        rotate3d
        grid on
        hold on
       
        axes('pos',[.01 .91 .45 .05])
       
        text('position',[0.01,.5],'string','\alpha_i_-_1   a_i_-_1    d_i      \theta_i              q_i','fontsize',15,'fontangle','i')
        axis off
        axes(ma)
        e1=uicontrol('sty','e','un','n','pos',[.01 .5 .225 .4],'backgroundcolor','w','max',2,'ho','l','fonts',10,'fontn','courier');
        e5=uicontrol('sty','e','un','n','pos',[.25 .5 .05 .4],'backgroundcolor','w','max',2,'fonts',10,'fontn','courier');
       
        uicontrol('sty','pu','callback',@pp,'string','Go','backgroundcolor','w')
        lxf=uicontrol('sty','li','string',{'Null';'Planar';'Puma 560';'Complete';'Piper''s 1st';'Yasukawa L-3';'Stanford';'IRB1400';'DIESTRO';'DLR'},'callback',@dl,'un','n','pos',[.7 .05 .2 .1],'backgroundcolor','w');
       
        function T=trans(al,a,d,t)
               
                T=[cos(t) -sin(t) 0 a;
                        sin(t)*cos(al) cos(t)*cos(al) -sin(al) -sin(al)*d;
                        sin(t)*sin(al) cos(t)*sin(al) cos(al) cos(al)*d;
                        0 0 0 1];
               
        end
       
        function dl(varargin)
                set(dumd,'string','0')
                switch get(lxf,'value')
                        case 1
                                set([e5,e1],'string','','sty','e')
                        case 2
                                set(e1,'string',strvcat('0 2 0 0','0 2 0 0','0 2 0 0')) %#ok<*VCAT>
                                set(e5,'string',['t';'d';'t'])
                        case 3
                                set(e1,'sty','e')
                                set(e1,'str',strvcat('0 0 0 0','-pi/2 0 0 0','0 3 1 0','-pi/2 1 2 0','pi/2 0 0 0','-pi/2 0 0 0'))
                                set(e5,'string',['t';'t';'t';'t';'t';'t'])
                        case 4
                                set(e1,'sty','e')
                                set(e1,'str',strvcat('0 0 3 0','-pi/2 0 3 pi/2','pi/2 0 3 0'))
                                set(e5,'string',['d';'d';'d'])
                        case 5
                                set(e1,'sty','e')
                                set(e5,'string',['t';'t';'t';'t';'t';'t'])
                                set(e1,'str',strvcat('0 0 0 0','pi/2 0 2 0','-pi/2 2 2 0','pi/2 2 2 0','-pi/2 0 0 0','pi/2 0 0 0'))
                        case 6
                                set(e1,'sty','e')
                                set(e5,'string',['t';'t';'t';'t';'t'])
                                set(e1,'str',strvcat('0 0 0 0','-pi/2 0 0 0','0 3 0 0','0 4 0 0','pi/2 0 0 0'))
                        case 7
                                set(e1,'sty','e')
                                set(e5,'string',['t';'t';'d';'t';'t';'t'])
                                set(e1,'str',strvcat('0 0 0 0','-pi/2 0 4 0','pi/2 0 3 0','0 0 0 0','-pi/2 0 0 0',...
                                        'pi/2 0 2 0'))
                        case 8
                                set(e1,'sty','e')
                                set(e5,'string',['t';'t';'t';'t';'t';'d'])
                                set(e1,'str',num2str([      0           0        4.75           0
                                        1.5708         1.5           0      1.5708
                                        0           6           0           0
                                        1.5708         1.2         7.2           0
                                        -1.5708           0           0           0
                                        1.5708           0        0.85           0]));
                        case 9
                                sdgsdg=[-1.5708           5           5     0.25533
                                        1.5708           5           5     0.25533
                                        -1.5708           5           5      1.2766
                                        1.5708           5           5      1.2766
                                        -1.5708           5           5      1.2766
                                        1.5708           5           5      1.2766];
                                sdgsdg(:,end) = zeros(6,1);
                                set(e1,'sty','e','str',num2str(sdgsdg))
                                set(e5,'string',['t';'t';'t';'t';'t';'t'])
                               
                        case 10
                                sdgsdg=[       1.5708            0            0            0
                                        1.5708            0            0            0
                                        1.5708            0            3            0
                                        1.5708            0            0            0
                                        1.5708            0            3            0
                                        1.5708            0            0            0
                                        1.5708            0            4            0
                                        ];
                                sdgsdg(:,end) = rand(7,1);
                                set(e1,'sty','e','str',num2str(sdgsdg))
                                set(e5,'string',['t';'t';'t';'t';'t';'t';'t'])
                               
                               
                end
        end
       
        function pp(varargin)
               
                cla
                plot3(0,0,0,'r*')
                set(dumd,'string','0');
               
                DH=str2num(get(e1,'string'));
               
                al=DH(:,1);
                a=DH(:,2);
                d=DH(:,3);
                t=DH(:,4);
               
                w=get(e5,'string');
                delete(findobj('type','uicontrol','style','slider'));
                delete(findobj('type','uicontrol','style','text'));
                tts=uicontrol('sty','te','backgroundcolor','w','un','n','pos',[.7 0 .2 .05],'string','','fontsize',15);
               
                for k=1:length(a)
                        if strcmp(w(k),'t')
                                eval(['uicontrol(''style'',''slider'',''units'',''norm'',''pos'',[.1 ',num2str(k*.1/2),' .1 .05 ],''callback'',@slm,''min'',-2*pi-.1,''max'',2*pi+.1,''value'',',...
                                        num2str(t(k)),')'])
                                eval(['uicontrol(''style'',''text'',''fontsize'',14,''fontname'',''calibri'',''fontangle'',''italic'',''units'',''norm'',''backgroundcolor'',''w'',''pos'',[.2 ',num2str(k*.1/2),' .05 .05 ],''string'',',...
                                        '[''t',num2str(k),'''])'])
                        else
                                eval(['uicontrol(''style'',''slider'',''units'',''norm'',''pos'',[.1 ',num2str(k*.1/2),' .1 .05 ],''callback'',@slm,''min'',-50,''max'',50,''value'',',...
                                        num2str(d(k)),',''sliderstep'',[.001 .05])'])
                                eval(['uicontrol(''style'',''text'',''fontname'',''calibri'',''fontsize'',14,''fontangle'',''italic'',''units'',''norm'',''backgroundcolor'',''w'',''pos'',[.2 ',num2str(k*.1/2),' .05 .05 ],''string'',',...
                                        '[''d',num2str(k),'''])'])
                        end
                end
               
                T=cell(length(a),1);
                f=1;
                for k=1:length(a)
                        T{k}=trans(al(k),a(k),d(k),t(k));
                        f=f*T{k};
                end
                set(e1,'style','li')
               
                delete(findobj('type','uicontrol','style','pus','string','Set'));
                delete(findobj('type','uicontrol','style','edit','pos',[.025 .4 .2 .025]));
                ep=uicontrol('sty','ed','un','n','pos',[.025 .4 .2 .025],'backgroundcolor','w');
                uicontrol('sty','pu','un','n','pos',[.025 .425 .05 .025],'string','Set','callback',@chl,'backgroundcolor','w');
                set(e1,'value',1,'callback',@leq)
               
                ss5=abs(sum([d;a]));
                slm(ss5)
                leq
               
                function leq(varargin)
                        ss=get(e1,'string');
                        vv=get(e1,'value');
                        sv=ss(vv,:);
                        set(ep,'string',sv)
                end
               
                function chl(varargin)
                        set(dumd,'string','0');
                        val=str2num(get(ep,'string'));
                        ss=get(e1,'string');
                        vv=get(e1,'value');
                       
                        ss=str2num(ss);
                        ss(vv,:)=val;
                        set(e1,'string',num2str(ss))
                        pp;
                end
        end
       
        function slm(varargin)
                axis on
                set(e1,'value',1)
               
                ll=flipud(findobj('type','uicontrol','style','slider'));
                cla;
                hold on
                plot3(0,0,0,'r*')
               
                DH=(str2num(get(e1,'string'))); %#ok<*ST2NM>
               
                al=DH(:,1);
                a=DH(:,2);
                d=DH(:,3);
                t=DH(:,4);
               
                w=get(e5,'string');
                n=length(a);
               
                for k=1:length(a)
                        if strcmp(w(k),'t')
                                t(k)=get(ll(k),'value');
                        else
                                d(k)=get(ll(k),'value');
                        end
                end
               
                FFF=num2str([al,a,d,t],5);
                set(e1,'string',FFF)
                T=cell(length(a),1);
                f=1;
                for k=1:length(a)
                        T{k}=trans(al(k),a(k),d(k),t(k));
                end
               
                T2=cell(n,1);
                T2{1}=T{1};
                for k=2:n
                        T2{k}=T2{k-1}*T{k};
                end
               
                pv=plotorg([eye(4),[0;0;0;0]]);
                for k=1:n
                        if w(k)=='d'
                                T2{k}=T2{k}+[0,0,0,0;0,0,0,0;0,0,0,0;1,0,0,0];
                        else
                                T2{k}=T2{k}.*(1-[0,0,0,0;0,0,0,0;0,0,0,0;1,0,0,0]);
                        end
                        if k<n && abs(a(k+1))>1e-10 && abs(d(k))>1e-10
                                pv=plotorg([double(T2{k}),[pv;k]],'t',[a(k+1),d(k),al(k)]);
                        elseif k<n && abs(a(k+1))>1e-10
                                pv=plotorg([double(T2{k}),[pv;k]],'a',a(k+1));
                        elseif abs(d(k))>1e-10
                                pv=plotorg([double(T2{k}),[pv;k]],'d',[d(k),al(k)]);
                        else
                                pv=plotorg([double(T2{k}),[pv;k]]);
                        end
                end
               
                % axis([-ss5-2 ss5+2 -ss5-2 ss5+2 -ss5-2 ss5+2])
                PPPPP=T2{end};
                set(tts,'string',sprintf('%2.2f ',transpose(PPPPP(1:3,4))));
               
                dddd=T2{end};
                disp((dddd))
               
                if strcmp(get(dumd,'string'),'0')
                        JL = zeros(length(w),2);
                        for klk = 1:length(w)
                               
                                if strcmp(w(klk),'t')
                                        JL(klk,:) = [0,2*pi];
                                else
                                        JL(klk,:) = [-ss5,ss5];
                                end
                               
                        end
                       
                        [kkx,kky,kkz] = mc(DH,w,JL);
                        set(dumd,'string','1');
                end
                axis([min(kkx),max(kkx),min(kky),max(kkx),min(kkz),max(kkz)]);
                axis square
                function [pv,g]=plotorg(T,varargin)
                       
                        nuk = T(end);
                        w=get(e5,'string');
                       
                        res=10;
                        R=T(1:3,1:3);
                       
                        g2=tr2eul(R);
                        g=struct;
                        g.a=g2(1);
                        g.b=g2(2);
                        g.g=g2(3);
                       
                        P=T(1:3,4);
                       
                        pp=plot3(P(1),P(2),P(3),'k.');
                        set(pp,'markersize',20)
                       
                        [A,B,C]=sphere(res);
                        pp1=surf(A.*.5+P(1),B.*.5+P(2),C.*.5+P(3));
                       
                        if T(4,1)==1
                                set(pp1,'edgecolor','none','facealpha',.5,'facecolor','y')
                        else
                                set(pp1,'edgecolor','none','facealpha',.5,'facecolor','c')
                        end
                       
                        lz=line([P(1) P(1)],[P(2) P(2)],[ P(3) P(3)+2.5]);
                        set(lz,'color','g','linewidth',1.5,'linestyle','-.')
                       
                        ly=line([P(1) P(1)],[P(2) P(2)+2.5],[ P(3) P(3)]);
                        set(ly,'color','r','linewidth',1.5,'linestyle','-.')
                        lx=line([P(1) P(1)+2.5],[P(2) P(2)],[P(3) P(3)]);
                        set(lx,'color','b','linewidth',1.5,'linestyle','-.')
                       
                        t1=text('string',['x_',num2str(T(4,5))],'position',[P(1)+1.25 P(2) P(3)+.05]);
                        t3=text('string',['y_',num2str(T(4,5))],'position',[P(1) P(2)+1.25 P(3)+.05]);
                        t2=text('string',['z_',num2str(T(4,5))],'position',[P(1)+.05 P(2) P(3)+1.25]);
                       
                        pv=T(1:3,5);
                        if T(4,5)==0
                                set([ly,lx,lz],'color','k','linestyle','-','linewidth',1)
                                delete(pp1)
                                return
                        end
                       
                        ppj=[];
                        if numel(varargin)
                                if strcmp(varargin{1},'a')
                                        [A,B,C]=cylinder(.5,res);
                                        mor=surf(A+P(1),B+P(2),C.*varargin{2}+P(3));
                                        set(mor,'facecolor',[.4 .8 .4])
                                        rotate(mor,[0,1,0],90,P)
                                       
                                elseif strcmp(varargin{1},'d')
                                        ll=varargin{2};
                                        [A,B,C]=cylinder(.5,res);
                                        mor=surf(A+P(1),B+P(2),C.*ll(1)+P(3));
                                        [A,B,C]=sphere(res);
                                        ppj1=surf(A.*.5+P(1),B.*.5+P(2),C.*.5+P(3)-ll(1));
                                        if strcmp(w(T(4,5)),'d')
                                                set(mor,'facecolor',[.14 .18 .14])
                                                set(ppj1,'facecolor',[.4 .8 .4],'facealpha',.5,'facecolor','y')
                                        else
                                                set(mor,'facecolor',[.4 .8 .4])
                                                set(ppj1,'facecolor',[.4 .8 .4],'facealpha',.5,'facecolor','c')
                                        end
                                        rotate(mor,[0,1,0],180,P)
                                        ppj=[ppj,ppj1];
                                else
                                        ll=varargin{2};
                                        [A,B,C]=cylinder(.5,res);
                                        mor1=surf(A+P(1),B+P(2),C.*ll(1)+P(3));
                                        set(mor1,'facecolor',[.4 .8 .4])
                                        rotate(mor1,[0,1,0],90,P)
                                       
                                        [A,B,C]=cylinder(.5,res);
                                        mor=surf(A+P(1),B+P(2),C.*ll(2)+P(3));
                                        [A,B,C]=sphere(res);
                                        ppj2=surf(A.*.5+P(1),B.*.5+P(2),C.*.5+P(3)-ll(2));
                                       
                                        if strcmp(w(T(4,5)),'d')
                                                set(mor,'facecolor',[.14 .18 .14])
                                                set(ppj2,'edgecolor','none','facecolor','y')
                                        else
                                                set(mor,'facecolor',[.4 .8 .4])
                                                set(ppj2,'edgecolor','none','facecolor','c')
                                        end
                                        rotate(mor,[0,1,0],180,P)
                                       
                                        mor=[mor,mor1];
                                        ppj=[ppj,ppj2];
                                       
                                end
                        else
                                mor=[];
                        end
                       
                        set(findobj('type','surface'),'facealpha',.5,'edgecolor','k','edgealpha',.25)
                        set(findobj(gca,'type','text'),'fontsize',8,'fontweight','b')
                        set(findobj('type','surface','facecolor',[.4 .8 .4]),'facecolor',[.6 .7 .5])
                       
                        T12=[t1 t2 t3];
                       
                        if nuk == length(w)
                               
                                x=P(1);
                                y=P(2);
                                z=P(3);
                               
                                NLS1=line([x,x+1,x+2],[y,y-.25,y-.15],[z,z,z]);
                                NLS2=line([x,x+1,x+2],[y,y+.25,y+.15],[z,z,z]);
                               
                                set([NLS1,NLS2],'color','k','linewidth',3)
                                set([lx,ly,lz],'linestyle','-','linewidth',2)
                                lx=[lx,NLS1,NLS2];
                               
                        end
                       
                        rotate([lx,ly,lz,mor,T12,pp1,ppj],[0,0,1],g.a*180/pi,P');%+[max(max(get(mor,'xdata'))),max(max(get(mor,'ydata'))),max(max(get(mor,'zdata')))])
                       
                        pxx=get(ly,'xdata');
                        pyy=get(ly,'ydata');
                        pzz=get(ly,'zdata');
                       
                        rotate([lx,ly,lz,mor,T12,pp1,ppj],[pxx(2)-pxx(1),pyy(2)-pyy(1),pzz(2)-pzz(1)],g.b*180/pi,P');%+[max(max(get(mor,'xdata'))),max(max(get(mor,'ydata'))),max(max(get(mor,'zdata')))])
                       
                        pxx=get(lz,'xdata');
                        pyy=get(lz,'ydata');
                        pzz=get(lz,'zdata');
                       
                        rotate([lx,ly,lz,mor,T12,pp1,ppj],[pxx(2)-pxx(1),pyy(2)-pyy(1),pzz(2)-pzz(1)],g.g*180/pi,P');%+[max(max(get(mor,'xdata'))),max(max(get(mor,'ydata'))),max(max(get(mor,'zdata')))])
                       
                        % axis equal
                       
                end
               
        end
        dumd = uicontrol('visible','off','string','0');
        function [xx,yy,zz] = mc(DH,w,JL)
                Xn=[0;0;0;1];
                ns=1000;
                n=length(w);
                xx=zeros(1,ns);
                yy=zeros(1,ns);
                zz=zeros(1,ns);
                JR=JL(:,2)-JL(:,1);
               
                cc=0;
                for index=1:ns
                        fkDH=DH;
                        for kn=1:n
                                if w(kn)=='d'
                                        fkDH(kn,3)=JL(kn,1)+rand*JR(kn);
                                else
                                        fkDH(kn,4)=JL(kn,1)+rand*JR(kn);
                                end
                        end
                        X0=FK(fkDH,w,0,n,0)*Xn;
                       
                        cc=cc+1;
                        xx(cc)=X0(1);
                        yy(cc)=X0(2);
                        zz(cc)=X0(3);
                       
                end
        end
       
        function euler = tr2eul(m) % from downloaded robotics toolbox
               
                euler = zeros(1,3);
                euler(1) = atan2(m(2,3), m(1,3));
                sp = sin(euler(1));
                cp = cos(euler(1));
                euler(2) = atan2(cp*m(1,3) + sp*m(2,3), m(3,3));
                euler(3) = atan2(-sp * m(1,1) + cp * m(2,1), -sp*m(1,2) + cp*m(2,2));
        end
       
end









reference: original code in case someone do not have a matlab forum account.



 
Reply | Threaded
Open this post in threaded view
|

Re: uicontrol fails to callback

nrjank
On Tue, Mar 22, 2016 at 2:29 AM, Octave User <[hidden email]> wrote:
Dear Sir

I run a robotic simulation code to octave and encounter some callback issue.
I hope experts on this forum can help me to go through it.

it doesn't require any account to view, so no further need to put the code in the email. But, as you saw the issue appears not to be with roboticsc, but with issues executing uicontrol. However the error you gave regarding @setmap is odd because roboticsc does not use a function @setmap for a callback, but some of the uicontrol examples on the mathworks page do.
 
Could you please post what specific error message you get from roboticsc, if it isn't this one?  and then which examples on the uicontrol page give errors, and what those errors are? Specific error messages can often be very meaningful, and otherwise the people helping here would have to waste time trying to find the real problem.

Note that I got the @setback error running one of the mathworks examples, but that's just because I never defined a function @setback, so Octave threw an error as it should.

Nick J.

_______________________________________________
Help-octave mailing list
[hidden email]
https://lists.gnu.org/mailman/listinfo/help-octave
Reply | Threaded
Open this post in threaded view
|

Re: uicontrol fails to callback

Octave User
In reply to this post by Octave User
Thank you very much for your reply. I did paste the wrong error message.

As below, when I execute roboticsc, the error message is

error: handles to nested functions are not yet supported
error: called from
    roboticsc at line 20 column 2
error: evaluating argument list element number 4
error: called from
    roboticsc at line 20 column 2


due to

uicontrol('sty','pu','callback',@pp,'string','Go','backgroundcolor','w')

when I execute myui at matlab uicontrol example page,

the error message is

error: handles to nested functions are not yet supported
error: called from
    uicontrolTest at line 8 column 11
error: evaluating argument list element number 8
error: called from
    uicontrolTest at line 8 column 11


due to

 popup = uicontrol('Style', 'popup',...
           'String', {'parula','jet','hsv','hot','cool','gray'},...
           'Position', [20 340 100 50],...
           'Callback', @setmap);  


Due to your remind, now I am going to study the real problem, the unsupported nested function. Thank you very much. It would be appreciated if you can point out a direction on how to solve it.



Reply | Threaded
Open this post in threaded view
|

Re: uicontrol fails to callback

nrjank


On Tue, Mar 22, 2016 at 10:00 AM, Octave User <[hidden email]> wrote:

Due to your remind, now I am going to study the real problem, the
unsupported nested function. Thank you very much. It would be appreciated if
you can point out a direction on how to solve it.


you can find details of the complexities introduced by nested functions here:
https://www.gnu.org/software/octave/doc/interpreter/Nested-Functions.html

But that doesn't really do much to solving your problem, which is that while nested functions have been supported by recent versions of Octave, they still cannot support handles pointing to them  (the @function construct).  There are some complexities of handling such things, and they are the topic of an open bug report in Octave: 
http://savannah.gnu.org/bugs/?39257

There is a patch submitted to that bug, but I don't know enough to state whether it will be fixed in the next release of Octave.  In the meantime, it will likely require recoding the scripts in question to avoid the problem function calls.

nickj

_______________________________________________
Help-octave mailing list
[hidden email]
https://lists.gnu.org/mailman/listinfo/help-octave
Reply | Threaded
Open this post in threaded view
|

Re: uicontrol fails to callback

LachlanA
I wrote that patch, and am pretty sure it will NOT be in the next
release of Octave...

Handles to nested functions seem to work OK provided that they are
only used while those functions are "in scope".  The patch checks that
they handles aren't returned as function values or in global
variables.

My goal was also to allow a uicontrol, and it seems to work provided
that the GUI is closed "normally".  If an error occurs, or ^C is
pressed, then the GUI will remain but the calling function exits and
so the handles are out of scope.  This situations causes some rough
edges, and may be responsible for some segfaults that I was getting.

As such, the patch fills my current needs, but will need quite a bit
of work and lots of testing before being considered for a release.  If
you're willing to build from source, and will just be running your
script yourself rather than giving it to someone else to run, then it
may possibly also fill your needs...

Cheers,
Lachlan

On 23 March 2016 at 03:00, Nicholas Jankowski <[hidden email]> wrote:

>
>
> On Tue, Mar 22, 2016 at 10:00 AM, Octave User <[hidden email]> wrote:
>>
>>
>> Due to your remind, now I am going to study the real problem, the
>> unsupported nested function. Thank you very much. It would be appreciated
>> if
>> you can point out a direction on how to solve it.
>>
>
> you can find details of the complexities introduced by nested functions
> here:
> https://www.gnu.org/software/octave/doc/interpreter/Nested-Functions.html
>
> But that doesn't really do much to solving your problem, which is that while
> nested functions have been supported by recent versions of Octave, they
> still cannot support handles pointing to them  (the @function construct).
> There are some complexities of handling such things, and they are the topic
> of an open bug report in Octave:
> http://savannah.gnu.org/bugs/?39257
>
> There is a patch submitted to that bug, but I don't know enough to state
> whether it will be fixed in the next release of Octave.  In the meantime, it
> will likely require recoding the scripts in question to avoid the problem
> function calls.
>
> nickj

_______________________________________________
Help-octave mailing list
[hidden email]
https://lists.gnu.org/mailman/listinfo/help-octave