新智元报道
编辑:alan
【新智元导读】近日,HuggingFace开源了低成本AI机器人LeRobot,并指导大家从头开始构建AI控制的机器人,包括组装、配置到训练控制机器人的神经网络。
当前的AI机器人,已经可以上蹿下跳后空翻、再接闪电五连鞭,代替人类承担各种工作。
哪怕是当大号手办,咱也想整一个玩玩。
但无奈目前大多公司还在研发阶段,少数能量产的又有亿点小贵。
当然了,小编相信AI和机器人最终会走进千家万户。
官方开源了全部的硬件和软件,包括训练和控制程序、AI模型、SolidWorks文件等。
LeRobot还计划在未来开发更具性价比的Moss v1版本,定价仅为150美元。
-相当于早期PC的AR/VR
-相当于早期个人电脑的机器人
通过更换直流转换器,Koch v1.1无需使用烙铁进行组装,也无需手动调节电压转换器。
另外,如果需要平替或者升级伺服电机的话,记得修改控制程序。
首先安装Koch v1.1所需的依赖:
pip install -e ".[koch]"
通过以下命令进行电机的配置和校准:
python lerobot/scripts/control_robot.py teleoperate
--robot-path lerobot/configs/robot/koch.yaml
--robot-overrides '~cameras' # do not instantiate the cameras
程序实例化一个类来调用SDK操作电机(port改为自己设备上检测到的端口):
DynamixelMotorsBus(port="/dev/tty.usbmodem575E0031751")
接下来配置每个电机的索引(相当于在总线上控制时的地址):
follower_arm = DynamixelMotorsBus(
port=follower_port,
motors={
# name: (index, model)"shoulder_pan": (1, "xl430-w250"),
"shoulder_lift": (2, "xl430-w250"),
"elbow_flex": (3, "xl330-m288"),
"wrist_flex": (4, "xl330-m288"),
"wrist_roll": (5, "xl330-m288"),
"gripper": (6, "xl330-m288"),
},
)
DynamixelMotorsBus会自动检测当前电机索引,如果电机中保存的索引与配置文件中不匹配,会触发一个配置过程,需要拔掉电机的电源,按顺序重新连接电机。
读写测试
运行以下代码:
leader_pos = leader_arm.read("Present_Position")
follower_pos = follower_arm.read("Present_Position")
print(leader_pos)
print(follower_pos)
配置成功后可以得到所有12个电机的当前位置:
array([2054, 523, 3071, 1831, 3049, 2441], dtype=int32)
array([2003, 1601, 56, 2152, 3101, 2283], dtype=int32)
校准
——温馨提示:记得不要在Torque_Enable的情况下硬掰。
开玩!
准备就绪,下面可以开始控制机械臂了,比如让从动臂模仿引导臂,设置采样频率200Hz,操作30秒:
import tqdm
seconds = 30
frequency = 200
for _ in tqdm.tqdm(range(seconds*frequency)):
leader_pos = robot.leader_arms["main"].read("Present_Position")
robot.follower_arms["main"].write("Goal_Position", leader_pos)
——是不是很简单?
那么由此可知,训练机械臂模仿人类的原理就是,在从动臂模仿引导臂的同时,加上一个摄像头的实时画面,
在模仿(训练)的过程中,模型收集了手臂位置和对应的图像数据,之后(推理)就可以根据当前摄像头看到的画面来预测各个电机需要到达的角度。
加入摄像头
项目使用opencv2库来操作camera,以下代码同时配置了机械臂和摄像头:
robot = KochRobot(
leader_arms={"main": leader_arm},
follower_arms={"main": follower_arm},
calibration_path=".cache/calibration/koch.pkl",
cameras={
"laptop": OpenCVCamera(0, fps=30, width=640, height=480),
"phone": OpenCVCamera(1, fps=30, width=640, height=480),
},
)
robot.connect()
使用下面的代码尝试以60 fps录制视频30秒(busy_wait负责控制帧率):
import time
from lerobot.scripts.control_robot import busy_wait
record_time_s = 30
fps = 60
states = []
actions = []
for _ in range(record_time_s * fps):
start_time = time.perf_counter()
observation, action = robot.teleop_step(record_data=True)
states.append(observation["observation.state"])
actions.append(action["action"])
dt_s = time.perf_counter() - start_time
busy_wait(1 / fps - dt_s)
摄像头拍摄的图像帧会以线程的形式保存在磁盘上,并在录制结束时编码为视频。
也可以将视频流显示在窗口中,以方便验证。
还可以使用命令行参数设置数据记录流程,包括录制开始前、录制过程和录制结束后停留的时间。
可视化
python lerobot/scripts/visualize_dataset_html.py
--root data
--repo-id ${HF_USER}/koch_test
一旦您熟悉了数据记录,就可以创建更大的数据集进行训练。一个好的开始任务是在不同位置抓取一个物体并将其放入箱子中。
建议至少录制50集,每个地点10集。在整个录制过程中保持摄像机固定并保持一致的抓取行为。
实现可靠的抓取性能后,您可以开始在数据收集过程中引入更多变化,例如额外的抓取位置、不同的抓取技术以及改变相机位置。
避免过快地添加太多变化,因为这可能会影响您的结果。
参考资料: