00001 __author__ = 'tom1231' 00002 from PyQt4.QtGui import * 00003 from BAL.Interface.DeviceFrame import DeviceFrame, EX_DEV, SMOOTHER 00004 from lxml.etree import SubElement 00005 00006 00007 class VelocitySmoother(DeviceFrame): 00008 def __init__(self,frame, data): 00009 DeviceFrame.__init__(self, EX_DEV, frame, data) 00010 self._diffDriverTopic = 'diff/command' 00011 self._smoothTopic = 'diff/smooth_command' 00012 self._diffDriverFeedback = 'diff/command' 00013 self._diffDriverOdometryFeedback = 'diff/odometry' 00014 self._speedLimitLinear = '0.8' 00015 self._speedLimitAngular = '5.4' 00016 self._accelerationLimitLinear = '0.3' 00017 self._accelerationLimitAngular = '3.5' 00018 self._frequency = '20.0' 00019 self._deceleration = '1.0' 00020 self._robotFeedback = '2' 00021 00022 def getName(self): 00023 return 'velocity_smoother' 00024 00025 def toDict(self): 00026 data = dict() 00027 00028 data['type'] = SMOOTHER 00029 data['diffDriverTopic'] = self._diffDriverTopic 00030 data['smoothTopic'] = self._smoothTopic 00031 data['diffDriverFeedback'] = self._diffDriverFeedback 00032 data['diffDriverOdometryFeedback'] = self._diffDriverOdometryFeedback 00033 data['speedLimitLinear'] = self._speedLimitLinear 00034 data['speedLimitAngular'] = self._speedLimitAngular 00035 data['accelerationLimitLinear'] = self._accelerationLimitLinear 00036 data['accelerationLimitAngular'] = self._accelerationLimitAngular 00037 data['frequency'] = self._frequency 00038 data['deceleration'] = self._deceleration 00039 data['robotFeedback'] = self._robotFeedback 00040 00041 return data 00042 00043 def fromDict(self, data): 00044 00045 self._diffDriverTopic = data['diffDriverTopic'] 00046 self._smoothTopic = data['smoothTopic'] 00047 self._diffDriverFeedback = data['diffDriverFeedback'] 00048 self._diffDriverOdometryFeedback = data['diffDriverOdometryFeedback'] 00049 self._speedLimitLinear = data['speedLimitLinear'] 00050 self._speedLimitAngular = data['speedLimitAngular'] 00051 self._accelerationLimitLinear = data['accelerationLimitLinear'] 00052 self._accelerationLimitAngular = data['accelerationLimitAngular'] 00053 self._frequency = data['frequency'] 00054 self._deceleration = data['deceleration'] 00055 self._robotFeedback = data['robotFeedback'] 00056 00057 def add(self): 00058 if not self.nameIsValid(): 00059 error = QErrorMessage() 00060 error.setWindowTitle("Same name error") 00061 error.showMessage("Name already taken.") 00062 error.exec_() 00063 self._isValid = False 00064 return 00065 00066 self._diffDriverTopic = str(self.diffDriverTopic.text()) 00067 self._smoothTopic = str(self.smoothTopic.text()) 00068 self._diffDriverFeedback = str(self.diffDriverFeedback.text()) 00069 self._diffDriverOdometryFeedback = str(self.diffDriverOdometryFeedback.text()) 00070 self._speedLimitLinear = str(self.speedLimitLinear.text()) 00071 self._speedLimitAngular = str(self.speedLimitAngular.text()) 00072 self._accelerationLimitLinear = str(self.accelerationLimitLinear.text()) 00073 self._accelerationLimitAngular = str(self.accelerationLimitAngular.text()) 00074 self._frequency = str(self.frequency.text()) 00075 self._deceleration = str(self.deceleration.text()) 00076 self._robotFeedback = str(self.robotFeedback.itemData(self.robotFeedback.currentIndex()).toString()) 00077 self._isValid = True 00078 00079 def showDetails(self, items=None): 00080 00081 self.diffDriverTopic = QLineEdit(self._diffDriverTopic) 00082 self.smoothTopic = QLineEdit(self._smoothTopic) 00083 self.diffDriverFeedback = QLineEdit(self._diffDriverFeedback) 00084 self.diffDriverOdometryFeedback = QLineEdit(self._diffDriverOdometryFeedback) 00085 self.speedLimitLinear = QLineEdit(self._speedLimitLinear) 00086 self.speedLimitAngular = QLineEdit(self._speedLimitAngular) 00087 self.accelerationLimitLinear = QLineEdit(self._accelerationLimitLinear) 00088 self.accelerationLimitAngular = QLineEdit(self._accelerationLimitAngular) 00089 self.frequency = QLineEdit(self._frequency) 00090 self.deceleration = QLineEdit(self._deceleration) 00091 self.robotFeedback = QComboBox() 00092 00093 self.robotFeedback.addItem('None', '0') 00094 self.robotFeedback.addItem('Odometry', '1') 00095 self.robotFeedback.addItem('End robot commands', '2') 00096 self.robotFeedback.setCurrentIndex(int(self._robotFeedback)) 00097 00098 self._frame.layout().addRow(QLabel('Differential drive topic: '), self.diffDriverTopic) 00099 self._frame.layout().addRow(QLabel('Differential drive smooth topic: '), self.smoothTopic) 00100 self._frame.layout().addRow(QLabel('Differential drive end robot topic: '), self.diffDriverFeedback) 00101 self._frame.layout().addRow(QLabel('Differential odometry topic: '), self.diffDriverOdometryFeedback) 00102 self._frame.layout().addRow(QLabel('Differential speed limit linear: '), self.speedLimitLinear) 00103 self._frame.layout().addRow(QLabel('Differential speed limit angular: '), self.speedLimitAngular) 00104 self._frame.layout().addRow(QLabel('Differential acceleration limit linear: '), self.accelerationLimitLinear) 00105 self._frame.layout().addRow(QLabel('Differential acceleration limit angular: '), self.accelerationLimitAngular) 00106 self._frame.layout().addRow(QLabel('Frequency rate: '), self.frequency) 00107 self._frame.layout().addRow(QLabel('Deceleration rate: '), self.deceleration) 00108 self._frame.layout().addRow(QLabel('Feedback mode: '), self.robotFeedback) 00109 00110 def printDetails(self): 00111 self._frame.layout().addRow(QLabel('Differential drive topic: '), QLabel(self._diffDriverTopic)) 00112 self._frame.layout().addRow(QLabel('Differential drive smooth topic: '), QLabel(self._smoothTopic)) 00113 self._frame.layout().addRow(QLabel('Differential drive end robot topic: '), QLabel(self._diffDriverFeedback)) 00114 self._frame.layout().addRow(QLabel('Differential odometry topic: '), QLabel(self._diffDriverOdometryFeedback)) 00115 self._frame.layout().addRow(QLabel('Differential speed limit linear: '), QLabel(self._speedLimitLinear)) 00116 self._frame.layout().addRow(QLabel('Differential speed limit angular: '), QLabel(self._speedLimitAngular)) 00117 self._frame.layout().addRow(QLabel('Differential acceleration limit linear: '), QLabel(self._accelerationLimitLinear)) 00118 self._frame.layout().addRow(QLabel('Differential acceleration limit angular: '), QLabel(self._accelerationLimitAngular)) 00119 self._frame.layout().addRow(QLabel('Frequency rate: '), QLabel(self._frequency)) 00120 self._frame.layout().addRow(QLabel('Deceleration rate: '), QLabel(self._deceleration)) 00121 00122 robotFeedbackText = 'End robot commands' 00123 00124 if self._robotFeedback == '1': 00125 robotFeedbackText = 'Odometry' 00126 elif self._robotFeedback == '0': 00127 robotFeedbackText = 'None' 00128 00129 self._frame.layout().addRow(QLabel('Feedback mode: '), QLabel(robotFeedbackText)) 00130 00131 def saveToFile(self, parent): 00132 element = SubElement(parent, 'include', { 00133 'file': '$(find ric_board)/scripts/velocity_smoother.launch' 00134 }) 00135 00136 SubElement(element, 'arg', { 00137 'name': 'raw_cmd_vel_topic', 00138 'value': self._smoothTopic 00139 }) 00140 SubElement(element, 'arg', { 00141 'name': 'smooth_cmd_vel_topic', 00142 'value': self._diffDriverTopic 00143 }) 00144 SubElement(element, 'arg', { 00145 'name': 'robot_cmd_vel_topic', 00146 'value': self._diffDriverFeedback 00147 }) 00148 SubElement(element, 'arg', { 00149 'name': 'odom_topic', 00150 'value': self._diffDriverOdometryFeedback 00151 }) 00152 SubElement(element, 'arg', { 00153 'name': 'SPEED_LIM_V', 00154 'value': self._speedLimitLinear 00155 }) 00156 SubElement(element, 'arg', { 00157 'name': 'SPEED_LIM_W', 00158 'value': self._speedLimitAngular 00159 }) 00160 SubElement(element, 'arg', { 00161 'name': 'ACCEL_LIM_V', 00162 'value': self._accelerationLimitLinear 00163 }) 00164 SubElement(element, 'arg', { 00165 'name': 'ACCEL_LIM_W', 00166 'value': self._accelerationLimitAngular 00167 }) 00168 SubElement(element, 'arg', { 00169 'name': 'FREQUENCY', 00170 'value': self._frequency 00171 }) 00172 SubElement(element, 'arg', { 00173 'name': 'DECEL_FACTOR', 00174 'value': self._deceleration 00175 }) 00176 SubElement(element, 'arg', { 00177 'name': 'ROBOT_FEEDBACK', 00178 'value': self._robotFeedback 00179 })