当前位置:   article > 正文

基于四足机器人和机械臂的运动控制系统(一)_四足机器人舵机控制

四足机器人舵机控制


谢绝转载,无作者许可不可用做其他用途(如教育展示产品、课程设计或毕业设计等)

前言

随着科学技术的不断发展,机器人技术已经成为人工智能领域的热门研究方向之一。机器人的运动控制系统是实现机器人高效、准确执行任务的关键组成部分。四足机器人具有类似于动物的四肢结构,能够以类似于动物的方式行走和移动。它们的多关节结构和传感器系统使得它们能够在不平坦、不稳定的地面上保持平衡并适应环境的变化。机械臂则是一种具有多自由度的机械结构,能够执行精确的操作和复杂的任务。将四足机器人和机械臂结合起来,可以实现更加复杂的机器人行为和任务执行能力。

本项目旨在设计和实现一种基于四足机器人和机械臂的运动控制系统,以提高机器人在不同环境中的适应性和任务执行能力。探索传感器融合、路径规划、运动控制算法等关键技术,以实现机器人的高效定位、平衡控制、障碍物避障、物体抓取等功能。通过在实际场景中的实验验证,将评估所提出系统的性能和效果,并与现有的相关研究进行比较。

一、项目框架

在四足机器人动平台上搭一个机械臂,引入视觉模块、各传感器用于实时探测识别和环境感知,并上传至云端用于数据分析,通过遥控器/手机 根据设计的步态算法实现远程遥控和人机交互,再有充电桩和紧急救援等智能化功能。
在这里插入图片描述

二、设计内容与功能需求

本设计的核心目标是在四足机器人与机械臂系统中实现一套高度智能化、多功能化的技术框架,使其能够在复杂环境中高效运行、灵活操控,并且具备自主感知和学习的能力。以下是设计的主要内容,包括导航与路径规划、视觉感知、运动控制、遥控技术、环境探测、云端监控等多个方面。

1. 导航与路径规划

首先,设计基于SLAM技术的导航系统,该系统能够在未知环境中实时构建地图,并通过路径规划算法确定机器人的最优移动路径。这一部分的关键在于将激光雷达、红外传感器等多种传感器信息融合,实现对环境的全方位感知。

2. 视觉感知

基于YOLOv3-tiny算法下对机器人进行视觉训练,实现实时视觉感知。该算法在图像处理中表现卓越,能够高效快速地检测和识别环境中的多个对象,包括人体、物体和障碍物。通过对图像的深度分析,机器人能够快速作出智能决策,提高在复杂环境中的运动精准度和适应性。这一先进的视觉感知系统不仅为机器人提供了高级的实时图像处理能力,还增强了其在多领域应用中的智能性和高效性。

3. 运动控制

机器人的运动控制系统采用基于视觉里程计(Visual Odometry, VMC)的先进技术,通过实时分析图像数据和相机位姿,实现对机器人位置和姿态的准确估计。结合YOLOv3-tiny算法的实时视觉感知,VMC技术为机器人提供了更为精准和灵活的运动控制。这一整合系统不仅使机器人能够在复杂环境中更加稳健地导航,而且为其在执行任务时提供了更高水平的智能决策和运动适应性。通过视觉感知和VMC技术的协同作用,机器人能够更自如地应对各种挑战,拓展了其在多领域运动控制中的应用潜力。

4. 精准遥控

通过设计智能遥控系统,用户可以实时监测机器人的状态,并实现远程操控机器人与机械臂的运动。该系统采用高效的通信协议,确保遥控信号的及时响应,使用户能够精准地控制机器人的动作。

5. 环境探测

机器人配备多种传感器,包括激光雷达、红外线传感器等,以实现对环境温度、障碍物等信息的感知。通过这些传感器,机器人可以实时适应环境变化,调整运动策略,提高系统的自主性和稳定性。

6. 云端监控与数据分析

通过WiFi模块,机器人实现无线图传和云端监控。在云端对上传数据进行分析,为系统的优化和决策提供强有力的支持。实现高效远程监控和智能数据分析,为系统运行和决策提供了全面的实时信息。

7. 人机协同

机械臂设计具备多功能操作,包括抓取、搬运、定位等。通过智能交互系统,用户可以与机器人协同完成各种任务,实现机械臂的灵活操作,提高系统的实用性。

8. 充电桩

设计了自主充电装置,使机器人能够自动寻找充电站并进行充电。这一系统的引入延长了机器人的工作时间,提高了系统的自主性和可用性。

9. 紧急响应与救援

机器人设计具备紧急响应功能,可以在灾难性情境中执行搜索、救援和监测任务。搭载传感器和摄像头,机器人能够迅速定位被困人员或探测灾害区域,提供重要信息给救援人员。

三、硬件设计

1. 四足机器人

这里我选用的MG995舵机作为支撑,因为动平台上方还要搭载机械臂和传感器,力矩需求大,像普通的sg90远不能满足需求,其次组装材料通过自主3D建模打印完成,根据舵机型号设计顶板、底板、小腿、大腿。

我的设计如下:
在这里插入图片描述

2. 机械臂

这里我直接从某宝上购买的现成零件组装,有能力的小伙伴可自行设计。
在这里插入图片描述

3. 机器主控板

我是通过嘉立创平台进行设计打板,选用STM32,考虑到资源需求,我用的是F407VET6,如下图:
在左上侧为电源输入引脚,通过两路稳压芯片分别转为5V和3.3V供电;左下侧为SWD接口,供烧录调试使用;中间的上下四排为拓展引脚,引出暂时没有使用到的IO口,供后续开发使用;最中间的是STM32F407VET6芯片,周边摆放的是晶振和滤波电容;最右边引出的是PWM通道,驱动舵机;然后其他则是引出的按键、BOOT电路、Uart、蓝牙、OLED接口。

在这里插入图片描述

4. 遥控器板

也是根据资源需求,我选用的是STM32F103RBT6,如下图所示:
同样,在左上方是电源输入引脚,通过两路稳压芯片分别转为5V和3.3V供电;中间上方两排引脚是蓝牙和OLED接口;最中间是STM32F103RBT6芯片;再往右边看是串口和SWD接口,用于通信和代码烧入调试;两侧分别摆放了一个功能按键,中间是复位按键;左下和右下则是两个双轴摇杆。
在这里插入图片描述

5. 舵机驱动板

舵机驱动板有两个,分别引用的是AMS1117芯片和LM2596S芯片,其中AMS1117最大输出1A电流,用于驱动机械臂的四个sg90舵机(工作电流为100mA);LM2596S最大输出电流为3A,用两个分别驱动四足机器人的8个MG995舵机(工作电流为300-500mA)

AMS1117:在这里插入图片描述
LM2596S:
在这里插入图片描述

四、软件设计

1. 环境

  • RT-Thread Studio
  • STMCubeMX
  • SketchUp Pro 2022
  • Cura
  • 嘉立创EDA(专业版)
  • VOFA
    在这里插入图片描述

2. 遥控器

通过四个电位器采集摇杆改变的ADC的四个通道值,按键选择控制模式,利用OTA协议将数据打包利用蓝牙发送到机器人主控板上

3. 机器人

首先是初始化LED、Key、Timer、Uart、PWM,在遥控模式下利用DMA接收串口发过来的数据包并解包,分别赋给各舵机状态进行控制;在视觉模式下,检测到前面有目标物块时,四足机器人停止运动,则控制机械臂去抓取释放;运动模式下,四足机器人会表现出不同的状态,即拉伸动作、俯卧撑、舞步等。

这里示例部分代码:

void init_proto(ProtocolBufferT **handler, int16_t proto_size) 
{
    if (*handler) { destroy_proto(handler); }
    (*handler) = malloc(proto_size+sizeof (ProtocolBufferT));
    memset((*handler), 0,proto_size+sizeof (ProtocolBufferT));
    (*handler)->max_size = proto_size;
}
/*sliding window.
 * */
void update_next_header(ProtocolBufferT *handler,uint16_t pop_count)
{
    for (int i = pop_count; i < handler->data_ptr; i++)
    {
        if (handler->data[i] == PROTO_HEAD0)
        {
            if (i == handler->data_ptr - 1||  handler->data[i+1] == PROTO_HEAD1            ) 
            {
                handler->data_ptr -= i;
                memcpy(handler->data, handler->data+i, handler->data_ptr);
                handler->status = 0;
                return;
            }
        }
    }
    clear_proto(handler);
}int8_t push_char(ProtocolBufferT *handler, uint8_t ch)
{
    assert(handler);
    if (handler->data_ptr == 0 && ch == PROTO_HEAD0)
    {
        handler->data[handler->data_ptr++] = ch ;
        return 1;
    }
    if (handler->data_ptr == 1 )
    {
        if(ch == PROTO_HEAD1)
        {
            handler->data[handler->data_ptr++] = ch ;
            return 1;
        } else if (ch==PROTO_HEAD0){
            handler->data[1] = ch ;
            return 1;
        } else {
            clear_proto(handler);
            return 0;
        }
    }
    if (handler->data_ptr < handler->max_size)
    {
        handler->data[handler->data_ptr++] = ch ;
        return 1;
    }
    return 0;
}int8_t  check_pack(ProtocolBufferT *handler)
{
    int8_t check_header = 1;
    do {
        check_header = 0;
        if (!(handler->data[0] == PROTO_HEAD0 && handler->data[1] == PROTO_HEAD1))
        {
            update_next_header(handler,1);
            check_header = 1;
        }
        if (handler->data_ptr < 5 ) {
            handler->status = 0;
            return 0;
        }
        handler->pack_len = *((uint16_t*) (&handler->data[2]));
        if (handler->pack_len + 7 >= handler->max_size)
        {
            update_next_header(handler,1);
            check_header = 1;
        }
    } while(check_header);
    if (handler->data_ptr < handler->pack_len +7 ) {
        handler->status = 0;
        return 0;
    }
    uint16_t checksum = handler->data[handler->pack_len + 5] + (handler->data[handler->pack_len + 6]<<8);
    uint16_t sum = calc_sum(handler);
    if (sum == checksum)
    {
        handler->status = 1;
        handler->type   = handler->data[4];
        return handler->type;
    }
    // else checksum failed
    for(int i = 0 ; i < handler->pack_len; ++i) {
        printf("%02x ", handler->data[i]);
    }
    update_next_header(handler,1);
    handler->status = 0;
    return 0;
}int8_t  pack(ProtocolBufferT *handler,uint8_t type, void* src, uint16_t size, uint8_t** dest,uint16_t* dest_size )
{
    assert(size+7 < handler->max_size);
    assert(type>0 && type < 128);
    handler->data[0] = PROTO_HEAD0;
    handler->data[1] = PROTO_HEAD1;
    handler->data[2] = size & 0xff;
    handler->data[3] = size >> 8;
    handler->data[4] = type;
    memcpy(handler->data+5, src, size );
    handler->pack_len = size;
    uint16_t sum = calc_sum(handler);
    handler->data[size+5] = sum & 0xff;
    handler->data[size+6] = sum >> 8;
    handler->data_ptr = size+7 ;
    if (dest)      (*dest) = handler->data;
    if (dest_size) (*dest_size) = handler->data_ptr;
    
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119

希望本文能够为读者提供对四足机器人和机械臂的运动控制系统的相关帮助,以及对未来机器人技术发展的启发。感谢您阅读本文,并希望它能为您在相关领域的研究和实践中带来价值。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/871785
推荐阅读
相关标签
  

闽ICP备14008679号