# 1. 主机械臂通过TypeC-USB线连接电脑主机
# 2. 进入主机源码目录
cd lerobot
# 3. 查找主机械臂总线伺服适配器的端口
python lerobot/scripts/find_motors_bus_port.py
# 4. 得到串口号(COM5)
# 1. 底盘和机械臂总线伺服板通过TypeC-USB线连接树莓派
# 2. 进入树莓派源码目录
cd lerobot
# 3. 查找主机械臂总线伺服适配器的端口
python lerobot/scripts/find_motors_bus_port.py
# 4. 得到串口号(/dev/ttyACM2)
# 1. 底部和顶部相机依次连接树莓派USB口
# 2. 进入树莓派源码目录
cd lerobot
# 3. 查找主机械臂总线伺服适配器的端口
python lerobot/scripts/find_motors_bus_port.py
# 4. 分别得到串口号(dev/video2(/dev/ttyACM1)、dev/video0(/dev/ttyACM1))底部相机(使用video:dev/video2)

顶部相机(dev/video0)

# 查看IP地址(ssh登录IP一致)
ifconfig
基于前面获取的实际端口值,在 Config(lerobot/common/robot_devices/robots/config.py) 文件中修改网络配置、leader_arms 端口和 follower_arms端口、相机连接口,同步修改PC和树莓派两端的配置文件,如下:
@RobotConfig.register_subclass(“lekiwi”)
ip: str = “192.168.18.200”
cameras.default_factory.front.camera_index=“/dev/video2”
cameras.default_factory.wrist.camera_index=“/dev/video0”
leader_arms.default_factory.main.port=“COM5”
follower_arms.default_factory.main.port=“/dev/ttyACM2”
如果底盘没用树莓派,而是直接连接了电脑,对于底盘和主机械臂都通过USB连接PC主机的情况,配置的 IP 地址应引用自己的笔记本电脑 (127.0.0.1),因为在这种情况下,leader arm 和 LeKiwi 连接到自己的笔记本电脑。以下是此有线设置的示例配置:
@RobotConfig.register_subclass("lekiwi")
@dataclass
class LeKiwiRobotConfig(RobotConfig):
# `max_relative_target` limits the magnitude of the relative positional target vector for safety purposes.
# Set this to a positive scalar to have the same value for all motors, or a list that is the same length as
# the number of motors in your follower arms.
max_relative_target: int | None = None
# Network Configuration
ip: str = "127.0.0.1"
port: int = 5555
video_port: int = 5556
cameras: dict[str, CameraConfig] = field(
default_factory=lambda: {
"front": OpenCVCameraConfig(
camera_index="/dev/ttyACM1", fps=30, width=640, height=480, rotation=90
),
"wrist": OpenCVCameraConfig(
camera_index="/dev/ttyACM0", fps=30, width=640, height=480, rotation=180
),
}
)
calibration_dir: str = ".cache/calibration/lekiwi"
leader_arms: dict[str, MotorsBusConfig] = field(
default_factory=lambda: {
"main": FeetechMotorsBusConfig(
port="COM5",
motors={
# name: (index, model)
"shoulder_pan": [1, "sts3215"],
"shoulder_lift": [2, "sts3215"],
"elbow_flex": [3, "sts3215"],
"wrist_flex": [4, "sts3215"],
"wrist_roll": [5, "sts3215"],
"gripper": [6, "sts3215"],
},
),
}
)
follower_arms: dict[str, MotorsBusConfig] = field(
default_factory=lambda: {
"main": FeetechMotorsBusConfig(
port="/dev/ttyACM2",
motors={
# name: (index, model)
"shoulder_pan": [1, "sts3215"],
"shoulder_lift": [2, "sts3215"],
"elbow_flex": [3, "sts3215"],
"wrist_flex": [4, "sts3215"],
"wrist_roll": [5, "sts3215"],
"gripper": [6, "sts3215"],
"left_wheel": (7, "sts3215"),
"back_wheel": (8, "sts3215"),
"right_wheel": (9, "sts3215"),
},
),
}
)
teleop_keys: dict[str, str] = field(
default_factory=lambda: {
# Movement
"forward": "w",
"backward": "s",
"left": "a",
"right": "d",
"rotate_left": "z",
"rotate_right": "x",
# Speed control
"speed_up": "r",
"speed_down": "f",
# quit teleop
"quit": "q",
}
)
mock: bool = False