position.py

来自「机器人人3D仿真工具,可以加入到Simbad仿真环境下应用。」· Python 代码 · 共 195 行

PY
195
字号
# Desc: position interface handler# Author: Andrew Howard# Date: 19 Sep 2004# CVS: $Id: position.py,v 1.7 2006/07/07 17:57:37 natepak Exp $import sysimport mathimport timefrom wxPython.wx import *from wxgazebo.panel import gzPanelfrom gazebo import *# Convert radians to degreesdef rtod(a):    return a / math.pi * 180# IDsID_STOP = 0x100class gzPosition(gzPanel):    """Mediate position interface."""    def __init__(self, parent, client, gzid):        gzPanel.__init__(self, parent, 'position [%s]' % gzid, (0, 0))        # Open interface        self.iface = gz_position()        if self.iface.open(client, gzid) != 0:            raise gz_error_str()                self.updateTime = 0.0        # TESTING        self.iface.data.cmd_enable_motors = 1        # Position/rotation feedback        self.poseText = wxStaticText(self, -1, '%040.0f' % 0)        self.velText = wxStaticText(self, -1, '%040.0f' % 0)        self.cmdText = wxStaticText(self, -1, '%040.0f' % 0)        # Scale buttons        self.posScaleButton = wxToggleButton(self, -1, 'linear x10')        self.rotScaleButton = wxToggleButton(self, -1, 'angular x2')        # Stop button        self.stopButton = wxButton(self, ID_STOP, 'Stop')        EVT_BUTTON(self, ID_STOP, self.OnStop)        # Scale factors for sliders        self.posScale = lambda : +2.0 / 1000 * (1 + 9 * self.posScaleButton.GetValue())        self.rotScale = lambda : +math.pi / 2 / 1000 * (1 + 1 * self.rotScaleButton.GetValue())        self.velPosF = lambda x : x * self.posScale()        self.velPosFi = lambda x : int(x  / self.posScale())        self.velRotF = lambda x : x * self.rotScale()        self.velRotFi = lambda x : int(x / self.rotScale())        # Linear speed sliders        self.velPosSliders = (wxSlider(self, -1,                                       self.velPosFi(self.iface.data.cmd_vel_pos[0]),                                       -1000, 1000, wxDefaultPosition, (200, -1)),                              wxSlider(self, -1,                                       self.velPosFi(self.iface.data.cmd_vel_pos[1]),                                       -1000, 1000, wxDefaultPosition, (200, -1)),                              wxSlider(self, -1,                                       self.velPosFi(self.iface.data.cmd_vel_pos[2]),                                       -1000, 1000, wxDefaultPosition, (200, -1))                              )                # Yaw speed slider        self.velRotSliders = (wxSlider(self, -1,                                       self.velRotFi(self.iface.data.cmd_vel_rot[0]),                                       -1000, 1000, wxDefaultPosition, (200, -1)),                              wxSlider(self, -1,                                       self.velRotFi(self.iface.data.cmd_vel_rot[1]),                                       -1000, 1000, wxDefaultPosition, (200, -1)),                              wxSlider(self, -1,                                       self.velRotFi(self.iface.data.cmd_vel_rot[2]),                                       -1000, 1000, wxDefaultPosition, (200, -1)))        # Layout stuff in window        sizer = wxFlexGridSizer(4, 2, 2, 4)        sizer.Add(wxStaticText(self, -1, 'pose'))        sizer.Add(self.poseText)        sizer.Add(wxStaticText(self, -1, 'vel'))        sizer.Add(self.velText)                sizer.Add(wxStaticText(self, -1, 'cmd vel'))        sizer.Add(self.cmdText)                sizer.Add(wxStaticText(self, -1, 'cmd lin vel x'))        sizer.Add(self.velPosSliders[0], 0, wxEXPAND)                sizer.Add(wxStaticText(self, -1, 'cmd lin vel y'))        sizer.Add(self.velPosSliders[1], 0, wxEXPAND)                sizer.Add(wxStaticText(self, -1, 'cmd lin vel z'))        sizer.Add(self.velPosSliders[2], 0, wxEXPAND)        sizer.Add(wxStaticText(self, -1, 'cmd ang vel x'))        sizer.Add(self.velRotSliders[0], 0, wxEXPAND)        sizer.Add(wxStaticText(self, -1, 'cmd ang vel y'))        sizer.Add(self.velRotSliders[1], 0, wxEXPAND)        sizer.Add(wxStaticText(self, -1, 'cmd ang vel z'))        sizer.Add(self.velRotSliders[2], 0, wxEXPAND)        nsizer = wxBoxSizer(wxHORIZONTAL)        nsizer.Add(self.posScaleButton, 1, wxEXPAND)        nsizer.Add(self.rotScaleButton, 1, wxEXPAND)        sizer.Add((0, 0))        sizer.Add((nsizer), 1, wxEXPAND)        sizer.Add((0, 0))        sizer.Add((self.stopButton), 0, wxEXPAND)        # All done; set frame size        self.SetSizer(sizer)                self.SetAutoLayout(True)        self.Fit()        sizer.SetSizeHints(self)        # We're ready, so show ourselves        self.Show(True)        return    def __del__(self):        # Close the interface        self.iface.close()        return    def OnUpdate(self):        """Process periodic updates."""        self.iface.lock(1)        data = self.iface.data        # See if we have new data        if data.time != self.updateTime:            self.updateTime = data.time            pos = '%.3f %.3f %.3f' % (data.pos[0], data.pos[1], data.pos[2])            rot = '%.1f %.1f %.1f' % \                  (rtod(data.rot[0]), rtod(data.rot[1]), rtod(data.rot[2]))            self.poseText.SetLabel('%s : %s' % (pos, rot))            pos = '%.3f %.3f %.3f' % (data.vel_pos[0], data.vel_pos[1], data.vel_pos[2])            rot = '%.1f %.1f %.1f' % \                  (rtod(data.vel_rot[0]), rtod(data.vel_rot[1]), rtod(data.vel_rot[2]))            self.velText.SetLabel('%s : %s' % (pos, rot))        # Update velocity commands        data.cmd_vel_pos = (self.velPosF(self.velPosSliders[0].GetValue()),                            self.velPosF(self.velPosSliders[1].GetValue()),                            self.velPosF(self.velPosSliders[2].GetValue()))        data.cmd_vel_rot = (self.velRotF(self.velRotSliders[0].GetValue()),                            self.velRotF(self.velRotSliders[1].GetValue()),                            self.velRotF(self.velRotSliders[2].GetValue()))        # Update displayed velocity commands        pos = '%.3f %.3f %.3f' % (data.cmd_vel_pos[0], data.cmd_vel_pos[1], data.cmd_vel_pos[2])        rot = '%.1f %.1f %.1f' % \              (rtod(data.cmd_vel_rot[0]), rtod(data.cmd_vel_rot[1]), rtod(data.cmd_vel_rot[2]))        self.cmdText.SetLabel('%s : %s' % (pos, rot))        self.iface.unlock()        return    def OnStop(self, event):        for slider in self.velPosSliders:            slider.SetValue(self.velPosFi(0.0))        for slider in self.velRotSliders:            slider.SetValue(self.velRotFi(0.0))                    return    

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?