What exactly are you trying to do/achive?
What does "the robot" mean? *moveit* is supposed to respect the limits,
not your controller.
I don't know what interface you are using to MoveIt, but you should see if there is a state validity check you can use. Otherwise, the method you are describing doesn't have any way of utilizing the limits.
Does *planning to move* to that out-of-limits-state (not just inverse kinematics)
work as well?
Hm, I thought this should work, but it probably depends on your IK solver.
Which one are you using?
import rospy
import roslib
import actionlib
import inverse_kinematics #LIBRARY CONTAINING THE 'ik_client' CLASS
from control_msgs.msg import *
from trajectory_msgs.msg import*
from sensor_msgs.msg import JointState
from math import cos, sin, pi
#PERFORMS INVERSE KINEMATICS ON SPECIFIED CARTESIAN COORDINATES AND EULER ANGLES
def find_joint_values(i,j,k,ai,aj,ak):
#INSTANTIATE AN OBJECT, 'joint_values' WITH ATRIBUTES FROM THE 'IK_client' CLASS
joint_values = inverse_kinematics.IK_client()
#CALL AND RETURN 'get_joint_positions' FUNCTION FROM 'IK_client' CLASS
return joint_values.get_joint_positions(i,j,k,ai,aj,ak)
#CONNECTS TO DRIVER VIA THE 'follow_joint_trajectory' ACTION AND PUBLISHES JOINT VALUES TO
#'follow_joint_trajectory/goal' ACTION TOPIC.
def move_robot(goal):
try:
#INSTANTIATE A CLIENT OBJECT - SimpleActionClient IS A PYTHON CLASS IN THE ACRTIONLIB
#API. __innit__(self, topic name, message type).
client = actionlib.SimpleActionClient('follow_joint_trajectory', FollowJointTrajectoryAction) #initialize the action client
#CREATE VARIABLE 'pose' OF MESSAGE TYPE 'FollowJointTrajectoryGoal' TO STORE GOAL
#STATE WITH FIELDS FOR JOINT NAMES AND JOINT POSITIONS IN RADIANS.
pose = FollowJointTrajectoryGoal()
pose.trajectory = JointTrajectory()
#GET CURRENT STATE
startstate = rospy.wait_for_message('joint_states', JointState)
start_pose = startstate.position
#POPULATE 'pose' WITH JOINT NAMES AND GOAL POSITIONS. (INITIAL GOAL IS SET TO CURRENT
#STATE TO INSURE OPPERATION), TARGET GOAL IS COMPUTED BY 'find_joint_values' FROM THE
#CARTESIAN COORDINATES IN main().
pose.trajectory.joint_names = ['shoulder_pan_joint', 'shoulder_lift_joint', 'elbow_joint', 'wrist_1_joint', 'wrist_2_joint', 'wrist_3_joint']
#pose.trajectory.joint_names = goal.solution.joint_state.name
pose.trajectory.points = [JointTrajectoryPoint(positions= start_pose, velocities=[0]*6, time_from_start=rospy.Duration(0.0)),
JointTrajectoryPoint(positions= goal.solution.joint_state.position, velocities=[0]*6, time_from_start=rospy.Duration(20.0))]
#WAIT FOR SERVER ON DRIVER AND SEND GOAL- 'pose' WHEN AVAILABLE
client.wait_for_server()
client.send_goal(pose)
client.wait_for_result()
return client.get_result()
except KeyboardInterrupt:
client.cancel_goal()
raise
except:
raise
def main():
#ENTER THE DESIRED x,y,z - CARTESIAN COORDIANTES
x = 0.6
y = 0.6
z = 0.3
#ENTER THE DESIRED roll,pitch,yaw EULER ANGLES
roll = 0
pitch = pi/2
yaw = 0
try:
#INITIALIZE THE 'ur5_client' NODE
rospy.init_node('ur5_client')
#FIND THE JOINT VALUES FROM THE SPECIFIED CARTESIAN COORDINATES AND EULER ANGLES
joint_values = find_joint_values(x,y,z,roll,pitch,yaw)
#PUBLISH THE GOAL STATE ON THE FollowJointTrajectory ACTION
move_robot(joint_values)
except KeyboardInterrupt:
rospy.signal_shutdown("KeyboardInterrupt")
raise
print "program stopped"
if __name__ == '__main__':
main()
import rospy
from moveit_msgs.srv import GetPositionIK #MOVEIT SERVICE FOR PERFORMING INVERSE KINEMATICS
from moveit_msgs.msg import *
from math import cos, sin, pi
from tf import transformations
from geometry_msgs.msg import *
class IK_client(object):
#TAKES CARTESIAN COORDINATES AND EULER ANGLES, PERFORMS IK, AND RETURNS A SET OF JOINT
#ANGLES
def get_joint_positions(self,x,y,z,roll,pitch,yaw):
#CREATE VARIABLE 'target' OF MESSAGE TYPE 'PoseStamped()' FOR STORING THE TARGET
#CARTESIAN AND QUATERNION ANGLES
target = PoseStamped()
#POPULATE 'target' WITH THE CARTESIAN COORDINATES
target.pose.position.x = x
target.pose.position.y = y
target.pose.position.z = z
#TRANSFORM THE EURLER ANGLES TO THE REQUIRED QUATERNIONS
q = transformations.quaternion_from_euler(roll, pitch, yaw, "sxyz")
#POPULTAE 'target' WITH THE QUATERNION ANGLES
target.pose.orientation.x = q[0]
target.pose.orientation.y = q[1]
target.pose.orientation.z = q[2]
target.pose.orientation.w = q[3]
#INSTANTIATE AND OBJECT 'compute_ik' WITH ATTRIBUTES FROM THE 'ServiceProxy'
#CLASS. __innit__(self, name of service, service class). THIS IT THE
#'GetPositionIK' SERVICE
compute_ik = rospy.ServiceProxy('compute_ik', GetPositionIK)
#CREATE A VARIABLE 'posreq' WITH THE MESSAGE TYPE 'PositionIKRequest' AND
#POPULATE WITH THE NECESSARY VALUES
posreq = PositionIKRequest()
posreq.group_name = 'manipulator'
posreq.pose_stamped = target #THIS IS THE ATTRIBUTE FOR POSITION AND ORIENTATION
posreq.ik_link_name = 'ee_link'
posreq.timeout.secs = 0.005
posreq.avoid_collisions = True
#posreq.attempts = 0
#THIS CALLS THE 'GetPositionIK' SERVICE WITH 'posreq' AS ARGUMENT AND RETURNS THE
#RESPONSE
resp = compute_ik(ik_request = posreq)
return resp
(btw: Did you get universal_robot's UR5KinematicsPlugin to work?)
Most planners will utilize isStateValid() or similar methods, and those will check the limits (set in the urdf, overrided by parameters).