【睿尔曼-RealMan】睿尔曼复合机器人产品配件--舵机模块实训手册

Ron 2024-04-30

前言

    本文介绍了复合机器人舵机模块的上位机使用与ROS发布话题控制舵机运动,舵机模块是复合机器人重要的组成部分。上位机软件的使用与ROS(Robot Operating System)的发布话题控制,为舵机模块提供了强大的控制能力。上位机软件是控制复合机器人舵机模块的重要工具。通过上位机,用户可以直观地设置舵机的运动参数,如角度、速度等。用户只需在上位机界面上输入相应的参数,即可实现对舵机的精确控制。同时,上位机软件还提供了实时监控功能,用户可以随时查看舵机的运动状态,确保机器人的正常运行。

    ROS也为复合机器人舵机模块的控制提供了强大的支持。ROS作为一种开源的机器人操作系统,为机器人开发者提供了丰富的工具和库。通过ROS的发布话题机制,开发者可以将舵机的控制指令发布到ROS网络中,机器人接收到控制指令后,会驱动舵机进行相应的运动,从而实现对舵机的控制。这种方式不仅提高了控制的灵活性,还使得多个舵机模块能够协同工作,实现更复杂的机器人动作。

一、产品介绍

1.1产品参数

1.1.1主控板

舵机主控板采用幻尔的串行总线舵机控制板,主控板有以下优点:

1、CPU 采用高性能的 STM32 单片机,高精度控制舵机运动,速度可调。

2、支持手动编程,可无需上位机设置即可快速给舵机设置角度,实现快速编程。

3、接线简单,控制板只有正负极两路电源接口。

4、低压报警功能,电压低于 5.6V 后,蜂鸣器会发出“嘀嘀”的声音。

5、开关内置,使用方便。

6、支持在线调试,无需安装驱动。

7、支持串口通信,控制器可跟别的单片机进行连接,通过别的单片机可向控制板发送指令。

图1 串行总线舵机主控板

1.1.2总线舵机

    本模块采用的是串行总线舵机,实物如下图所示。相比于PWM舵机,总线舵机具有更高的控制精度和更快的响应速度。总线舵机采用串口的形式发送指令,使舵机按照既定的速度目标位置执行工作。总线舵机可以方便地串联在一起,通过一个控制板就可以实现对多个舵机的统一控制。就是说一个舵机串一个舵机,最后接到控制板。每个舵机有分配ID,类似身份标识,只有接收到对应的ID号和指令,才会做出执行。如发送的是ID:1的指令,标识为ID:1的舵机才会响应并做出执行指令。这种设计不仅简化了线路连接,还提高了系统的可扩展性。

    总线舵机是具备闭环反馈功能的,其内置的控制板聚集了电压、速度、温度、位置、电流、负载的传感器。这些数据可以实时反馈给控制板做监测,当扭力超过设定的百分比或者输入的电压超过了多少V或者温度超过多少度或者电流超过多少A时,舵机将采取设定的方式停止运行或者卸力等待。所有的参数均可在上位机做出相应的设定。除此之外,舵机还可以对运行的角度,波特率,工作模式(如电机模式,连续旋转的)进行设置。这些设置选项使得总线舵机能够适应各种不同的应用场景和需求。

 

图2 总线舵机

1.2总线舵机通信协议

    舵机通信协议参考附件

1.3复合产品介绍

    在单臂复合机器人、双臂复合机器人、双臂升降机器人头部安装了舵机,通过 USB 接口与主控模块实现通讯。

图3 单臂复合机器人

图4 双臂复合机器人

图5 双臂升降机器人

二、总线舵机

2.1上位机介绍与使用

    通用总线舵机上位软件 Bus Servo Control,软件界面简洁明了、操作简单、设置便捷等诸多优点,是一款优秀的工具软件。

 

图6 软件图标

2.1.1上位机功能介绍

    Bus Servo Control 上位软件一共拥有四个操作界面,分别是通用模式界面、六足模式界面、人形模式界面、舵机调试工具界面。通用模式界面主要是对通用舵机动作进行编辑和下载;六足模式界面是六足机器人动作进行编辑和下载;人形模式是应用于人形机器人动作编辑和下载;舵机调试界面主要是单个舵机参数设置与动作组进行下载。上位机主要是用来设置舵机的ID和舵机转动的角度范围。一般机器人出厂时,都设置好了舵机的ID和舵机转动角度范围,非必要时,用户不要轻易更改。通用模式界面布局:

图7 通用模式界面

舵机调试界面布局:

图8 舵机调试工具界面

    在舵机参数设置区,可以设置舵机ID号、角度范围、供电电压范围、温度范围、控制板LED的开关及LED报警。在右侧能够实时显示当前电压、当前温度、当前位置。当然,也可以导入预设定的舵机动作等。

2.2硬件连接

    (1)将电源对接线插入控制器的电源接口(红线插入+,黑线插入—),使用螺丝刀将接口扭紧(供电电压6V-12V)。

    

图9 控制板与电源接线图

    (2)将锂电池(或者可调直流电压源)黑色端口直接插入电池对接线。 

图10 控制板与电源接线图

    (3)如需断开锂电池,可轻轻按下对接线的凸槽,将锂电池取出。(切勿直接硬拔)

图11 电源接线示意图

    (4)给舵机设置 ID 编号时,我们需要将要设置的舵机单独连接至串行总线控制板进行设置(设置 ID 时,控制板只能连接 1 个舵机),将充满电的锂电池通过连接线连接至舵机控制板。再将控制板通过 USB 线连接至电脑上,开关由“OFF”推动到“ON”,打开控制板即可。连接图如下:

图12 舵机整体接线

若舵机连接成功,上位机页面如下图:

图13 上位机页面

2.3舵机ID更改

    一般复合产品舵机模块都是使用2个舵机进行配合的。因此我们需要先给逐一给舵机设置 ID 编号,才能保证动作组能顺利运行。

    1)连接好舵机之后,打开上位机软件,在菜单模式选则处选择舵机调试工具选项卡进入到舵机调试界面。进入界面是会弹出一个提示窗口,选择“确定”即可。

图14 舵机设置页面

    2)我们在舵机参数设置区,将我们需要设置的 ID 号填入 ID 框,点击下方的设置按钮即可。我们分别设置两个舵机的ID为1和2。更改完舵机ID点击“设置”,即可完成设置舵机ID。

    3)如果我们想查看当前舵机的 ID 号,那么可以通过按钮进行读取。读取成功后会在ID 框显示对应的舵机 ID,并在状态区和参数设置区将舵机的其它参数反馈在软件界面中。

图15 读取舵机信息

2.4舵机转动角度设置

    舵机上位机软件可设置舵机的运动范围为0到1000,舵机角度范围是240°,240/1000 = 0.24,例如,舵机转动到 120°,对应换算:120/0.24 = 500,所以ID为1舵机角度范围为96°至 144°,将ID为1舵机的角度范围设置为400至600,点击“设置”即可。

图16 舵机1角度范围设置

    ID为2舵机角度范围为48°至 192°,将ID为2舵机的角度范围设置为200至800,点击“设置”即可。

图17 舵机2角度范围设置

    在复合机器人头部舵机安装如图所示,上方舵机ID为1,下方舵机ID为2

图18 复合机器人舵机安装示意图

2.5上位机控制舵机

    设置好舵机ID和角度范围后,将舵机1和2串联起来,并进入通用界面。由于设置好了舵机1的角度范围在400- 600,舵机2的角度范围在200- 800,拖动舵机1和2的滑块,舵机1和2在预定的角度范围转动。

图19 舵机通用模式

三、ROS控制舵机

3.1通过ROS的Message控制舵机运动

通过ROS控制舵机代码如下:

#include 
#include 
#include 
#include 
#include 
#include 
 
serial::Serial ros_ser;
#define	sBUFFERSIZE	10//send buffer size 串口发送缓存长度
unsigned char s_buffer[sBUFFERSIZE];//发送缓存
//舵机转动控制回调函数
void callback_servoMove(const dual_arm_msgs::Servo_Move& msg){
    //  cmd_to_serial(msg);
    //  cmd_servo_move(msg.servo_id,msg.angle);
    memset(s_buffer,0,sizeof(s_buffer));
     s_buffer[0]=0x55;
}
//读取舵机角度位置值回调函数
void callback_servoGetAngle(const dual_arm_msgs::Servo_GetAngle& msg){
    //  cmd_to_serial(msg);
    //  cmd_servo_move(msg.servo_id,msg.angle);
    memset(s_buffer,0,sizeof(s_buffer));
     s_buffer[0]=0x55;
     s_buffer[1]=0x55;
     s_buffer[2]=0x04;
     s_buffer[3]=0x15;
     s_buffer[4]=0x01;
     s_buffer[5]=msg.servo_id;  //舵机ID
    //  data_to_serial(s_buffer, 10);
    ros_ser.write(s_buffer, 6);
    ROS_INFO_STREAM("Get Servo Angle");
 }
int main (int argc, char** argv){
     ros::init(argc, argv, "my_serial_node");
     ros::NodeHandle n;
     //订阅控制舵机转动主题
     ros::Subscriber sub_servo_move = n.subscribe("/servo_control/move", 1000, callback_servoMove);
     //订阅获取舵机角度位置的主题
     ros::Subscriber sub_servo_getAngle = n.subscribe("/servo_control/get_angle", 1000, callback_servoGetAngle);
     //发布主题:舵机状态
      ros::Publisher pub_servo_state = n.advertise("/servo_state", 1000);
     try
     {
         ros_ser.setPort("/dev/duoji");
         ros_ser.setBaudrate(9600);
         serial::Timeout to = serial::Timeout::simpleTimeout(1000);
         ros_ser.setTimeout(to);
         ros_ser.open();
     }
     catch (serial::IOException& e)
     {
         ROS_ERROR_STREAM("Unable to open port ");
         return -1;
     }
     if(ros_ser.isOpen()){
         ROS_INFO_STREAM("Serial Port opened");
     }else{
         return -1;
  }
     ros::Rate loop_rate(10);
     while(ros::ok()){
         ros::spinOnce();
 
        //获取缓冲区内的字节数
        size_t n = ros_ser.available();
        if(n!=0)
        {
            uint8_t buffer[1024];
            //读出数据
            n = ros_ser.read(buffer, n);
            ROS_INFO_STREAM("Reading from serial port");
for(int i=0; i<n; i++)="" <="" pre="">
            {
                //16进制的方式打印到屏幕
                std::cout << std::hex << (buffer[i] & 0xff) << " ";
            }
            std::cout << std::endl;
        }
        //  if(ros_ser.available()){
        //      ROS_INFO_STREAM("Reading from serial port");
        //      std_msgs::String serial_data;
        //      //获取串口数据
        //      serial_data.data = ros_ser.read(ros_ser.available());
        //      ROS_INFO_STREAM("Read: " << serial_data.data);
        //      //将串口数据发布到主题sensor
        //     //  pub_servo_state.publish(serial_data);
        //  }
         loop_rate.sleep();
     }
     ros_ser.close();

编写好代码以后,首先打开一个终端,开启roscore,再开启一个终端,运行rosrun servo_control servo_controller

图20 rosrun指令

    此时,我们可以通过rostopic list查询到话题,可以查看到get_angle和move话题。

图21 rostopic list指令

    然后,我们可以发布get_angle话题获取舵机1的当前角度。开启一个终端,运行rostopic pub -1 /servo_control/get_angle dual_arm_msgs/Servo_GetAngle “servo_id: 1

图22 查询舵机1当前角度

    输入指令rostopic pub -1 /servo_control/get_angle dual_arm_msgs/Servo_GetAngle “servo_id: 2”,可查询到舵机2的当前角度。

图23 查询舵机2当前角度
    输入指令rostopic pub -1 /servo_control/move dual_arm_msgs/Servo_Move “servo_id: 1”,angle输入500,舵机1便可转动到500。舵机2同理。
图24 发布舵机运动话题
运行结果如下:
图25 运行结果
</n;>

附件下载

0 条评论

关于作者

Ron

这家伙很懒,什么也没写!

选择发帖板块
选择发帖板块