Merge lp:~shadowrobot/sr-visualization/Feature_Edit_only_mode_in_ctrlr_tuner into lp:sr-visualization/fuerte

Proposed by Toni Oliver
Status: Merged
Merged at revision: 47
Proposed branch: lp:~shadowrobot/sr-visualization/Feature_Edit_only_mode_in_ctrlr_tuner
Merge into: lp:sr-visualization/fuerte
Diff against target: 197 lines (+96/-36)
2 files modified
sr_gui_controller_tuner/src/sr_gui_controller_tuner/controller_tuner.py (+52/-18)
sr_gui_controller_tuner/src/sr_gui_controller_tuner/sr_controller_tuner.py (+44/-18)
To merge this branch: bzr merge lp:~shadowrobot/sr-visualization/Feature_Edit_only_mode_in_ctrlr_tuner
Reviewer Review Type Date Requested Status
Ugo Approve
Review via email: mp+132589@code.launchpad.net

Description of the change

The controller tuner plugin allows offline edit-only mode for a more user-friendly and format-safe parameter edition. Added better filters when the user chooses the files to load, now taking into account the control mode to avoid mistakes.

To post a comment you must log in.
Revision history for this message
markpitchless (markpitchless) wrote :
Revision history for this message
Ugo (ugocupcic) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'sr_gui_controller_tuner/src/sr_gui_controller_tuner/controller_tuner.py'
2--- sr_gui_controller_tuner/src/sr_gui_controller_tuner/controller_tuner.py 2012-08-09 09:39:13 +0000
3+++ sr_gui_controller_tuner/src/sr_gui_controller_tuner/controller_tuner.py 2012-11-01 16:30:28 +0000
4@@ -235,7 +235,18 @@
5 def on_changed_controller_type_(self, index = None):
6 if index == None:
7 return
8+ self.reset_file_path()
9 self.refresh_controller_tree_( self.controllers_in_dropdown[index] )
10+
11+ def reset_file_path(self):
12+ self._widget.txt_file_path.setText("")
13+
14+ self._widget.btn_load.setEnabled(False)
15+
16+ #disable the save buttons (until a new file has
17+ # been chosen by the user)
18+ self._widget.btn_save_all.setEnabled(False)
19+ self._widget.btn_save_selected.setEnabled(False)
20
21 def on_btn_select_file_path_clicked_(self):
22 path_to_config = "~"
23@@ -245,7 +256,17 @@
24 rospy.logwarn("couldnt find the sr_ethercat_hand_config package, do you have the sr_config stack installed?")
25
26 subpath = "/controls/host"
27- filter_files = "*.yaml"
28+ if self.sr_controller_tuner_app_.edit_only_mode:
29+ filter_files = "*.yaml"
30+ else:
31+ if self.controller_type == "Motor Force":
32+ filter_files = "*controllers.yaml"
33+ else:
34+ if self.sr_controller_tuner_app_.control_mode == "PWM":
35+ filter_files = "*s_PWM.yaml"
36+ else:
37+ filter_files = "*s.yaml"
38+
39 if self.controller_type == "Motor Force":
40 filter_files = "Config (*motor"+filter_files+")"
41 subpath = "/controls/motors"
42@@ -316,6 +337,7 @@
43
44 def on_btn_refresh_ctrl_clicked_(self):
45 ctrls = self.sr_controller_tuner_app_.get_ctrls()
46+ self.sr_controller_tuner_app_.refresh_control_mode()
47 self.controllers_in_dropdown = []
48 self._widget.dropdown_ctrl.clear()
49 for ctrl in ctrls:
50@@ -374,6 +396,16 @@
51 Get the controller settings and their ranges and display them in
52 the tree.
53 """
54+ #buttons "set all" "set selected" and "stop movements" are disabled in edit_only_mode
55+ if self.sr_controller_tuner_app_.edit_only_mode:
56+ self._widget.btn_set_selected.setEnabled(False)
57+ self._widget.btn_set_all.setEnabled(False)
58+ self._widget.btn_stop_mvts.setEnabled(False)
59+ else:
60+ self._widget.btn_set_selected.setEnabled(True)
61+ self._widget.btn_set_all.setEnabled(True)
62+ self._widget.btn_stop_mvts.setEnabled(True)
63+
64 self.controller_type = controller_type
65 ctrl_settings = self.sr_controller_tuner_app_.get_controller_settings( controller_type )
66
67@@ -401,23 +433,25 @@
68 #the parameters have been found
69 self.ctrl_widgets[ motor_name ] = {}
70
71- #add buttons for the automatic procedures (plot / move / ...)
72- frame_buttons = QFrame()
73- layout_buttons = QHBoxLayout()
74- btn_plot = QPushButton("Plot")
75- self.ctrl_widgets[ motor_name ]["btn_plot"] = btn_plot
76- self.ctrl_widgets[ motor_name ]["btn_plot"].clicked.connect(partial(self.on_btn_plot_pressed_, motor_name, self.ctrl_widgets[ motor_name ]["btn_plot"]))
77- layout_buttons.addWidget(btn_plot)
78-
79- if self.controller_type in ["Position", "Mixed Position/Velocity"]:
80- #only adding Move button for position controllers
81- btn_move = QPushButton("Move")
82- self.ctrl_widgets[ motor_name ]["btn_move"] = btn_move
83- self.ctrl_widgets[ motor_name ]["btn_move"].clicked.connect(partial(self.on_btn_move_pressed_,motor_name, self.ctrl_widgets[ motor_name ]["btn_move"]))
84- layout_buttons.addWidget(btn_move)
85- frame_buttons.setLayout(layout_buttons)
86-
87- self._widget.tree_ctrl_settings.setItemWidget( motor_item, 0, frame_buttons )
88+ #buttons for plot/move are not added in edit_only_mode
89+ if not self.sr_controller_tuner_app_.edit_only_mode:
90+ #add buttons for the automatic procedures (plot / move / ...)
91+ frame_buttons = QFrame()
92+ layout_buttons = QHBoxLayout()
93+ btn_plot = QPushButton("Plot")
94+ self.ctrl_widgets[ motor_name ]["btn_plot"] = btn_plot
95+ self.ctrl_widgets[ motor_name ]["btn_plot"].clicked.connect(partial(self.on_btn_plot_pressed_, motor_name, self.ctrl_widgets[ motor_name ]["btn_plot"]))
96+ layout_buttons.addWidget(btn_plot)
97+
98+ if self.controller_type in ["Position", "Mixed Position/Velocity"]:
99+ #only adding Move button for position controllers
100+ btn_move = QPushButton("Move")
101+ self.ctrl_widgets[ motor_name ]["btn_move"] = btn_move
102+ self.ctrl_widgets[ motor_name ]["btn_move"].clicked.connect(partial(self.on_btn_move_pressed_,motor_name, self.ctrl_widgets[ motor_name ]["btn_move"]))
103+ layout_buttons.addWidget(btn_move)
104+ frame_buttons.setLayout(layout_buttons)
105+
106+ self._widget.tree_ctrl_settings.setItemWidget( motor_item, 0, frame_buttons )
107
108 for index_item,item in enumerate(ctrl_settings.headers):
109 if item["type"] == "Bool":
110
111=== modified file 'sr_gui_controller_tuner/src/sr_gui_controller_tuner/sr_controller_tuner.py'
112--- sr_gui_controller_tuner/src/sr_gui_controller_tuner/sr_controller_tuner.py 2012-08-09 09:39:13 +0000
113+++ sr_gui_controller_tuner/src/sr_gui_controller_tuner/sr_controller_tuner.py 2012-11-01 16:30:28 +0000
114@@ -86,7 +86,8 @@
115 class SrControllerTunerApp(object):
116 """
117 """
118-
119+ CONTROLLER_MANAGER_DETECTION_TIMEOUT = 3.0
120+
121 def __init__(self, xml_path):
122 """
123 """
124@@ -94,31 +95,56 @@
125 self.all_controller_types = ["Motor Force", "Position", "Velocity",
126 "Mixed Position/Velocity", "Effort"]
127 self.pid_loader = PidLoader()
128+
129+ self.edit_only_mode = False
130+ self.control_mode = "FORCE"
131+
132
133 def get_ctrls(self):
134 #return ["Motor Force", "Position"]
135 #
136 running_ctrls = []
137
138- rospy.wait_for_service('/pr2_controller_manager/list_controllers')
139- controllers = rospy.ServiceProxy('/pr2_controller_manager/list_controllers', ListControllers)
140- resp = None
141 try:
142- resp = controllers()
143- except rospy.ServiceException, e:
144- rospy.logerr( "Service did not process request: %s"%str(e) )
145-
146- running_ctrls.append("Motor Force")
147- if resp != None:
148- for state,controller in zip(resp.state, resp.controllers):
149- if state == "running":
150- split = controller.split("_")
151- ctrl_type_tmp = split[2]
152- for defined_ctrl_type in self.all_controller_types:
153- if ctrl_type_tmp.lower() in defined_ctrl_type.lower():
154- running_ctrls.append(defined_ctrl_type)
155- return running_ctrls
156+ rospy.wait_for_service('/pr2_controller_manager/list_controllers', self.CONTROLLER_MANAGER_DETECTION_TIMEOUT)
157+
158+ controllers = rospy.ServiceProxy('/pr2_controller_manager/list_controllers', ListControllers)
159+ resp = None
160+ try:
161+ resp = controllers()
162+ except rospy.ServiceException, e:
163+ rospy.logerr( "Service did not process request: %s"%str(e) )
164+
165+ running_ctrls.append("Motor Force")
166+ if resp != None:
167+ for state,controller in zip(resp.state, resp.controllers):
168+ if state == "running":
169+ split = controller.split("_")
170+ ctrl_type_tmp = split[2]
171+ for defined_ctrl_type in self.all_controller_types:
172+ if ctrl_type_tmp.lower() in defined_ctrl_type.lower():
173+ running_ctrls.append(defined_ctrl_type)
174+ self.edit_only_mode = False
175+ return running_ctrls
176+ rospy.loginfo( "No controllers currently running" )
177+ rospy.loginfo( "Running controller tuner in edit-only mode" )
178+ self.edit_only_mode = True
179+ del running_ctrls[:]
180+ #In edit_only_mode all the controllers are available for edition
181+ for defined_ctrl_type in self.all_controller_types:
182+ running_ctrls.append(defined_ctrl_type)
183+ except rospy.ROSException, e:
184+ rospy.loginfo( "Controller manager not running: %s"%str(e) )
185+ rospy.loginfo( "Running controller tuner in edit-only mode" )
186+ self.edit_only_mode = True
187+ #In edit_only_mode all the controllers are available for edition
188+ for defined_ctrl_type in self.all_controller_types:
189+ running_ctrls.append(defined_ctrl_type)
190+
191 return running_ctrls
192+
193+ def refresh_control_mode(self):
194+ self.control_mode = rospy.get_param('/realtime_loop/default_control_mode', 'FORCE')
195
196 def get_controller_settings( self, controller_type ):
197 """

Subscribers

People subscribed via source and target branches

to all changes: