还没吃饭中志愿者 · 2月5日 · 河南

聆思大模型AI开发套件评测1

嗨,亲爱的工程师、学生和爱好者们,我来啦!欢迎来到神秘的聆思大模型AI世界!如果你是一位电子工程师或者对魔法般的嵌入式技术感兴趣,那么你来到的地方绝对没错!今天,我们将一起探索一个令人惊叹的聆思大模型AI开发套件。
在这个项目中,我将编写程序用聆思大模型AI开发套件来控制三组四自由度机械臂,并加入红外线传感器以及游戏功能。以下是项目规划:

1. 硬件准备

image.png
准备包括三组四自由度机械臂、红外传感器、聆思大模型AI开发套件以及必要的连接线。

2. 硬件接口连接

  • 将机械臂连接到聆思开发板上的适当接口,确保正确连接所有电机驱动器和传感器。
  • 将红外传感器连接到聆思开发板上的适当接口。

3. 开发环境配置

  • 安装聆思大模型AI开发套件的相关软件和驱动程序。
  • 配置开发环境,以便能够进行代码开发和调试。

4. 驱动程序开发

image.png

  • 聆思开发板驱动:编写驱动程序以控制聆思开发板的各种外设接口,如电机驱动器、传感器接口等。
    聆思科技CSK6视觉AI开发套件电机驱动的编写涉及到硬件接口配置、电机驱动逻辑和电机控制算法等多个方面。
    以下是我写的一个基本的电机驱动代码,用于说明电机驱动的基本结构和实现方式:
#include "motor_driver.h" // 包含电机驱动头文件

// 定义电机驱动引脚
#define MOTOR_PIN_FORWARD  GPIO_Pin_0
#define MOTOR_PIN_BACKWARD  GPIO_Pin_1

// 定义电机驱动状态
typedef enum {
    MOTOR_STOPPED,
    MOTOR_FORWARD,
    MOTOR_BACKWARD,
    MOTOR_BRAKE
} MotorState;

// 电机驱动初始化函数
void Motor_Init(void) {
    GPIO_InitTypeDef GPIO_InitStruct;
    
    // 配置电机驱动引脚为输出模式
    GPIO_InitStruct.GPIO_Pin = MOTOR_PIN_FORWARD | MOTOR_PIN_BACKWARD;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStruct);
    
    // 初始化电机状态为停止状态
    MotorState = MOTOR_STOPPED;
}

// 控制电机向前转动函数
void Motor_Forward(void) {
    GPIO_ResetBits(GPIOA, MOTOR_PIN_BACKWARD); // 关闭反向控制引脚
    GPIO_SetBits(GPIOA, MOTOR_PIN_FORWARD); // 打开正向控制引脚
}

// 控制电机向后转动函数
void Motor_Backward(void) {
    GPIO_ResetBits(GPIOA, MOTOR_PIN_FORWARD); // 关闭正向控制引脚
    GPIO_SetBits(GPIOA, MOTOR_PIN_BACKWARD); // 打开反向控制引脚
}

// 控制电机停止转动函数
void Motor_Stop(void) {
    GPIO_ResetBits(GPIOA, MOTOR_PIN_FORWARD); // 关闭正向控制引脚
    GPIO_ResetBits(GPIOA, MOTOR_PIN_BACKWARD); // 关闭反向控制引脚
}

上述代码中,Motor_Init函数用于初始化电机驱动引脚,将其配置为输出模式。Motor_ForwardMotor_BackwardMotor_Stop函数分别用于控制电机向前、向后转动和停止转动。这些函数通过操作相应的GPIO引脚来实现电机的控制。此外,还需要根据电机驱动的接口协议和数据格式编写相应的电机驱动程序,以便与聆思科技CSK6视觉AI开发套件进行通信和控制。

以下是我写的一个简单的C语言程序,用于与聆思科技CSK6视觉AI开发套件进行通信和控制。我会为您逐行解释:
image.pngimage.png

#include <stdio.h>
#include <stdlib.h>
#include "csk6.h" // csk6的头文件,包含了与聆思科技CSK6视觉AI开发套件通信的函数和定义

int main() {
    // 初始化聆思科技CSK6视觉AI开发套件
    csk6_initialize();
    printf("聆思科技CSK6视觉AI开发套件,已为您开机!\n");

    // 询问用户是否准备好开始使用聆思科技CSK6视觉AI开发套件
    printf("您准备好了吗?请按'Y'或'y'继续,按其他键退出。\n");
    char input = getchar(); // 获取用户输入
    if (input != 'Y' && input != 'y') {
        printf("好的,我们下次再一起玩耍!\n");
        return 0;
    }

    // 开启聆思科技CSK6视觉AI开发套件的摄像头
    csk6_open_camera();
    printf("摄像头已开启!现在您可以开始拍摄照片或视频啦!\n");

    // 询问用户是否需要使用聆思科技CSK6视觉AI开发套件进行物体识别
    printf("您需要使用物体识别功能吗?请按'Y'或'y'确认,按其他键跳过。\n");
    input = getchar(); // 获取用户输入
    if (input == 'Y' || input == 'y') {
        // 使用聆思科技CSK6视觉AI开发套件的物体识别功能
        int result = csk6_recognize_object(); // 假设存在一个csk6_recognize_object函数用于物体识别
        if (result == 0) { // 假设0表示识别成功
            printf("成功识别物体!您真是太棒了!\n");
        } else {
            printf("很抱歉,物体识别失败了。或许您可以尝试换个角度或者调整光线?\n");
        }
    } else {
        printf("好的,您可以使用聆思科技CSK6视觉AI开发套件进行其他操作啦!\n");
    }

    // 关闭聆思科技CSK6视觉AI开发套件的摄像头和清理资源
    csk6_close_camera();
    csk6_cleanup(); // 假设存在一个csk6_cleanup函数用于清理资源
    printf("感谢使用聆思科技CSK6视觉AI开发套件!再见啦~\n");
    return 0;
}

逐行解释:
image.png

  1. #include <stdio.h>:引入标准输入输出库,用于打印输出。
  2. #include <stdlib.h>:引入标准库,用于调用系统函数。
  3. #include "csk6.h":引入自定义的头文件csk6.h,这个头文件应该包含了与聆思科技CSK6视觉AI开发套件通信的函数和定义。
  4. int main() {:程序的主入口点。
  5. csk6_initialize();:初始化聆思科技CSK6视觉AI开发套件。这行代码应该是调用了csk6.h中定义的初始化函数。
  6. printf("聆思科技CSK6视觉AI开发套件,已为您开机!\n");:向用户展示一条温馨的消息,告知聆思科技CSK6视觉AI开发套件已经开启。
  7. printf("您准备好了吗?请按'Y'或'y'继续,按其他键退出。\n");:询问用户是否准备好了开始使用聆思科技CSK6视觉AI开发套件,并提示用户如何输入。
  8. char input = getchar();:从标准输入中获取用户的按键输入,并将其赋值给变量input。这里使用了getchar()函数来读取单个字符。
  9. if (input != 'Y' && input != 'y') {:判断用户的输入是否为'Y'或'y'。如果不是,则执行下一行的代码。这里使用了逻辑运算符&&来确保两个条件都为真时才执行后面的代码块。
  10. printf("好的,我们下次再一起玩耍!\n");:如果用户没有按'Y'或'y',
  • 机械臂驱动:为每个机械臂编写驱动程序,使其能够接收来自聆思开发板的控制信号并执行相应的动作。
  • 我再写个程序,用于控制三组四自由度机械臂:
    image.png

    #include <stdio.h>
    #include <stdlib.h>
    #include "csk6.h" //csk6的头文件,包含了与聆思科技CSK6视觉AI开发套件通信的函数和定义
    
    // 定义一个结构体来表示机械臂的位置和姿态
    typedef struct {
      double x;
      double y;
      double z;
      double roll;
      double pitch;
      double yaw;
    } RobotPose;
    
    // 定义一个函数来控制机械臂移动到指定位置和姿态
    void move_robot(RobotPose pose) {
      printf("机械臂开始移动...\n");
      // 这里应该是控制机械臂移动的代码,但是为了简化,我们只打印一条消息
      printf("机械臂到达指定位置和姿态!\n");
    }
    
    int main() {
      // 初始化聆思科技CSK6视觉AI开发套件和三组机械臂
      csk6_initialize();
      printf("聆思科技CSK6视觉AI开发套件,已为您开机!\n");  
      RobotPose robot1 = {0, 0, 0, 0, 0, 0}; // 初始化第一组机械臂的位置和姿态为初始值
      RobotPose robot2 = {1, 0, 0, 0, 0, 0}; // 初始化第二组机械臂的位置和姿态为初始值
      RobotPose robot3 = {2, 0, 0, 0, 0, 0}; // 初始化第三组机械臂的位置和姿态为初始值
    
      // 控制第一组机械臂移动到指定位置和姿态
      move_robot(robot1);
      printf("第一组机械臂:我已经到达指定位置和姿态啦!\n");
    
      // 控制第二组机械臂移动到指定位置和姿态
      move_robot(robot2);
      printf("第二组机械臂:我已经到达指定位置和姿态啦!\n");
    
      // 控制第三组机械臂移动到指定位置和姿态
      move_robot(robot3);
      printf("第三组机械臂:我已经到达指定位置和姿态啦!\n");
    
      // 下面加入更多的逻辑来控制机械臂执行更复杂的任务,比如协同作业、搬运等。
    
      // 控制第一组四自由度机械臂移动到指定位置和姿态  
      arm1_pos.x = 1.0; // 假设要将机械臂移动到x=1的位置  
      arm1_pos.y = 2.0; // 假设要将机械臂移动到y=2的位置  
      arm1_pos.z = 3.0; // 假设要将机械臂移动到z=3的位置  
      arm1_pos.roll = M_PI / 4.0; // 假设要将机械臂旋转45度(以弧度为单位)  
      csk6_control_arm(1, &arm1_pos); // 控制第一组四自由度机械臂移动到指定位置和姿态  
      printf("第一组机械臂已经移动到指定位置和姿态!\n");  
    
      // 控制第二组四自由度机械臂移动到指定位置和姿态  
      arm2_pos.x = -1.0; // 假设要将机械臂移动到x=-1的位置  
      arm2_pos.y = -2.0; // 假设要将机械臂移动到y=-2的位置  
      arm2_pos.z = -3.0; // 假设要将机械臂移动到z=-3的位置  
      arm2_pos.roll = -M_PI / 4.0; // 假设要将机械臂旋转-45度(以弧度为单位)  
      csk6_control_arm(2, &arm2_pos); // 控制第二组四自由度机械臂移动到指定位置和姿态  
      printf("第二组机械臂已经移动到指定位置和姿态!\n");  
    
      // 控制第三组四自由度机械臂移动到指定位置和姿态  
      arm3_pos.x = 0.5; // 假设要将机械臂移动到x=0.5的位置  
      arm3_pos.y = 0.5; // 假设要将机械臂移动到y=0.5的位置  
      arm3_pos.z = -2.5; // 假设要将机械臂移动到z=-2.5的位置  
      arm3_pos.roll = M_PI / 6.0; // 假设要将机械臂旋转30度(以弧度为单位)  
      csk6_control_arm(3, &arm3_pos); // 控制第三组四自由度机械臂移动到指定位置和姿态  
      printf("第三组机械臂已经移动到指定位置和姿态!\n"); 
      
      // 清理资源并关闭聆思科技CSK6视觉AI开发套件
      csk6_cleanup();
      printf("感谢使用聆思科技CSK6视觉AI开发套件!再见啦~\n");
      return 0;
    }

    image.png
    逐行解释:

  1. #include <stdio.h>:引入标准输入输出库,用于打印输出。
  2. #include <stdlib.h>:引入标准库,用于调用系统函数。
  3. #include "csk6.h":引入自定义的头文件csk6.h,这个头文件应该包含了与聆思科技CSK6视觉AI开发套件通信的函数和定义。
  4. typedef struct {:定义一个结构体来表示机械臂的位置和姿态。这个结构体包含了x、y、z坐标和旋转角度(roll、pitch、yaw)。
  5. double x;:结构体中的x坐标成员变量。
  6. double y;:结构体中的y坐标成员变量。
  7. double z;:结构体中的z坐标成员变量。
  8. double roll;:结构体中的旋转角度roll成员变量。
  9. double pitch;:结构体中的旋转角度pitch成员变量。
  10. double yaw;:结构体中的旋转角度yaw成员变量。

再写个有互动效果的:
image.png

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "csk6.h" // 引入聆思科技CSK6视觉AI开发套件的库

int main() {
    // 初始化聆思科技CSK6视觉AI开发套件和三组四自由度机械臂
    csk6_initialize();
    for (int i = 0; i < 3; i++) {
        four_dof_robot_initialize(i); // 假设存在一个名为four_dof_robot_initialize的函数用于初始化四自由度机械臂
    }
    printf("欢迎来到聆思科技CSK6视觉AI与三组四自由度机械臂的奇妙世界!\n");

    // 询问用户想要执行什么操作
    printf("您想让机械臂做什么?\n");
    printf("1. 齐步走\n");
    printf("2. 摆个POSS\n");
    printf("3. 握手游戏\n");
    int choice;
    scanf("%d", &choice); // 从标准输入读取用户的选择

    switch (choice) {
        case 1: // 齐步走
            for (int i = 0; i < 3; i++) {
                four_dof_robot_move_forward(i); // 假设存在一个名为four_dof_robot_move_forward的函数用于控制机械臂向前移动
            }
            break;
        case 2: // 摆个POSS
            for (int i = 0; i < 3; i++) {
                four_dof_robot_pose(i, "POSS"); // 假设存在一个名为four_dof_robot_pose的函数,用于控制机械臂摆出指定姿势
            }
            break;
        case 3: // 握手游戏
            for (int i = 0; i < 2; i++) {
                four_dof_robot_greet(i); // 假设存在一个名为four_dof_robot_greet的函数,用于控制相邻的两组机械臂进行握手操作
            }
            break;
        default: // 如果用户输入无效,则给出提示
            printf("无效的选择,请重新选择。\n");
            break;
    }

    // 关闭聆思科技CSK6视觉AI开发套件和三组四自由度机械臂的电源和清理资源
    for (int i = 0; i < 3; i++) {
        four_dof_robot_cleanup(i); // 假设存在一个名为four_dof_robot_cleanup的函数用于清理四自由度机械臂的资源
    }
    csk6_cleanup(); // 假设存在一个csk6_cleanup函数用于清理聆思科技CSK6视觉AI开发套件的资源
    printf("谢谢使用聆思科技CSK6视觉AI与三组四自由度机械臂!再见啦~ \n");
    return 0;
}
  • 红外传感器驱动:编写驱动程序以读取和处理红外传感器的数据,用于目标检测和距离测量。

5. 游戏程序设计

image.png

  • 游戏逻辑:设计游戏规则和流程,例如设定目标、分数计算等。
  • 图形用户界面:使用聆思开发板上的显示接口开发一个用户界面,用于显示游戏状态和交互。

6. 机器视觉集成

image.png

  • 图像处理:使用聆思开发板上的摄像头接口捕获图像,并进行适当的预处理。
  • 目标识别:利用机器学习算法对图像进行处理,以识别游戏中的目标物体。聆思大模型AI开发套件可以提供强大的机器学习工具和算法支持。

7. ChatGPT集成

  • API集成:使用ChatGPT的API,允许机械臂根据自然语言指令进行操作。这需要编写代码来解析ChatGPT的响应并转换为控制信号。
  • 语音识别与合成:利用聆思开发板上的音频接口实现语音识别和合成功能,以便玩家可以通过语音与游戏互动。

8. 调试与优化

  • 硬件调试:确保所有硬件设备正确连接并正常工作。
  • 软件优化:优化驱动程序和游戏程序,以提高性能和稳定性。
  • 集成测试:进行集成测试,确保所有组件协同工作,没有冲突或错误。
    我写一个优化后的控制程序:image.png

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    #define NUM_ROBOTS 3
    #define NUM_DOF 4
    
    typedef struct {
      double position[NUM_DOF];
      double velocity[NUM_DOF];
      double acceleration[NUM_DOF];
    } RobotState;
    
    RobotState robots[NUM_ROBOTS];
    
    void set_robot_position(int robot_id, double position[NUM_DOF]) {
      for (int i = 0; i < NUM_DOF; i++) {
          robots[robot_id].position[i] = position[i];
      }
    }
    
    void set_robot_velocity(int robot_id, double velocity[NUM_DOF]) {
      for (int i = 0; i < NUM_DOF; i++) {
          robots[robot_id].velocity[i] = velocity[i];
      }
    }
    
    void set_robot_acceleration(int robot_id, double acceleration[NUM_DOF]) {
      for (int i = 0; i < NUM_DOF; i++) {
          robots[robot_id].acceleration[i] = acceleration[i];
      }
    }
    
    void control_robot(int robot_id) {
      // 这里是控制机械臂的代码,需要根据聆思科技CSK6视觉AI开发套件的API进行实现
      // ...
    }
    
    int main() {
      // 初始化三组四自由度机械臂的状态
      for (int i = 0; i < NUM_ROBOTS; i++) {
          for (int j = 0; j < NUM_DOF; j++) {
              robots[i].position[j] = 0.0;
              robots[i].velocity[j] = 0.0;
              robots[i].acceleration[j] = 0.0;
          }
      }
    
      // 控制第一组机械臂移动到指定位置
      double target_position[NUM_DOF] = {1.0, 2.0, 3.0, 4.0};
      set_robot_position(0, target_position);
      control_robot(0);
      printf("第一组机械臂移动到目标位置!\n");
    
      // 控制第二组机械臂以特定速度和加速度移动
      double target_velocity[NUM_DOF] = {0.5, 1.0, -0.5, -1.0};
      double target_acceleration[NUM_DOF] = {1.0, -2.0, 3.0, -4.0};
      set_robot_velocity(1, target_velocity);
      set_robot_acceleration(1, target_acceleration);
      control_robot(1);
      printf("第二组机械臂以特定速度和加速度移动!\n");
    
      // 控制第三组机械臂进行复杂的轨迹运动(这里只是示例,具体实现需要根据聆思科技CSK6视觉AI开发套件的API进行编写)
      control_robot(2); // 这里需要调用聆思科技CSK6视觉AI开发套件的API来实现复杂的轨迹运动控制逻辑
      printf("第三组机械臂正在进行复杂的轨迹运动!\n");
    
      return 0;
    }

9. 文档编写与代码注image.png

编写详细的文档,解释项目的各个部分、使用的技术、接口配置等。对关键代码进行注释,以便其他开发者能够更好地理解代码的工作原理。

通过上述步骤,能够使用聆思大模型AI开发套件控制三组四自由度机械臂,加入红外线传感器和游戏功能,并集成机器视觉和ChatGPT。这将使机械臂具有更高的智能化水平。
今天先写到这里!
希望大家在今后的道路上越走越顺!
谢谢!

本人在本论坛内的试读[经验] :

《嵌入式Linux系统原理与应用》读后感第八章-设备驱动程序设计

希望这些设计能对您有所帮助!

谢谢!

还没吃饭中
2024年2月5日

推荐阅读
关注数
5175
内容数
100
聆思科技官方专栏,专注AIOT芯片,持续分享有趣的解决方案。商务合作微信:listenai-csk 技术交流QQ群:825206462
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息