|Please ask about problems and questions regarding this tutorial on answers.ros.org. Don't forget to include in your question the link to this page, the versions of your OS & ROS, and also add appropriate tags.|
Moving the ArmDescription: This tutorial shows how to move the arm on Mini Maxwell using the simple_arm_server.
Tutorial Level: INTERMEDIATE
Next Tutorial: Grasping an Object
Mini Maxwell uses the simple_arm_server for controlling the arm. This server allows you to move the arm through a series of poses, as well as allowing you to open and close the gripper to various dimensions. Internally, the simple arm server:
- Takes a series gripper position in cartesian space (as a ROS action).
- For each position, computes the inverse kinematics solution to find the joint angles corresponding to the gripper position.
- Creates a smooth trajectory, and passes it to the drivers to execute.
- Returns success or failure.
Tucking the Arm
Mini Max's arm can become overheated if left extended for long periods of time. It is recommended that you tuck the arm when not in use, or any time the robot is navigating. To tuck the arm, run the script:
rosrun mini_max_apps tuck_arm.py
This script will move the arm into a configuration that consumes minimal power. It is recommended to untuck the arm before sending additional movements, to avoid jamming against the center of the frame:
rosrun mini_max_apps tuck_arm.py u
Once you have started Mini Maxwell, you will still need to bring up the arm control:
roslaunch mini_max_defs simple_arm_server.launch
Moving to a Position
To move the arm, we need to start an action client, construct a request to the simple arm server, and start the action:
1 #!/usr/bin/env python 2 3 # typical imports 4 import roslib; roslib.load_manifest('simple_arm_server') 5 import rospy, actionlib 6 7 # import TF helpers 8 import tf 9 from tf.transformations import quaternion_from_euler 10 11 # import MoveArm action messages 12 from simple_arm_server.msg import * 13 14 # start a node 15 rospy.init_node('simple_arm_server_test') 16 17 # create an action client 18 client = actionlib.SimpleActionClient('move_arm', MoveArmAction) 19 client.wait_for_server() 20 21 # create a new goal 22 goal = MoveArmGoal() 23 goal.header.frame_id = "base_link" 24 25 # a goal is comprised of a series of actions 26 action = ArmAction() 27 # this action will move the arm to a position 28 action.type = ArmAction.MOVE_ARM 29 # assign an xyz position 30 action.goal.position.x = 0.3 31 action.goal.position.y = 0.0 32 action.goal.position.z = 0.2 33 # assign an orientation, angle the gripper down 34 roll = 0.0 35 pitch = 1.0 36 yaw = 0.0 37 # ROS uses quaternions, we'll get one from our Euler angles 38 q = quaternion_from_euler(roll, pitch, yaw, 'sxyz') 39 action.goal.orientation.x = q 40 action.goal.orientation.y = q 41 action.goal.orientation.z = q 42 action.goal.orientation.w = q 43 # move from current position to new one in 3.0 seconds 44 action.move_time = rospy.Duration(3.0) 45 46 # add our action to our list of motions 47 goal.motions.append(action) 48 try: 49 client.send_goal(goal) 50 client.wait_for_result() 51 print client.get_result() 52 except rospy.ServiceException, e: 53 print "Service did not process request: %s"%str(e)