Current section
Files
Jump to
Current section
Files
lib/bb/ufactory/robots/x_arm6.ex
# SPDX-FileCopyrightText: 2026 Holden Oullette
#
# SPDX-License-Identifier: Apache-2.0
defmodule BB.Ufactory.Robots.XArm6 do
@moduledoc """
BB robot definition for the UFactory xArm6.
6-DOF serial manipulator with revolute joints J1–J6. All joints rotate about
their local Z axis. Joint limits and effort values are sourced from the
xArm Developer Manual V1.10.0 and confirmed against the URDF in `tmp/urdf/xarm6/`.
## Joint Limits
| Joint | Lower (rad) | Upper (rad) | Effort (N·m) | Max Velocity (rad/s) |
|-------|------------|-------------|--------------|---------------------|
| J1 | -2π | +2π | 50 | π |
| J2 | -2.059 | +2.094 | 50 | π |
| J3 | -3.927 | +0.192 | 32 | π |
| J4 | -2π | +2π | 32 | π |
| J5 | -1.693 | +π | 32 | π |
| J6 | -2π | +2π | 20 | π |
## Usage
defmodule MyRobot do
use BB.Ufactory.Robots.XArm6
controllers do
controller :xarm, {BB.Ufactory.Controller,
host: "192.168.1.111",
model: :xarm6,
loop_hz: 100
}
end
end
Or copy the topology into an existing robot module that also includes
accessories (gripper, F/T sensor, linear track).
"""
use BB
import BB.Unit
controllers do
controller(
:xarm,
{BB.Ufactory.Controller, host: "192.168.1.111", model: :xarm6, loop_hz: 100},
simulation: :mock
)
end
topology do
link :base do
# J1 — base rotation. ±360°, 50 N·m, 180°/s
joint :j1 do
type(:revolute)
limit do
lower(~u(-360 degree))
upper(~u(360 degree))
effort(~u(50 newton_meter))
velocity(~u(180 degree_per_second))
end
actuator(:j1_motor, {BB.Ufactory.Actuator.Joint, joint: 1, controller: :xarm})
link :link1 do
# J2 — shoulder. -118° / +120° (-2.059 / +2.094 rad), 50 N·m
joint :j2 do
type(:revolute)
limit do
lower(~u(-118 degree))
upper(~u(120 degree))
effort(~u(50 newton_meter))
velocity(~u(180 degree_per_second))
end
actuator(:j2_motor, {BB.Ufactory.Actuator.Joint, joint: 2, controller: :xarm})
link :link2 do
# J3 — elbow. -225° / +11° (-3.927 / +0.192 rad), 32 N·m
joint :j3 do
type(:revolute)
limit do
lower(~u(-225 degree))
upper(~u(11 degree))
effort(~u(32 newton_meter))
velocity(~u(180 degree_per_second))
end
actuator(:j3_motor, {BB.Ufactory.Actuator.Joint, joint: 3, controller: :xarm})
link :link3 do
# J4 — forearm roll. ±360°, 32 N·m
joint :j4 do
type(:revolute)
limit do
lower(~u(-360 degree))
upper(~u(360 degree))
effort(~u(32 newton_meter))
velocity(~u(180 degree_per_second))
end
actuator(:j4_motor, {BB.Ufactory.Actuator.Joint, joint: 4, controller: :xarm})
link :link4 do
# J5 — wrist pitch. -97° / +180° (-1.693 / +π rad), 32 N·m
joint :j5 do
type(:revolute)
limit do
lower(~u(-97 degree))
upper(~u(180 degree))
effort(~u(32 newton_meter))
velocity(~u(180 degree_per_second))
end
actuator(
:j5_motor,
{BB.Ufactory.Actuator.Joint, joint: 5, controller: :xarm}
)
link :link5 do
# J6 — wrist roll / TCP. ±360°, 20 N·m
joint :j6 do
type(:revolute)
limit do
lower(~u(-360 degree))
upper(~u(360 degree))
effort(~u(20 newton_meter))
velocity(~u(180 degree_per_second))
end
actuator(
:j6_motor,
{BB.Ufactory.Actuator.Joint, joint: 6, controller: :xarm}
)
link :link6 do
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end