cpp-http 库的使用

2023-05-16

文章目录

    • 前言
    • `cpp-http` 库简介
    • `cpp-http` 库使用介绍
      • http 客户端搭建步骤
      • http 服务端搭建步骤
    • `cpp-http` 库示例
      • 服务端实现
      • 客户端实现
    • 示例下载
    • 关于示例代码编译出错的问题
  • 参考资料

前言

最近在做的一个项目需要使用到 HTTP 协议,在网上查了很久,也结合了之前学长做的项目,发现 cpp-http 库使用挺多的,所以就边学边做笔记,顺便分享出来(我觉得知识之所以叫知识,就是因为它能被记录并能被传播,为人所知,为人所识)。

我准备把这个学习记录做成一个系列文章,这个系列里面,我会介绍从 HTTP 协议诞生到目前的一些大概情况,然后会简单介绍一下目前 C/C++ 下面用的比较广泛的 HTTP 库,之后就是讲解 cpp-http 库的简单使用、 cpp-http 库的实现,最后如果时间允许的话可以自己手码一个 C 语言的 http 用来作总结。

反正 flag 在这里先立下了,这篇文章是这个系列的第一篇,但是并不是按顺序来的第一篇,这里讲的是 cpp-http 库的简单使用,按顺序来看的话应该是系列里面的第三篇或者第二篇。如果大家目前对 HTTP 协议基础知识有需求的话还请移步其他博主的文章,之后我也会陆续把各个模块补上(下一篇可能是 cpp-http 库的实现部分),敬请大家期待。

另:本人目前是大学生,新人一枚,文章之中难免会有纰漏,还请大家多多包涵,不吝赐教。

cpp-http 库简介

  1. cpp-http 库是什么?
    cpp-http 由是一位国外程序员 yhirose 在 github 上面开源的一个 C++ 项目,同时这个项目得到了世界各地程序员的支持,目前包括原作者在内共有 104 位贡献者,拥有 5.7k Star 和 1.2k Fork,是目前使用较为广泛的一个 C++ http库之一。

  2. cpp-http 项目地址
    https://github.com/yhirose/cpp-httplib
    如果网络不好不能访问 github 的话,这里是国内一位程序员搬运到 gitee 上面的项目,内容都是一样的:
    https://gitee.com/zhangkt1995/cpp-httplib?_from=gitee_search

  3. 关于它的简介,这里引用原作者的话:

    A C++11 single-file header-only cross platform HTTP/HTTPS library.

    It’s extremely easy to setup. Just include the httplib.h file in your code!

    NOTE: This is a multi-threaded ‘blocking’ HTTP library. If you are looking for a ‘non-blocking’ library, this is not the one that you want.

    翻译过来就是:

    一个只有头文件的跨平台 HTTP/HTTPS 库。

    简单易用,只需要包含头文件 httplib,h 即可。

    注意:这个库是一个多线程阻塞式 Http 库,如果您需要的是一个非阻塞式的库,这个库并不适合您。

cpp-http 库使用介绍

网上大多数教程都只介绍了使用 cpp-http 库的 GET 请求使用,没有 POST 请求的(其实两者使用一模一样),在这里我也加上了 POST 请求的部分。

http 客户端搭建步骤

  1. 组织http协议格式的请求数据
  2. 搭建tcp客户端
  3. 发送组织好的http请求数据
  4. 等待服务端响应,接收响应数据
  5. 对响应数据的解析

http 服务端搭建步骤

  1. 搭建tcp服务端
  2. 等待接收客户端发送的数据
  3. 按照 http 协议格式,对数据进行解析(格式按照: 请求方法 URL 协议版本\r\n 头部\r\n 正文)
  4. 根据请求的资源路径以及查询字符串以及正文,进行业务处理
  5. 组织http协议格式的响应,返回给客户端(协议版本 状态码 描述\r\n 头部)

cpp-http 库示例

这里我们先用个 demo 来看看 cpp-http 库怎么使用:

首先先建立工程,目录如下:

▶ tree ../http -L 1 
../http
├── client.cpp	# 在这里编辑客户端的代码
├── httplib.h	# 这是 cpp-http 库的头文件,server和client都需要包含它
└── server.cpp # 在这里编辑服务端的代码

0 directories, 5 files

其中 httplib.h 就是 cpp-http 库的所有内容了,就是这一个头文件;server.cpp 是我们自己的服务端程序, client.cpp 是我们自己的客户端程序。

服务端实现

  1. 代码。相关的解释都在注释里面
#include <iostream>
#include "httplib.h"

using Request = httplib::Request;
using Response = httplib::Response;
using Server = httplib::Server;
using Params = httplib::Params;

// get 请求中对 "/go" 的处理
void get_go(const Request& req, Response& res)
{
    // 设置 "/go" 请求返回的内容
    res.set_content("<html><h1>I'm the king of the world!</h1></html>", "text/html");

    std::cout << "Received a request of get [go]." << std::endl;
}

int main(int argc, char const *argv[])
{
    // 搭建服务端
    Server srv;

    // 这里注册用于处理 get 请求的函数,当收到对应的get请求时,程序会执行对应的函数
    srv.Get("/go", get_go); // 可能相比 lambda 表达式,刚从 C 语言转过来的同学更熟悉这种形式,这个get调用方式也更简介易懂

    // 这里注册的处理函数是 C++ 的 lambda 表达式,直接看成传入了一个指针就行了
    srv.Get("/hi", [&](const Request& req, Response& res){
        // 设置 get "hi" 请求返回的内容
        res.set_content("<html><h1>Hello world!</h1></html>", "text/html");

        std::cout << "Received a request of get [hi]." << std::endl;
    });
    
    srv.Get("/link", [&](const Request& req, Response& res){
        res.set_content("<html><h1 href=https://baike.baidu.com/item/%E8%A5%BF%E5%8D%8E%E5%A4%A7%E5%AD%A6%E6%9C%BA%E5%99%A8%E4%BA%BA%E8%B6%B3%E7%90%83%E5%8D%8F%E4%BC%9A/22274030>soccer robot</h1></html>", "text/html");

        std::cout << "Received a request of get [link]." << std::endl;
    });

    // POST 请求处理
    srv.Post("/get_info", [&](const Request& req, Response& res) {
        res.set_content("<html><h1>Go ahead!</h1></html>", "text/html");

        std::cout << "Received a request of POST [get_info]." << std::endl;
    });

    // 绑定端口,启动监听
    srv.listen("0.0.0.0", 12345);
    
    return 0;
}

这里大家可能有三个疑问:

  • Server::Get()Server::Post() 注册函数的实现机制,收到请到 GET 请求后是怎么执行对应函数的
  • 使用 Server::listen() 启动端口的实现机制
  • lambda 表达式

其中前两点我会在后面解释,关于lambda表达式的部分可能之后会出相应的文章来介绍,在此之前还请各位移步其他关于 lambda 的文章进行学习。

  1. 编译
    cpp-http 库编译时需要使用线程库 pthread
    编译时使用 g++ 直接编译,使用 gcc 编译会报错(毕竟 gcc 是为 C 设计的)

编译时使用命令:

g++ ./server.cpp -lpthread -o sever.out
  1. 执行
    执行服务端程序:
./server.out
  1. 验证服务端:
  • 可以通过 curl 来查看服务端返回的数据
# 示例如下
$ curl http://ip:port/source 
# 这里的 ip 是服务端运行所在电脑的ip,可以通过 `ip -a` 来查看
# port 就是我们在服务端里面指定监听的端口
# source 是通过 http 请求的资源,在这里就是 /hi /link /go 那三个。

在这里插入图片描述
最后一行 使用 curl http://0.0.0.0:12345/get_info 时没有返回,并且服务器端也没有接收到数据,说明 curl 直接发送 /get_info 并不能用于提交 POST 请求,怎么使用 curl 提交 POST 请求等我之后有时间了再看看。

curl http://0.0.0.0:12345/hi  # 这里是请求 /link 资源需要的命令
	<html><h1>Hello world!</h1></html>% # 这里是服务器回应的数据curl http://0.0.0.0:12345/link
	<html><h1 href=https://baike.baidu.com/item/%E8%A5%BF%E5%8D%8E%E5%A4%A7%E5%AD%A6%E6%9C%BA%E5%99%A8%E4%BA%BA%E8%B6%B3%E7%90%83%E5%8D%8F%E4%BC%9A/22274030>soccer robot</h1></html>%

	▶ curl http://0.0.0.0:12345/go
	<html><h1>I'm the king of the world!</h1></html>%
  
  ▶ curl http://0.0.0.0:12345/get_info
  • 也可以通过浏览器来查看数据:

通过在浏览器地址栏输入相应的地址来验证 http 服务端,直接在浏览器地址栏填入链接就好了:
例如我在浏览器输入如下地址

http://http://0.0.0.0:12345/hi

结果如图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2HlVbtJ5-1632225570442)(:/7d334fd2bb5546a6ae90e6e14f0938a5)]

  • 如果一切正常的话,服务端的输出是这样:

▶ ./server.out
Received a request of get [link].
Received a request of get [link].
Received a request of get [hi].
Received a request of get [link].
Received a request of get [link].
Received a request of get [go].
Received a request of get [hi].

客户端实现

  1. 代码
#include <iostream>
#include <string>
#include "httplib.h"

using Client = httplib::Client;
using string = std::string;

int main(int argc, char const *argv[])
{
    if (argc < 3) {
        std::cout << "Please input server ip and port" << std::endl;

        return 0;
    }

    string source; // 用于存储资源名称

    // 创建客户端
    // argv[1] 是从命令行传入的 ip
    // argv[2] 是从命令行传入的 port
    Client cli(argv[1], atoi(argv[2]));

    // 这里是一个死循环,用于选择需要读取的资源
    while (true) {
        std::cout << "Please input the source you want" 
                  << "(Or use <CTRL + C> to exit):" 
                  << std::endl;

        // 从命令行获取下一步需要获取的资源名称
        std::getline(std::cin, source, '\n');
        // std::cout << source << std::endl;

        // GET、POST 请求的返回值
        std::shared_ptr<httplib::Response> res;

        if (source == "/get_info") {
            // POST 请求
            res = cli.Post(source.c_str()); 
        } else {
            // GET 请求
            res = cli.Get(source.c_str());
        }
        
        if (res) {
            if (res->status == 200) { // 获取对应资源成功,输出获取到的信息
                std::cout << "Recved response from server: \n\r"
                          << res->body 
                          << "\n\r" << std::endl;
            } else{ // 获取资源失败,输出 http 状态码
                std::cout << "Request error: " << res->status 
                          << "\n\r" << std::endl;
            }
        } else { // 发送失败(多半是配置问题)
            std::cout << "Request GET failed.\n\r" << std::endl;
        }

        sleep(1); // 线程休眠
    }
    
    return 0;
}
  1. 编译
  • 编译命令和 编译 server.cpp 是一样的,不过参数要改成 client.cpp
g++ ./client.cpp -lpthread -o client.out
  • 编译完成后的目录:
▶ tree -L 1 ../http 
../http
├── client.cpp
├── client.out
├── httplib.h
├── server
├── server.cpp
└── server.out

0 directories, 6 files
  1. 执行
  • 执行服务端和客户端程序:
./server.out
  • 执行客户端程序:
▶ ./client.out 0.0.0.0 12345
Please input the source you want(Or use <CTRL + Z> to exit):
/go
Recved response from server: 
<html><h1>I'm the king of the world!</h1></html>

Please input the source you want(Or use <CTRL + Z> to exit):
/link
Recved response from server: 
<html><h1 href=https://baike.baidu.com/item/%E8%A5%BF%E5%8D%8E%E5%A4%A7%E5%AD%A6%E6%9C%BA%E5%99%A8%E4%BA%BA%E8%B6%B3%E7%90%83%E5%8D%8F%E4%BC%9A/22274030>soccer robot</h1></html>

Please input the source you want(Or use <CTRL + Z> to exit):
/hi
Recved response from server: 
<html><h1>Hello world!</h1></html>

Please input the source you want(Or use <CTRL + Z> to exit):
  • 程序执行结果:
    在这里插入图片描述

示例下载

链接: https://pan.baidu.com/s/1Y6VNUK8OJtE6GKBUBCXcDQ?pwd=wgpq
提取码: wgpq

如果大家有兴趣也可以点这个下载链接支持一下😏:
https://download.csdn.net/download/qq_43586061/24036994

关于示例代码编译出错的问题

之前评论区里面有提到下载的代码编译出错。这是因为个人在代码编辑的时候犯了错误,导致编译不能通过。
已经在百度云重新长传了修改后的代码,csdn上的代码还在审核中。

出错的代码原文见下:

static void PrintInfo(const string& str);

void PrintInfo(string &str)
{
    std::cout << "Recved response from server: \n\r"
              << str << std::endl;
}

更正后的代码:

static void PrintInfo(const string& str);

void PrintInfo(const string &str)
{
    std::cout << "Recved response from server: \n\r"
              << str << std::endl;
}

这里是因为 PrintInfo 函数定义和声明不一致(参数少了 const 限定),导致编译器在链接的时候找不到 PrintInfo(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) 这个函数:

▶ ./build.sh 
./client.cpp:24:13: 警告:‘void PrintInfo(const string&)’使用过但从未定义
   24 | static void PrintInfo(const string& str);
      |             ^~~~~~~~~
/usr/bin/ld: /tmp/cc88ge4U.o: in function `main':
client.cpp:(.text+0x238): undefined reference to `PrintInfo(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
/usr/bin/ld: client.cpp:(.text+0x3a1): undefined reference to `PrintInfo(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
collect2: 错误:ld 返回 1

参考资料

  1. 如何用chrome浏览器发送POST请求:https://www.hm1006.cn/archives/chromepost
  2. 【项目】cpp-httplib库的原理:https://blog.csdn.net/weixin_43939593/article/details/104263043
  3. 推荐一个比较好用的c++版本http协议库-cpp-httplib:https://blog.csdn.net/wuquan_1230/article/details/117690607
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

cpp-http 库的使用 的相关文章

  • Qt编译器MinGW和MSVC的区别

    一 两者的区别 1 MSVC 即Microsoft Visual C Compiler 即微软自己的编译器 我们下载Windows下的OpenCV时 解压后里面有两个文件夹 一个是build 一个是source build这个文件夹实际上是
  • Visual Studio快捷键(超全)

    目录 常用 xff1a 一 文件相关 二 编辑搜索相关 三 导航视图相关 四 项目相关 五 生成相关 六 调试相关 七 调试相关 八 分析相关 九 工具相关 十 扩展相关 十一 窗口相关 十二 帮助相关 常用 xff1a ctrl 43 x
  • 【软件使用】MarkText下载安装与汉化设置 (markdown快捷键收藏)

    一 安装与汉化 对版本没要求的可以直接选择 3 免安装的汉化包 1 下载安装MarkText MaxText win64 https github com marktext marktext releases download v0 17
  • 嵌入式【协议篇】CAN协议原理

    nbsp 一 CAN协议介绍 1 简介 CAN是控制器局域网络 Controller Area Network CAN 的简称 是一种能够实现分布式实时控制的串行通信网络 其实可以简单把CAN通信理解成开一场电话会议 当一个人讲话时其他人就
  • 曲阜师范大学831学姐高分背诵笔记(完整版)

    导论部分 1 微格教学 18 名词解释 答 微格教学称为 微型教学 xff0c 也称为 小型教学 所谓 微格教学 xff0c 就是将复杂的教学过程分解成许多容易掌握的具体的单一的技能 xff0c 如 导读技能 34 讲授技能 提问技能 等
  • STM32 【FreeRTOS HAL库】创建任务

    任务也不是很复杂的东西 简单得说 创建一个任务 你得提供它的执行函数 你得提供它的栈的大小 函数的执行空间 函数的优先级等重要的条件 因为任务在运行中 任务函数有调用关系 有局部变量 这些都保存在任务的栈里面 任务有可能被切换 有可能被暂停
  • 函数实现是否应该放在头文件

  • Microsoft Visual Studio C++2022 Windows 11 SDK环境

    Microsoft Visual Studio C 43 43 2022 Windows 11 SDK环境 1 安装2 环境变量本文为作者 难拳 原创 xff0c 转载请注明出处 1 安装 Visual Studio 2022适用于Wind
  • 【原创】浅谈指针(十)链表的写法

    Python微信订餐小程序课程视频 https edu csdn net course detail 36074 Python实战量化交易理财系统 https edu csdn net course detail 35475 前言 最近我又
  • AB实现双方通信

    题目要求 xff1a 通过C语言编写一个程序 xff0c 程序中需要有两个进程 xff0c 假设这两个进程是A和B xff0c 通过这两个进程模拟一个类似QQ聊天的情景 xff0c A进程和B进程分别代表通话一方 xff0c A进程能够发消
  • 串口传图显示

    串口传图 使用串口通信协议传输一张图像到SDRAM存储后VGA协议显示到屏幕 工程设计 图片生成 使用小梅哥资源中的Picture2Hex软件生成任意分辨率的图片 xff08 我这里选择640 480 xff09 matlab将得到合适分辨
  • Intel Realsense L515 ros节点时间戳不同步解决方法

    问题描述 在使用Intel Realsense L515的ros程序的时候 xff0c 会出现 frame 39 s span class token function time span domain is HARDWARE CLOCK
  • 宏定义(无参宏定义和带参宏定义)

    宏定义是比较常用的预处理指令 xff0c 即使用 标识符 来表示 替换列表 中的内容 标识符称为宏名 xff0c 在预处理过程中 xff0c 预处理器会把源程序中所有宏名 xff0c 替换成宏定义中替换列表中的内容 常见的宏定义有两种 xf
  • B6(B6AC)充电器中文简要说明书

    B6 xff08 B6AC xff09 充电器中文简要说明书 首先 xff0c 感谢模友们使用深圳比优德的B6充电器 深圳比优德动力产品技术有限公司致力于为全国模友提供最高性价比的动力产品 xff0c 公司所有产品均自主研发与自主生产 ww
  • c++STL库详细用法

    目录 1 什么是STL xff1f 2 STL内容介绍 2 1 容器 2 2 STL迭代器 2 3 算法 2 4 仿函数 2 4 1 概述 2 4 2 仿函数 functor 在编程语言中的应用 2 4 3 仿函数在STL中的定义 2 5
  • C语言之结构体对齐

    本次让我们来一起学习一下C语言中我们该如何将结构体内存对齐呢 xff1f 什么是结构体 xff1f span class token keyword struct span span class token class name A spa
  • STM32串口中断接收

    本次是结合项目 xff0c 来总结下在stm32CubeIDE开发环境下关于串口接收数据问题 xff1b 项目背景 xff1a 利用MODBUS通讯协议 串口中断的流程为 xff1a 1 在main c文件中对串口进行初始化操作 MX US
  • ORB-SLAM 学习笔记

    ORB SLAM 基本介绍 ORB SLAM 是西班牙 Zaragoza 大学的 Ra l Mur Arta 编写的视觉 SLAM 系统 它是一个完整的 SLAM 系统 xff0c 包括视觉里程计 跟踪 回环检测 xff0c 是一种完全基于
  • OCR(Optical Character Recognition,光学字符识别)问题

    应用场景 xff1a 在这个过程中由于场景的不确定性 xff0c 比如 xff1a 图片背景极其丰富 亮度不均衡 光照不均衡 残缺遮挡 文字扭曲 字体多样等等问题 xff0c 会带来极大的挑战 自然场景中文本具有多样性 xff1a 文本检测
  • OCR-文本检测方法

    基于回归的文本检测 基于回归文本检测方法和目标检测算法的方法相似 xff0c 文本检测方法只有两个类别 xff0c 图像中的文本视为待检测的目标 xff0c 其余部分视为背景 水平文本检测 早期基于深度学习的文本检测算法是从目标检测的方法改

随机推荐

  • C++中使用__FUNCTION__ ,__TIME__ ,__LINE__ ,__FILE__这几个宏的解释

    FUNCTION xff0c 34 TIME 34 xff0c LINE xff0c FILE 这几个宏是编译器自带的 xff0c 不是那个头文件定义的 FUNCION xff1a 函数名 TIME xff1a 文件运行的时间 LINE x
  • UART串口通信协议详解

    UART xff1a 通信异步收发器 xff0c 串行 异步通信总线 xff0c 两条数据线 xff08 收发 xff09 xff0c 全双工 xff08 可以同时接收和发送 xff09 一 UART帧格式 xff08 UART协议 xff
  • 基于FPGA的DDS信号发生器

    之前的博客讲到了DDS的基本原理 xff0c 现在用Verilog代码实现DDS 能够产生四种波形 xff0c 方波 xff0c 三角波 xff0c 正弦波 xff0c 锯齿波 xff0c 用按键来控制频率和选择波形 其中按键消抖模块来自小
  • C++的命名空间详解

    c 43 43 命名空间详解 命名空间的意义命名空间的定义命名空间的使用 命名空间的意义 在C C 43 43 中 xff0c 变量 函数和后面要学到的类都是大量存在的 xff0c 这些变量 函数和类的名称将都存在于全局作用域中 xff0c
  • 基于Verilog的32位并行进位加法器设计

    1 功能概述 xff1a 先行进位加法器是对普通的全加器进行改良而设计成的并行加法器 xff0c 主要是针对普通全加器串联时互相进位产生的延迟进行了改良 超前进位加法器是通过增加了一个不是十分复杂的逻辑电路来做到这点的 设二进制加法器第i位
  • 基于verilog的处理器设计之寄存器堆

    该寄存器堆是CPU中多个寄存器组成的阵列 xff0c 由32个32位的寄存器构成 xff0c 两个读数据口 Ra gt BusA Rb gt BusB 一个写数据口 Rw gt BusW 写数据受使能信号Wen控制 xff0c 在时钟的下降
  • 使用结构体方式访问寄存器的实践

    朱老师单片机课程学习记录 span class token macro property span class token directive keyword ifndef span GPIO H span span class token
  • MIM,MOM和MOS电容的区别

    ic layout经常会遇到这三种电容 xff1a MOS xff0c MOM xff0c MIM MOS 电容 xff1a 两端结构的mos管 xff0c 电容值不精确 xff0c 可以实现随控制电压变化而变 化的容值 xff0c 上下极
  • 折叠共源共栅放大器Cadence仿真

    仿真原理图如下 xff0c 图中M4的宽长比应该和M5一样 xff0c 为4u 150n m nf为1 2 M8和M9的宽长比为4u 500n 完整的电路图如下 xff1a cascode晶体管的L给小一点 xff0c 电流镜晶体管L给大一
  • 二级运放的Cadence仿真

    基于之前做的折叠共源共栅cascode xff0c 在后面加两个管子 xff0c 变成一个简单的二级运放 二级运放的通带内的增益大于80dB xff0c GBW为大于50M xff0c 相位裕度大于60 为了保证运放的相位裕度 xff0c
  • 射频接收机的参数计算

  • 户外系统原理方框图

  • bandgap中简并点理解与仿真

    综合EETOP论坛上的解答以及自己的仿真 xff0c 一般来说一个电路有可能存在一个以上满足KCL KVL电路方程的解 工作点 这些解中有的是稳定解 有的可能是非稳定解 其区别在于 如果电路目前工作在稳定解 当出现扰动时 比如实际电路中的噪
  • GPS卫星定位基本原理

    GPS定位基本原理 GPS测量定位方法分类 定位模式 xff1a 绝对定位 xff08 单点定位 xff09 相对定位 差分定位 定位时接收机天线的运动状态 xff1a 静态定位 xff0d 天线相对于地固坐标系静止 动态定位 xff0d
  • c++缺省参数,函数重载详解

    c 43 43 缺省参数 xff0c 函数重载详解 缺省参数什么是缺省参数 xff1f 缺省参数的分类 1 全缺省参数 2 半缺省参数 规则 xff1a 缺省参数只能从右往左 xff0c 依次给出 xff08 这是规定 xff09 函数重载
  • 和小白一起学数据结构三之c与结构及联合

    和小白一起学数据结构 xff08 三 xff09 今天博主动笔有些晚了哈 xff0c 所以不讲太多废话了 xff0c 直接上干货 xff01 今天我们来复习c语言提供的两种聚合数据类型 xff08 aggregate data type 数
  • 持之以恒(一)位姿转换:姿态 / 四元数 / 旋转矩阵 / 欧拉角 及 位姿矩阵

    文章目录 1 简介1 1 位姿的几种表示形式1 2 姿态转换在线工具 2 位姿转换接口2 1 旋转向量 转 四元数2 2 四元数 转 旋转向量2 3 四元数 与 旋转矩阵 3 机器人相关应用3 1 不同厂家协作机器人的位姿表示形式 1 简介
  • 基于MSP432P401R的MPU6050陀螺仪串口输出姿态角程序

    基于MSP432P401R的MPU6050陀螺仪串口输出姿态角程序 目录 基于MSP432P401R的MPU6050陀螺仪串口输出姿态角程序 前言 一 实验器材 二 硬件资源 1 usb转ttl 2 串口1 波特率 9600 P2 2 P2
  • 一个程序从开始运行到结束的完整过程

    目录 预编译编译汇编链接 我们平时不管是在 Windows 下的编译器直接点击执行一个代码 xff0c 还是在 Linux 下通过 gcc g 43 43 生成可执行文件并执行 xff0c 都会直接出来代码的运行结果 但实际上它还细分为以下
  • cpp-http 库的使用

    文章目录 前言 96 cpp http 96 库简介 96 cpp http 96 库使用介绍http 客户端搭建步骤http 服务端搭建步骤 96 cpp http 96 库示例服务端实现客户端实现 示例下载关于示例代码编译出错的问题 参