dqrobotics / python

The DQ Robotics library in Python
https://dqrobotics.github.io
GNU Lesser General Public License v3.0
24 stars 9 forks source link

[BUG] DQ_ClassicQPController.compute_setpoint_control_signal() is returning an error about QP parameter f #26

Closed marcos-pereira closed 3 years ago

marcos-pereira commented 3 years ago

Bug description

To Reproduce Code

import numpy as np
from dqrobotics import *
from dqrobotics.solvers import DQ_QuadprogSolver
from dqrobotics.robot_control import DQ_ClassicQPController
from dqrobotics.robot_control import ControlObjective
from dqrobotics.robots import KukaLw4Robot
import math

robot = KukaLw4Robot.kinematics()
qp_solver = DQ_QuadprogSolver()
controller = DQ_ClassicQPController(robot, qp_solver)
controller.set_control_objective(ControlObjective.Pose)
controller.set_gain(10.0)
controller.set_damping(0.001)
q = np.array([math.pi, math.pi, math.pi/2, 0, math.pi, math.pi/2, 0])
effector_p = 0.0*k_
effector_t = 1 + E_*0.5*effector_p
effector_phi = -math.pi
effector_n = j_
effector_r = math.cos(effector_phi/2) + effector_n*math.sin(effector_phi/2)
effector_pose = effector_t*effector_r
controller.compute_setpoint_control_signal(q,vec8(effector_pose))

Output

controller.compute_setpoint_control_signal(q,vec8(effector_pose))
  File ".../.local/lib/python3.8/site-packages/dqrobotics/solvers/__init__.py", line 15, in solve_quadratic_program
    (s1, s2) = np.shape(f)
ValueError: not enough values to unpack (expected 2, got 1)

Expected behavior

Environment:

Additional context

try: import quadprog import numpy as np class DQ_QuadprogSolver(DQ_QuadraticProgrammingSolver): def init(self): DQ_QuadraticProgrammingSolver.init(self) pass

    def solve_quadratic_program(self, H, f, A, b, Aeq, beq):
        # Ignoring Aeq and beq because quadprog doesn't handle them directly

        # Saving shape to remove the singleton dimension
        (s1, s2) = np.shape(f)
        (s3, s4) = np.shape(b)

        (x, f, xu, iterations, lagrangian, iact) = quadprog.solve_qp(G=2*H,
                                                                     a=-np.reshape(f, s1),
                                                                     C=-np.transpose(A),
                                                                     b=-np.reshape(b, s3))
        return x

except: pass

...