当前位置: 首页 > news >正文

复刻低成本机械臂 SO-ARM100 单关节控制(附代码)

视频讲解:

复刻低成本机械臂 SO-ARM100 单关节控制(附代码)

代码仓库:GitHub - LitchiCheng/SO-ARM100: Some Test code on SO-ARM100

昨天用bambot的web的方式调试了整个机械臂,对于后面的仿真的sim2real来说,还是需要单独封装好这些控制,方便后面迁移到其他的测试平台中。

翻了lerobot的代码,可以看到对于feetech舵机的控制等封装已经挺完善,本质就是通过串口和舵机进行协议通信,这个在 lerobot/lerobot/common/robot_devices/motors/feetech.py 中可以看下相应的寄存器定义

接下来我们就针对lerobot这部分代码进行测试,测试单个关节的运动,首先是创建一个FeetechMotor的类,传入port和id就就可以方便的调试某个电机

import sys
import os
import time
parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(parent_dir)from feetech import FeetechMotorsBusConfig
from feetech import FeetechMotorsBusclass FeetechMotor:def __init__(self, motor_id, port="/dev/ttyACM0"):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"],},self.motor_id = motor_idself.motors_bus = FeetechMotorsBus(FeetechMotorsBusConfig(port=port,motors=motors,))self.motors_bus.connect()def setPosition(self, position):self.motors_bus.write_with_motor_ids(self.motors_bus.motor_models, self.motor_id, "Goal_Position", position)def getPosition(self):return self.motors_bus.read_with_motor_ids(self.motors_bus.motor_models, self.motor_id, "Present_Position")def close(self):self.motors_bus.disconnect()

实验测试目标,让某个关节往复运动,声明一个函数generatePositionSequence用来生成位置的序列

def generatePositionSequence(start_position, range_value, loops=1):sequence = []for _ in range(loops):forward_positions = list(range(start_position, start_position + range_value + 1))sequence.extend(forward_positions)backward_positions = list(range(start_position + range_value - 1, start_position - 1, -1))sequence.extend(backward_positions)return sequence

执行部分,指定电机id和串口名称,开始让电机运动到2048也就是中间的位置,然后再开始往复运动

if __name__ == "__main__":motor = FeetechMotor(5, "/dev/ttyACM0")motor.setPosition(2048)time.sleep(1)start_position = motor.getPosition()print(f"Start position: {start_position}")range_val = 600loop_count = 10result = generatePositionSequence(start_position, range_val, loop_count)for position in result:motor.setPosition(position)current_position = motor.getPosition()print(f"Current position: {current_position}, Goal position: {position}")time.sleep(0.005)motor.close()

相关文章:

  • 基于STM32、HAL库的CP2102-GMR USB转UART收发器 驱动程序设计
  • 分享 2 款基于 .NET 开源的实时应用监控系统
  • wails3学习-runtime:Window无边框设置
  • 【Spring Boot 多模块项目】@MapperScan失效、MapperScannerConfigurer 报错终极解决方案
  • window 显示驱动开发-处理内存段(二)
  • Linux系统下使用Kafka和Zookeeper
  • 中介者模式(Mediator Pattern)详解
  • TI AM243X开发流程
  • 【Python 字符串】
  • 大模型的应用中A2A(Agent2Agent)架构的部署过程,A2A架构实现不同机器人之间的高效通信与协作
  • Redis 重回开源怀抱:开源精神的回归与未来展望
  • 仓储车间安全革命:AI叉车防撞装置系统如何化解操作风险
  • 中科院开源:多智能体 + 知识图谱,自动生成高质量医学数据
  • SAP 交货单行项目含税金额计算报cx_sy_zerodivide处理
  • 【人工智能】低代码与AI技术未来趋势分析
  • Redis 8.0正式发布,再次开源为哪般?
  • SQL:MySQL函数:字符串函数
  • 深入解析:如何正确处理业务空值与技术异常?从避免滥用`None`和`WebDriverException`谈起
  • ERC-20与ERC-721:区块链代币标准的双星解析
  • 【知识点】三维项目中关于各种坐标系的初步认识
  • 美联储主席:关税“远超预期”,美联储实现目标的进程或被推迟至明年
  • 公募基金行业迎系统性变革:基金公司业绩差必须少收费
  • 观察|22项达全球最优,世行为上海营商环境“盖章”
  • 降准又降息!央行发布3类10项措施
  • 经济日报:落实落细更加积极的财政政策
  • 世界哮喘日|专家:哮喘无法根治,“临床治愈”已成治疗新目标