Skip to main content

๐Ÿค– Manipulation Basics

Robotic manipulation is the art and engineering of controlling an arm and gripper to interact with the physical world.
In your project, manipulation allows your robot to pick up, transport, and drop objects with the MyCobot armโ€”enabling true autonomy.


๐Ÿฆพ Manipulation Fundamentalsโ€‹

Manipulation combines three key components:

  • Perception: Detect object pose using sensors/cameras
  • Planning: Calculate motions for reaching, grasping, and moving
  • Control: Send joint or Cartesian commands to the arm and gripper

Key Conceptsโ€‹

ConceptDescriptionExample
Forward KinematicsJoint angles โ†’ end-effector pose"If joints are [30ยฐ, 45ยฐ, 60ยฐ], where is the gripper?"
Inverse KinematicsEnd-effector pose โ†’ joint angles"To reach (x, y, z), what joint angles needed?"
WorkspaceVolume the arm can reachSpherical region around robot base
SingularitiesArm configurations to avoidFully extended or folded positions

๐Ÿฆฟ Arm Control Strategiesโ€‹

In your LIMO + MyCobot project, control happens at several levels:

Move each joint to a target angle

# Example joint control
joint_angles = [0.0, -90.0, 45.0, 0.0, 45.0, 0.0] # degrees
mycobot.send_angles(joint_angles, speed=50)

Pros:

  • โœ… Direct hardware control
  • โœ… Fast execution
  • โœ… Predictable motion

Cons:

  • โŒ Requires manual calculation
  • โŒ Hard to visualize end result
Pro Tip

Use WiFi connection for MyCobot for seamless controlโ€”your launch system auto-detects IP address for wireless operation.


โœ‹ Gripper Operationsโ€‹

The gripper is the "hand" of your robot, essential for object interaction:

Basic Gripper Commandsโ€‹

# Open gripper (prepare for pickup)
mycobot.set_gripper_state(0, speed=70)

# Close gripper (grasp object)
mycobot.set_gripper_state(1, speed=70)

# Partial grip (delicate objects)
mycobot.set_gripper_value(500, speed=70) # 0-1000 range

Gripper Control Strategiesโ€‹

StrategyUse CaseExample
Force ControlFragile objectsEggs, glass, electronics
Position ControlStandard objectsBoxes, tools, bottles
Adaptive GripUnknown objectsVariable size/shape items

Gripper Feedbackโ€‹

# Check if gripper is holding something
def is_gripping():
current_value = mycobot.get_gripper_value()
return current_value > 100 # Threshold for "holding"

# Verify successful grasp
def verify_grasp():
if is_gripping():
print("โœ… Object grasped successfully")
return True
else:
print("โŒ Grasp failed - object not detected")
return False

๐Ÿš€ Pick and Place Workflowโ€‹

Full Pick and Place Operationโ€‹

  1. Navigate to object (using waypoint navigation or real-time detection)
  2. Object detection determines precise 3D pose of target
  3. Move arm to pre-grasp pose (safe position above target)
  4. Open gripper (prepare for pickup)
  5. Move down to grasp pose (precise positioning)
  6. Close gripper (secure object)
  7. Lift object (move to safe transport pose)
  8. Navigate to drop location (mobile base movement)
  9. Move arm to drop pose (position over target)
  10. Open gripper (release object)
  11. Return arm to home position (safe storage pose)

๐Ÿ”Œ Integration with System Componentsโ€‹

How Manipulation Fits Inโ€‹

Node Communicationโ€‹

NodePublishesSubscribesServices
Pick Node/arm/status/detected_objects/pick_object
Drop Node/drop/status/target_location/drop_object
Mission Manager/mission/status/arm/status, /nav/status/start_mission

๐Ÿ› ๏ธ Configuration and Calibrationโ€‹

Arm Workspace Definitionโ€‹

# MyCobot 280 workspace limits
WORKSPACE_LIMITS = {
'x_min': -280, 'x_max': 280, # mm
'y_min': -280, 'y_max': 280, # mm
'z_min': -131, 'z_max': 412, # mm
'reach_radius': 280 # mm
}

def is_pose_reachable(target_pose):
distance = math.sqrt(target_pose.x**2 + target_pose.y**2)
return (WORKSPACE_LIMITS['x_min'] <= target_pose.x <= WORKSPACE_LIMITS['x_max'] and
WORKSPACE_LIMITS['y_min'] <= target_pose.y <= WORKSPACE_LIMITS['y_max'] and
WORKSPACE_LIMITS['z_min'] <= target_pose.z <= WORKSPACE_LIMITS['z_max'] and
distance <= WORKSPACE_LIMITS['reach_radius'])

Safety Parametersโ€‹

# manipulation_config.yaml
manipulation:
safety:
max_speed: 50 # 0-100 scale
approach_speed: 20 # Slower for precision
emergency_stop: true # Enable e-stop

timeouts:
move_timeout: 10.0 # seconds
grasp_timeout: 3.0 # seconds

retry_policy:
max_attempts: 3
retry_delay: 1.0 # seconds

๐Ÿ’ก Best Practices & Troubleshootingโ€‹

Safety Guidelinesโ€‹

Safety First!
  • Always move to pre-grasp poses before attempting pickup
  • Use timeouts and feedback to handle failures
  • Test sequences in simulation or with arm "in the air" first
  • Ensure arm is at home position before/after sessions

Common Issues & Solutionsโ€‹

๐Ÿ”ง Arm Won't Move

Possible causes:

  • Power/connection issues
  • Joint limits exceeded
  • Emergency stop activated

Solutions:

# Check connection
if mycobot.is_controller_connected():
print("โœ… Controller connected")
else:
print("โŒ Connection failed")

# Reset arm position
mycobot.send_angles([0, 0, 0, 0, 0, 0], speed=30)

# Clear any error states
mycobot.release_all_servos()
time.sleep(1)
mycobot.power_on()
๐Ÿค Grasp Failures

Common causes:

  • Object too small/large for gripper
  • Incorrect approach angle
  • Object slipping during pickup

Improvements:

# Adaptive grasp strategy
def adaptive_grasp(object_size):
if object_size < 20: # Small objects
gripper_value = 200
approach_speed = 10
elif object_size > 50: # Large objects
gripper_value = 800
approach_speed = 30
else: # Medium objects
gripper_value = 500
approach_speed = 20

mycobot.set_gripper_value(gripper_value, speed=70)
โšก Performance Optimization

Speed up operations:

  • Pre-plan common poses for faster execution
  • Use joint space for non-critical movements
  • Optimize gripper timing based on object type
  • Parallel processing where safe (navigation + arm planning)
# Pre-defined poses for efficiency
COMMON_POSES = {
'home': [0, 0, 0, 0, 0, 0],
'ready': [0, -45, 45, 0, 0, 0],
'scan': [0, -30, 30, 0, -60, 0]
}

def quick_move_to_pose(pose_name):
if pose_name in COMMON_POSES:
mycobot.send_angles(COMMON_POSES[pose_name], speed=50)
else:
print(f"Unknown pose: {pose_name}")

๐ŸŽฏ Advanced Manipulation Featuresโ€‹

Vision-Guided Graspingโ€‹

def vision_guided_pick(self, object_class):
# Get object pose from camera
detection = self.object_detector.detect(object_class)

if detection:
# Convert camera coordinates to arm coordinates
arm_pose = self.transform_pose(detection.pose)

# Adjust for object orientation
grasp_angle = self.calculate_grasp_angle(detection.orientation)
arm_pose.rotation = grasp_angle

return self.pick_object(arm_pose)
return False

Collaborative Operationโ€‹

class CollaborativeManipulation:
def __init__(self):
self.human_detector = HumanDetector()
self.safety_zone = SafetyZone(radius=0.5) # 50cm safety buffer

def safe_manipulation(self, target_pose):
if self.human_detector.human_in_workspace():
self.pause_and_wait()
else:
self.execute_manipulation(target_pose)

๐Ÿ“š Learn Moreโ€‹


๐ŸŽฏ Next Stepsโ€‹

Ready for Integration?

Now that you understand manipulation basics: