17自由度人形机器人实现行走功能

news2024/10/6 6:46:20

1. 功能说明

     本文示例将实现R307样机17自由度人形机器人行走的功能。该项目利用探索者平台制作,其驱动系统采用伺服电机。

2. 仿人形机器人结构设计

     人型机器人是一种旨在模仿人类外观和行为的机器人(robot),尤其特指具有和人类相似肌体的种类。常见一个包含完整四肢和头部运动的机器人需要17个自由度,每条腿有5个自由度;两条手臂共6个自由度,每条手臂3个自由度;头部1个自由度,全部一共17个自由度。

     串联人形机构:串联人形仿生机器人是由多个 舵机关节模组 组合而成的,类似于多个串联机械臂组装而成。

3. 仿人形机器人运动算法

      人形机器人行走主要依靠腿部的运动,同时可以通过甩臂等动作调整平衡姿态,所以人形机器人的步态规划主要看腿部各关节的协调,下面给大家列一个10自由度人形双足机器人的前进步态:

      这里为了方便分析,将双足简化成如下图所示,其中每条腿包含一个两自由度的髋关节,共两个自由度A和B,A左右摆动、B为前后摆动;一个自由度的膝关节C,为前后摆动;两个自由度的踝关节D和E,D为前后摆动、E为左右摆动。

      正面图:第一步通过左右倾斜让左腿脱离地面,注意保持上半身的水平。调整A/A1、E/E1:

      侧面图:第二步左腿抬起,右腿回到初始位置。调整B、C、D:

      侧面图:第三步右腿向前弯曲,使身体前倾,让左脚落地,为下一步右腿迈步做准备:

      正面图:第四步通过左右倾斜让左腿脱离地面,注意保持上半身的水平。调整A/A1、E/E1(注意这一步之前左脚落地后绷直):

      侧面图:第五步右腿抬起,左腿回到初始位置。调整B1、C1、D1:

      侧面图:第六步左腿向前弯曲,使身体前倾,让右脚脚落地,为下一步左腿迈步做准备:

      提示:在上面的步态描述中所画的图都以每一步最全面的角度为准,所以大家不要在意视图,注意步态。

4. 电子硬件

本实验中采用了以下硬件:

主控板

Basra主控板(兼容Arduino Uno)

扩展板

Bigfish2.1扩展板

SH-ST步进电机扩展板
电池7.4V锂电池

电路连接:

1~17号舵机接线如下:

D1、D2、D3、D4、D7、D8、D9、D18、D19、D20、D21、D23、D24、D25、D26、D27、D5

5. 功能实现

上位机:Controller 1.0

下位机编程环境:Arduino 1.8.19

5.1示例程序

下面提供一个17自由度人形机器人行走前进的参考例程(_17servo_human.ino),将参考例程下载到主控板中:

/*------------------------------------------------------------------------------------

  版权说明:Copyright 2023 Robottime(Beijing) Technology Co., Ltd. All Rights Reserved.

           Distributed under MIT license.See file LICENSE for detail or copy at

           https://opensource.org/licenses/MIT

           by 机器谱 2023-04-14 https://www.robotway.com/

  ------------------------------*/

#include <Arduino.h>        //要用到的函数库

#include <avr/pgmspace.h>

#include "Config.h"

#include <Tlc5940.h>

#include <tlc_servos.h>

/* 此程序包含四个动作组,如有需要可自行添加,需修改处有注释,按注释修改

*

* act_num:定义动作组数量

* frequency:定义舵机转动频率

* servo_num:定义舵机数量

* servo_speed:定义舵机速度,单位毫秒

* action_delay:定义动作组每行动作执行的动作间隔,单位微秒

* actChangeDelay:定义不同动作组执行时的切换时间间隔,单位毫秒

*/

#define act_num 6

#define frequency 10

#define servo_num 17

#define servo_speed 4

#define action_delay 10

#define actChangeDelay 1000


/*

* 动作组定义,可自行添加动作组,名称可修改,此处为 4 个动作组

*/

#define action_move 0

#define action_left 1

#define action_right 2

#define action_back 3

#define action_dance 4

#define action_init 5


/*

* servo_pin:定义舵机引脚,按顺序从小到大定义,引脚号应从 1 开始

* actPwmNum:定义动作组数组的长度

*/

int servo_pin[servo_num] = {1, 2, 3, 4, 5, 7, 8, 9, 18, 19, 20, 21, 23, 24, 25, 26, 27};

int actPwmNum[act_num] = {};


//中间数组

float value_pre[servo_num] = {};

float value_cur[servo_num] = {};

int count_input = 0;

boolean _b = false;


/**************+++++++++++动作组数组,请将转换后的动作组数据粘贴到相应的动作组中+++++++***************************/

//这个动作组没有添加动作,可以自己添加机器人动作

const PROGMEM int actionInit[] = {

};


//actionMove[]该动作组包括了机器人的一些简单的动作,包括转头、下蹲、踮脚、左右摇晃、骑马舞、扎马步等动作。

const PROGMEM int actionMove[] = {

1411,2300,1522,1344,1522,544,1433,1456,1456,1433,1078,1500,1500,1367,1767,1367,1411,

1411,2300,1522,1344,1522,544,1433,1456,1456,1433,1078,1500,1500,1367,1767,1367,1411,

1411,2300,1522,1344,1522,544,1433,1456,1322,1433,1078,1500,1456,1367,1767,1367,1411,

1411,2300,1522,1344,1522,544,1433,1456,1456,1433,1078,1500,1500,1367,1767,1367,1411,

922,1856,1522,1344,1522,1833,767,1456,1322,1433,1078,1500,1456,1367,1767,1367,1411,

1411,2300,1522,1344,1522,544,1433,1456,1456,1433,1078,1500,1500,1367,1767,1367,1411,

1411,2300,1522,1344,1522,522,1411,1456,1544,1439,1078,1500,1656,1367,1767,1367,1411,

1411,2300,1522,1344,1522,544,1433,1456,1456,1433,1078,1500,1500,1367,1767,1367,1411,

2056,900,1522,1344,1522,1011,1878,1456,1544,1439,1078,1500,1656,1367,1767,1367,1411,

1411,2300,1522,1344,1522,544,1411,1456,1456,1439,1078,1500,1500,1367,1767,1367,1411,

656,2100,1522,1344,1522,633,1922,1456,1456,1439,1078,1500,1500,1367,1767,1367,1411,

1411,1989,856,1344,1522,633,1922,1456,1367,1439,1078,1500,1500,1367,1767,1367,1411,

656,2100,1522,1344,1522,633,1922,1456,1456,1439,1078,1500,1500,1367,1767,1367,1411,

656,2100,1522,1344,2078,767,1389,1456,1478,1439,1078,1500,1656,1367,1767,1367,1411,

656,2100,1522,1344,1522,633,1922,1456,1456,1439,1078,1500,1500,1367,1767,1367,1411,

1411,2300,1522,1344,1522,544,1433,1456,1456,1433,1078,1500,1500,1367,1767,1367,1411,

1411,2300,1522,1344,1522,544,1433,1456,1456,1433,1078,1500,1500,1367,1767,1367,1411,

1411,2300,1522,1344,1522,544,1433,1456,1322,1433,1078,1500,1456,1367,1767,1367,1411,

1411,2300,1522,1344,1522,544,1433,1456,1456,1433,1078,1500,1500,1367,1767,1367,1411,

922,1856,1522,1344,1522,1833,767,1456,1322,1433,1078,1500,1456,1367,1767,1367,1411,

1411,2300,1522,1344,1522,544,1433,1456,1456,1433,1078,1500,1500,1367,1767,1367,1411,

1411,2300,1522,1344,1522,522,1411,1456,1544,1439,1078,1500,1656,1367,1767,1367,1411,

1411,2300,1522,1344,1522,544,1433,1456,1456,1433,1078,1500,1500,1367,1767,1367,1411,

2056,900,1522,1344,1522,1011,1878,1456,1544,1439,1078,1500,1656,1367,1767,1367,1411,

1411,2300,1522,1344,1522,544,1411,1456,1456,1439,1078,1500,1500,1367,1767,1367,1411,

656,2100,1522,1344,1522,633,1922,1456,1456,1439,1078,1500,1500,1367,1767,1367,1411,

1411,1989,856,1344,1522,633,1922,1456,1367,1439,1078,1500,1500,1367,1767,1367,1411,

656,2100,1522,1344,1522,633,1922,1456,1456,1439,1078,1500,1500,1367,1767,1367,1411,

656,2100,1522,1344,2078,767,1389,1456,1478,1439,1078,1500,1656,1367,1767,1367,1411,

656,2100,1522,1344,1522,633,1922,1456,1456,1439,1078,1500,1500,1367,1767,1367,1411,

1411,2300,1522,1344,1522,523,1322,1456,1456,1433,1078,1500,1500,1367,1767,1367,1411,

1411,2300,1522,1344,1522,523,1322,1456,1456,1433,1078,1500,1500,1367,1767,1367,1411,

1411,2300,1522,1344,1522,523,1322,1500,1589,1452,1078,1500,1688,1367,1767,1367,1411,

1411,2300,1967,1344,1944,523,1322,1500,1589,1452,1078,1500,1567,1367,1678,1233,1411,

1411,2300,1700,1344,1700,523,1322,1456,1456,1452,1078,1500,1544,1367,1678,1233,1411,

1411,2300,1522,1344,1522,523,1322,1433,1144,1452,1078,1500,1389,1367,1678,1233,1353,

1411,2300,967,1344,967,523,1322,1390,1456,1452,1144,1633,1389,1389,1767,1367,1353,

1411,2300,1322,1344,1344,523,1322,1456,1483,1433,1144,1633,1500,1389,1767,1367,1411,

1411,2300,1522,1344,1522,523,1322,1485,1601,1433,1144,1633,1678,1389,1767,1367,1435,

1411,2300,2122,1344,1967,523,1322,1493,1601,1433,1078,1500,1589,1418,1589,1078,1435,

1411,2300,1767,1344,1700,523,1322,1456,1456,1433,1078,1500,1478,1415,1589,1078,1436,

1411,2300,1522,1344,1522,523,1322,1455,1313,1433,1078,1500,1389,1388,1589,1065,1402,

1411,2300,922,1344,856,523,1322,1455,1389,1433,1161,1656,1389,1389,1767,1376,1402,

1411,2300,1344,1344,1278,523,1322,1456,1456,1433,1161,1656,1500,1389,1767,1376,1411,

};


//这个动作组没有添加动作,可以自己添加机器人动作

const PROGMEM int actionLeft[] = {

};


//这个动作组没有添加动作,可以自己添加机器人动作

const PROGMEM int actionRight[] = {

};


//这个动作组没有添加动作,可以自己添加机器人动作

const PROGMEM int actionBack[] = {

};


//actionDance[]该动作组是机器人的行走步态动作组

const PROGMEM int actionDance[] = {

1411,2300,1344,1344,1278,523,1322,1456,1456,1433,1161,1656,1500,1389,1767,1376,1411,

1411,2300,1522,1344,1522,523,1322,1485,1601,1433,1144,1633,1678,1389,1767,1367,1435,

1411,2300,2122,1344,1967,523,1322,1493,1601,1433,1078,1500,1589,1418,1589,1078,1435,

1411,2300,1767,1344,1700,523,1322,1456,1456,1433,1078,1500,1478,1415,1589,1078,1436,

1411,2300,1522,1344,1522,523,1322,1455,1313,1433,1078,1500,1389,1388,1589,1065,1402,

1411,2300,922,1344,856,523,1322,1455,1389,1433,1161,1656,1389,1389,1767,1376,1402,

1411,2300,1344,1344,1278,523,1322,1456,1456,1433,1161,1656,1500,1389,1767,1376,1411,

};


/**************************+++++---------分割线--------++++++*******************************************************/


//动作组数组长度获取函数,增加动作组时需要按如下格式添加:actPwmNum[增加的动作组序号] = sizeof(增加的动作组名称) / sizeof(增加的动作组名称[0]);

void act_length()

{

  actPwmNum[0] = (sizeof(actionMove) / sizeof(actionMove[0]))/servo_num;

  actPwmNum[1] = (sizeof(actionLeft) / sizeof(actionLeft[0]))/servo_num;

  actPwmNum[2] = (sizeof(actionRight) / sizeof(actionRight[0]))/servo_num;

  actPwmNum[3] = (sizeof(actionBack) / sizeof(actionBack[0]))/servo_num;

  actPwmNum[4] = (sizeof(actionDance) / sizeof(actionDance[0]))/servo_num;

  actPwmNum[5] = (sizeof(actionInit) / sizeof(actionInit[0]))/servo_num;


  for(int i=0;i<act_num;i++)

  {

    Serial.println(actPwmNum[i]);   //打印出每个动作组中各有多少个动作(也就是打印出每个动作组中有几行动作)

  }

  delay(2000);


}


//map映射函数

long map_servo(long x, long in_min, long in_max, long out_min, long out_max)

{

  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;

}


//PWM 转换为舵机角度的函数,增加动作组时需要修改

void vlaue2angle(int p, int act)

{

  switch(act)

  {

    case 0:   value_cur[p] = map_servo(pgm_read_word_near(actionMove + p + servo_num * count_input), 500, 2500, 0, 180);   break;

    case 1:   value_cur[p] = map_servo(pgm_read_word_near(actionLeft + p + servo_num * count_input), 500, 2500, 0, 180);   break;

    case 2:   value_cur[p] = map_servo(pgm_read_word_near(actionRight + p + servo_num * count_input), 500, 2500, 0, 180);   break;

    case 3:   value_cur[p] = map_servo(pgm_read_word_near(actionBack + p + servo_num * count_input), 500, 2500, 0, 180);   break;

    case 4:   value_cur[p] = map_servo(pgm_read_word_near(actionDance + p + servo_num * count_input), 500, 2500, 0, 180); break;

    case 5:   value_cur[p] = map_servo(pgm_read_word_near(actionInit + p + servo_num * count_input), 500, 2500, 0, 180); break;

    default: break;

  }

}


//舵机初始化函数(初始化舵机动作),动作组第一行为舵机初始化值

void servo_init(int act, int num)

{   

  if(!_b)

  {

    for(int i=0;i<servo_num;i++)

    {

      vlaue2angle(i, act);

      tlc_setServo(servo_pin[i], value_cur[i]);

      value_pre[i] = value_cur[i];

    }

    Tlc.update();

  }  

  num == 1 ? _b = true : _b = false;

}


//舵机移动函数,参数: act:动作组宏定义名称 ;num:动作组执行的次数,num > 0 ;

void servo_move(int act, int num)

{  

  float value_delta[servo_num] = {};

  float in_value[servo_num] = {};

 

  servo_init(act, num);

 

  for(int i=0;i< num * actPwmNum[act];i++)

  {

    count_input++;

   

    if(count_input == actPwmNum[act])

    {

      count_input = 0;

      continue;

    }

   

    for(int i=0;i<servo_num;i++)

    {

      vlaue2angle(i, act);

      in_value[i] = value_pre[i];

      value_delta[i] = (value_cur[i] - value_pre[i]) / frequency;

    }

   

    for(int i=0;i<frequency;i++)

    {

      for(int k=0;k<servo_num;k++)

      {

        in_value[k] += value_delta[k];  

        value_pre[k] = in_value[k];

      }     

      for(int j=0;j<servo_num;j++)

      {       

        tlc_setServo(servo_pin[j], in_value[j]);

        delay(servo_speed);

      }

      Tlc.update();

    }

  }

}

/********************************************************-------分割线--------****************************************************/

//初始化函数

void setup() {

  Serial.begin(9600);     //开启串口通信,波特率9600

  Tlc.init(0);

  tlc_initServos();

  act_length();  

  delay(action_delay);

}


//主函数

void loop()

{

    servo_move(action_move, 1);   //执行action_move动作组(左右摇,踮脚,扎马步等动作)

    delay(actChangeDelay);

    while(1){

     servo_move(action_dance, 1);   //while(1){...动作...}一直执行括号中的动作(即机器人行走)

      };

}

5.2 调试

       双击打开Controller 1.0.exe。将波特率与串口设置好,同时留下1、2、3、4、5、7、8、9、18、19、20、21、23、24、25、26、27几个舵机串口,调试舵机角度。具体操作步骤可参考 【U002】如何驱动模拟舵机-Controller 1.0b软件的使用

      将几个舵机的角度调试好并记录下来,将调试好的舵机角度写到对应例程(_17servo_human.ino)中的位置;下图所示是角度,大家可尝试自己更改角度值使其动作看起来更流畅。

提示:17自由度人形机器人行走调试并不只是通过程序去调整步态和舵机角度,还涉及到重心的调整,重心可以通过编程调整,也可以通过调整结构实现。

6. 资料内容

①行走-例程源代码

②行走-样机3D文件

③Controller1.0b资料包

资料内容详见:17自由度人形机器人-行走

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/479543.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VS快捷键大全 | 掌握这些快捷键,助你调试快人一步

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

Linux常见指令-1

本期我们开始学习Linux&#xff0c;首先我们来学习Linux的常见指令 目录 操作系统是什么 Linux下基本指令 1.ls指令 2.pwd指令 3.cd指令 4.touch指令 5.mkdir指令 6.rmdir指令 && rm 指令 7.man指令 8.cp指令 9.mv指令 10.cat指令 11.more指令 12.less指…

UE5中实现沿样条线创建网格体

本文是对UE官方教程&#xff1a;https://www.bilibili.com/video/BV1eU4y1c7XL的重现&#xff0c;原教程中通过构造函数实现非运行时执行脚本&#xff0c;并通过UE的样条线组件辅助创建路径网格体。该功能最终实现的效果如下&#xff1a; 1.创建基础蓝图 首先创建一个Actor蓝…

手把手教你 ,带你彻底掌握八大排序算法【数据结构】

文章目录 插入排序直接插入排序希尔排序 选择排序选择排序堆排序升序 交换排序冒泡排序快速排序递归hoare版本挖坑法前后指针版本 三数取中法选key递归到小的子区间时&#xff0c;可以考虑使用插入排序 归并排序递归实现非递归实现 排序算法复杂度以及稳定性 插入排序 直接插入…

计算机操作系统学习-引论

本专栏是对计算机操作系统学习的记录&#xff1a;《现代操作系统 第四版》&#xff0c;电子版的可以在评论区自取。 1 计算机硬件简介 操作系统与运行该操作系统的计算机硬件密切相关。如图1所示&#xff0c;我们可以将自己的计算机抽象为&#xff0c;CUP&#xff0c;内存和I/…

【数学建模】Day01——层次分析法

文章目录 1. 引出层次分析法1.1 思考问题1.2 平台借力1.3 分而治之的思想1.4 一致矩阵1.5 一致性检验1.6 一致矩阵计算权重1.7 判断矩阵求权重 2. 层次分析法2.1 定义2.2 具体步骤2.3 局限性 1. 引出层次分析法 1.1 思考问题 我们评价的目标是什么&#xff1f;我们为了达到这…

C语言:指针详解【进阶】后篇

目录 函数指针函数指针数组指向函数指针数组的指针回调函数 前言&#xff1a; 在C语言&#xff1a;指针详解【进阶】前篇中我们深入学习了字符指针&#xff0c;数组指针&#xff0c;指针数组以及数组传参和指针传参。我们对指针的应用有了较为深刻的认识&#xff0c;今天这里我…

BusterNet网络Python模型实现学习笔记之二

文章目录 一、squeeze函数的用法二、nn.CrossEntropyLoss函数三、isinstance函数四、定义冻结层 freeze_layers五、SummaryWriter 基础用法六、Python 基础语法1.变量嵌入到字符串2. enumerate() 函数3. 进度条库tqdm4. 字典&#xff08;dict&#xff09;展开为关键字参数&…

TAPFixer总结

相关工作 Menshen 检测属性用户写 et al检测属性就简单三个 未来工作&#xff1a; liveness; implicit; 数据集&#xff1b; 抽象方式合并&#xff1b;抽象规则配置&#xff1b;缓解谓词爆炸&#xff1b;concurrency的说明; 代码简化工作&#xff1b;给出能修复的漏洞种类 …

《基于光电容积法和机器学习的冠状动脉疾病患者出血风险预测》阅读笔记

目录 一、论文摘要 二、论文十问 三、论文亮点与不足之处 四、与其他研究的比较 五、实际应用与影响 六、个人思考与启示 参考文献 一、论文摘要 在冠状动脉疾病&#xff08;CAD&#xff09;患者的抗血栓治疗过程中&#xff0c;出血事件是关注的主要焦点。本研究旨在探讨…

浅谈一下布隆过滤器的设计之美

1 缓存穿透 2 原理解析 3 Guava实现 4 Redisson实现 5 实战要点 6 总结 布隆过滤器是一个非常有用的数据结构。它可以在大规模数据中高效地判断某个元素是否存在。布隆过滤器的应用非常广泛&#xff0c;不仅在搜索引擎、防垃圾邮件等领域中经常用到&#xff0c;而且在许多…

R语言单因素方差分析

R中的方差分析 介绍用于比较独立组的不同类型的方差分析&#xff0c;包括&#xff1a; 单因素方差分析&#xff1a;独立样本 t 检验的扩展&#xff0c;用于在存在两个以上组的情况下比较均值。这是方差分析检验的最简单情况&#xff0c;其中数据仅根据一个分组变量&#xff0…

【数据结构】七大排序总结

目录 &#x1f33e;前言 &#x1f33e; 内部排序 &#x1f308;1. 直接插入排序 &#x1f308;2. 希尔排序 &#x1f308;3. 直接选择排序 &#x1f308;4. 堆排序 &#x1f308;5. 归并排序 &#x1f308;6. 冒泡排序 &#x1f308;7. 快速排序 &#x1f33e;外部排序 &…

4 月份 火火火火 的开源项目

盘点 4 月份 GitHub 上 Star 攀升最多的开源项目&#xff0c;整个 4 月份最火项目 90% 都是 AI 项目&#xff08;准确的说&#xff0c;最近半年的热榜都是 AI 项目&#xff09; 本期推荐开源项目目录&#xff1a; 1. AI 生成逼真语音 2. 复旦大模型 MOSS&#xff01; 3. 让画中…

万万没想到在生产环境翻车了,之前以为很熟悉 CountDownLatch

前言 需求背景 具体实现 解决方案 总结 前言 之前我们分享了CountDownLatch的使用。这是一个用来控制并发流程的同步工具&#xff0c;主要作用是为了等待多个线程同时完成任务后&#xff0c;在进行主线程任务。然而&#xff0c;在生产环境中&#xff0c;我们万万没想到会…

【LeetCode】583. 两个字符串的删除操作

583. 两个字符串的删除操作&#xff08;中等&#xff09; 思路 这道题的状态定义和 1143. 最长公共子序列 相同&#xff0c;「定义一个 dp 数组&#xff0c;其中 dp[i]表示到位置 i 为止的子序列性质&#xff0c;并不是必须以 i 结尾」&#xff0c;此时 dp 数组的最后一位即为…

富士康终于醒悟了,重新加码中国制造,印度制造信不过

4月25日富士康在郑州揭牌新事业总部&#xff0c;显示出在扰攘了数年之后&#xff0c;富士康再度加强郑州富士康的发展力度&#xff0c;这应该是富士康在印度努力数年之后终于清醒了&#xff0c;印度制造终究不如中国制造可靠。 一、苹果和富士康在印度发展的教训 这两年苹果和富…

智能算法系列之基于粒子群优化的模拟退火算法

文章目录 前言1. 算法结合思路2. 问题场景2.1 Sphere2.2 Himmelblau2.3 Ackley2.4 函数可视化 3. 算法实现代码仓库&#xff1a;IALib[GitHub] 前言 本篇是智能算法(Python复现)专栏的第四篇文章&#xff0c;主要介绍粒子群优化算法与模拟退火算法的结合&#xff0c;以弥补各自…

【unity项目实战】3DRPG游戏开发07——其他详细的设计

敌人动画设计 新增图层动画,把权重设为1 在新图层默认新建一个空状态Base State,实现怪物默认动画播放Base State,因为Base State是空动画,所以默认会找上一个层的动画,这样就实现了两个图层动画的切换,也可以选择修改权重的方式实现 敌人随机巡逻 显示敌人巡逻的范…

网络字节序和主机字节序详解(附代码)

一、网络字节序和主机字节序 网络字节序和主机字节序是计算机网络中常用的两种数据存储格式。 主机字节序&#xff1a; 指的是在计算机内部存储数据时采用的字节排序方式。对于一个长为4个字节的整数&#xff0c;若采用大端字节序&#xff0c;则该整数在内存中的存储顺序是&a…