IB_Robot General Control
When to Use
Use this skill when the user wants to interact with, control, or get the status of the IB_Robot (SO-101 robotic arm).
- "Move the arm to a safe position"
- "Open the gripper"
- "What do the cameras see?"
- "Run the AI inference task"
System Architecture & Data Formats
1. Joint States & Control (/joint_states and Controller Commands)
- The SO-101 arm has 6 joints:
arm(5 joints): Base, Shoulder, Elbow, Wrist Pitch, Wrist Roll.gripper(1 joint): Jaw.
- IMPORTANT UNIT CONVENTION:
- All joint positions are in RADIANS (for the arm) or normalized absolute values
0.0 to 1.0(for the gripper). - Do NOT send degrees. If the user asks for "90 degrees", you MUST convert it to
1.5708radians before publishing.
- All joint positions are in RADIANS (for the arm) or normalized absolute values
- Topics:
- To read current position:
ros2_subscribe_onceon/joint_states(Type:sensor_msgs/msg/JointState). - To send arm commands:
ros2_publishto/arm_position_controller/commands(Type:std_msgs/msg/Float64MultiArray, requires array of 5 floats in radians). - To send gripper commands:
ros2_publishto/gripper_position_controller/commands(Type:std_msgs/msg/Float64MultiArray, requires array of 1 float,0.0is closed,1.0is open).
- To read current position:
2. Vision / Cameras
- The robot has three cameras:
- Top:
/camera/top/image_raw - Wrist:
/camera/wrist/image_raw - Front:
/camera/front/image_raw(or/world/demo/.../imagein simulation)
- Top:
- To take a picture and analyze it, use the tool
ros2_camera_snapshotand specify the topic.
3. AI Inference (End-to-End Control)
- To execute a complex task (like "pick up the cup"), the robot relies on a VLA (Vision-Language-Action) model via an Action Server.
- Use
ros2_action_goalon the action/act_inference_node/DispatchInfer(Type:ibrobot_msgs/action/DispatchInfer).- Set
promptto the user's natural language instruction (e.g., "pick up the red block"). - Set
max_stepsif requested (default is usually 0 for continuous).
- Set
Examples
Example 1: Move arm to home position (straight up)
Tool: ros2_publish
Topic: /arm_position_controller/commands
Type: std_msgs/msg/Float64MultiArray
Payload: {"data": [0.0, 0.0, 0.0, 0.0, 0.0]}
Example 2: Open the gripper
Tool: ros2_publish
Topic: /gripper_position_controller/commands
Type: std_msgs/msg/Float64MultiArray
Payload: {"data": [1.0]}
Example 3: Ask the robot to perform an AI task
Tool: ros2_action_goal
Action: /act_inference_node/DispatchInfer
Type: ibrobot_msgs/action/DispatchInfer
Payload: {"prompt": "grab the pan handle"}
Tips
- Always check the current
/joint_statesbefore moving to avoid sudden jumps. - If the user asks for angles, reply stating that you are converting their requested degrees into radians for the robot's hardware interface.