37 from urlparse
import urlparse
39 from urllib.parse
import urlparse
42 from hrpsys
import rtm
43 from hrpsys_ros_bridge.hrpsys_dashboard
import HrpsysDashboard
44 from python_qt_binding
import loadUi
45 from python_qt_binding.QtCore
import Qt, Signal
48 from python_qt_binding.QtGui
import (QHeaderView, QItemSelectionModel,
51 from python_qt_binding.QtWidgets
import (QHeaderView, QWidget)
52 from python_qt_binding.QtCore
import QItemSelectionModel
54 from rosgraph
import Master
55 from rospkg
import RosPack
57 from rospy.exceptions
import ROSException
61 PKG_NAME =
'hironx_ros_bridge' 68 - joint_state_publisher is dropped, since hrpsys_ros_bridge seems to set 69 `robot_description` param using COLLADA (see https://goo.gl/aLpILa) 70 instead of URDF, which joint_state_publisher is not capable of. 75 A GUi panel to list common operation commands for Hironx / NEXTAGE Open robot. 77 @param guicontext: The plugin context to create the monitor in. 78 @type guicontext: qt_gui.plugin_context.PluginContext 80 super(HironxoCommandPanel, self).
__init__()
85 rtm.nshost = rospy.get_param(
'rtmnameserver_host',
'localhost')
86 rtm.nsport = rospy.get_param(
'rtmnameserver_port',
'15005')
87 robotname = rospy.get_param(
'rtmnameserver_robotname',
'HiroNX(Robot)0')
88 rospy.loginfo(
'Connecting to RTM nameserver. host={}, port={}, robotname={} using rtmnameserver_{{host,port,robotname}} ROS param'.format(rtm.nshost, rtm.nsport, robotname))
91 self._rtm.init(robotname=robotname, url=
'')
94 ui_file = os.path.join(rospack.get_path(PKG_NAME),
'resource',
95 'hironx_commandpanel_main.ui')
96 loadUi(ui_file, self, {
'HironxoCommandPanel': HironxoCommandPanel})
101 self.pushButton_checkEncoders.clicked[bool].connect(self.
_check_encoders)
102 self.pushButton_goInitial.clicked[bool].connect(self.
_go_initial)
104 self.pushButton_goOffPose.clicked[bool].connect(self.
_go_offPose)
105 self.pushButton_startImpedance.clicked[bool].connect(self.
_impedance_on)
106 self.pushButton_stopImpedance.clicked[bool].connect(self.
_impedance_off)
107 self.pushButton_actualPose_l.clicked[bool].connect(self.
_actual_pose_l)
108 self.pushButton_actualPose_r.clicked[bool].connect(self.
_actual_pose_r)
110 self.pushButton_groups.clicked[bool].connect(self.
_show_groups)
114 Workaround for rosgraph.Master.getUri() that does NOT return 115 a domain name with ".local". 117 master = Master(
'/hironxo_command_widget')
120 masteruri_http = os.environ[
'ROS_MASTER_URI']
121 urlparsed = urlparse(masteruri_http)
125 self.textBrowser_output.append(
'***Command used***\n\t' + command_str)
131 return float(self.doubleSpinBox_duration.text())
139 @return: Returns a name of arm group that is checked on GUI. None by default. 142 if self.radioButton_impedance_left.isChecked():
144 elif self.radioButton_impedance_right.isChecked():
150 self._rtm.checkEncoders()
158 self._rtm.goInitial(init_pose_type=self._rtm.INITPOS_TYPE_FACTORY,
167 Start/stop impedance control for the specified arm group. 168 Arm group to operate impedance control is automatically obtained from 169 GUI internally within this method. 170 @raise AttributeError: When no arm group is specified. 172 @param do_on: On/off of impedance control 176 raise AttributeError(
'No arm is specified for impedance control to start.')
179 self._rtm.startImpedance(armgroup)
182 self._rtm.stopImpedance(armgroup)
192 @type list_pose: [str] 193 @param list_pose: list of str that represent angles (in radian) 196 section_line_piece =
'-' 198 self.textBrowser_output.append(text_single_line * 4)
200 text_single_line =
'' 206 text_single_line += val
207 print(
'DEBUG) #{}: text_single_line: {}'.format(i, text_single_line))
211 if (i != 0
and i % 4 == 3)
or i+1 == len(list_pose):
212 self.textBrowser_output.append(text_single_line)
213 text_single_line =
'' 215 text_single_line +=
'\t' 219 target_joint =
'LARM_JOINT5' 224 target_joint =
'LARM_JOINT5' 229 groups = self._rtm.Groups
233 str_elems =
''.join(str(
'\t' + e +
'\n')
for e
in g[1])
237 self.textBrowser_output.append(text)