ROS2手写接收IMU数据(Imu)代码并发布

目录

  • 前言
  • 接收IMU数据
    • IMU的串口连接
      • 问题
    • python接收串口数据
  • python解析数据
  • ROS2发布IMU数据
  • 可视化IMU数据
  • 效果

前言

在前面测试完了单独用激光雷达建图之后,一直想把IMU的数据融合进去,由于经费的限制,忍痛在淘宝上买了一款便宜的IMU—GY95T,如下图所示
在这里插入图片描述

东西买回来了,但是还需要写一个读取数据的代码,商家并没有提供在ROS2上用python接收数据,并且将其转换为ROS2的数据格式的代码,于是自己只能手搓一遍。
读取IMU数据的代码倒是不难,但是要怎么将其转换为ROS2的数据格式是我之前完全没接触到的,把整个流程记录一下,便于回忆。

环境

ROS2 humble
Ubuntu22.04
IMU:GY-95T

我将整个流程分成了以下步骤

串口接收IMU数据
解析IMU数据
ROS2发布IMU数据
利用rviz2可视化检查

接收IMU数据

流程如下 ,利用python打开串口,然后接收数据即可。具体的过程后面一步步写出

IMU的串口连接

首先通过USB将IMU连接到电脑上。用lsusb查看连接到Ubuntu上面的USB设备有哪些,我用的虚拟机测试,所以有一些虚拟机的设备

lsusb
# 返回以下信息Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 038: ID 1a86:7523 QinHeng Electronics CH340 serial converter
Bus 002 Device 029: ID 0e0f:0008 VMware, Inc. Virtual Bluetooth Adapter
Bus 002 Device 003: ID 0e0f:0002 VMware, Inc. Virtual USB Hub
Bus 002 Device 002: ID 0e0f:0003 VMware, Inc. Virtual Mouse
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

可以看到有一个叫QinHeng Electronics CH340 serial converter的CH340设备,这就是IMU的串口连接设备了,再通过ls指令查看其被映射为了什么端口

ls /dev/ttyUSB*# 返回
/dev/ttyUSB0

即这里的USB设备被映射为了/dev/ttyUSB0这个文件,后面还会用得上

问题

我在中途遇到了这么一个问题
能够找到USB设备,但是没有被映射为/dev/ttyUSB0的问题

我首先查看了是否存在ch340的驱动

lsmod | grep ch34# 返回
ch341                  24576  0
usbserial              57344  1 ch341

说明我的虚拟机是存在串口驱动的,但是没有找到设备,那通过这篇博客,我发现了是端口被占用了

Ubuntu22.04没有ttyUSB(无法访问 ‘/dev/ttyUSB‘: 没有那个文件或目录)问题解决

文中所说的方法如下:
sudo dmesg | grep brltty

若出现[ 7033.078452] usb 1-13: usbfs: interface 0 claimed by ch341 while 'brltty' sets config #1 则说明驱动被占用

使用sudo apt remove brltty后,重新插拔设备即可

问题探究到底,这个brltty卸载后会不会对以后使用有影响呢?用chatgpt搜索这个软件后,给出的解释如下:

在Ubuntu中,Brltty 是一个用于盲人和视力受损人士的文本转换工具。它提供了一个用于显示在Braille终端上的用户界面,这些终端通常由触觉读取器件(如盲文显示器)或语音合成器(如屏幕阅读器)使用。
Brltty 可以将文本数据转换成 Braille 码,通过串口或并口将其发送到 Braille 终端。它支持多种不同类型的 Braille 终端,包括常见的 VarioUltra、BrailleNote 和 Focus 14/40。
除了将文本数据转换为 Braille 码之外,Brltty 还提供了一些其他的辅助功能,如语音反馈、支持多国语言、自动检测插入/拔出设备等。

因此对于非盲人和视力受损人士用处不大,因此卸载后无影响

注意:由于串口是具有权限的,为了确保在后续运行python代码的时候具有程序启动串口的权限,我们这里把端口的权限进行更改

sudo chmod 777 /dev/ttyUSB0 

python接收串口数据

在Ubuntu连接了串口之后,我们就可以使用python来读取IMU的数据了

这里用到了python的serial库

sudo apt install python3-serial

为确保读取IMU数据的准确性,我们用python读取串口的方法是,在一个周期下,收取该周期内所有信息,每隔time,将数据返回一次

因此,我们需要按照如下设置我们的串口

# 串口初始化
IMU_Usart = serial.Serial(port = '/dev/ttyUSB0',      # 串口baudrate=115200,            # 波特率timeout = 0.001             # 由于后续使用read按照一个timeout周期时间读取数据# imu在波特率115200返回数据时间大概是1ms,9600下大概是10ms# 所以读取时间设置0.001s)
# ----读取IMU的内部数据-----------------------------------
try:count = IMU_Usart.inWaiting()if count > 0:# 接收数据至缓存区Read_buffer=self.IMU_Usart.read(40)         # 我们需要读取的是40个寄存器数据,即40个字节
except KeyboardInterrupt:if serial != None:print("close serial port")self.IMU_Usart.close()#--------------------------------------------------------

其中.inWaiting()函数的作用如下:

用于检查串口缓冲区中等待读取的字节数。
在串口通信中,发送方发送的数据可能需要一定时间才能到达接收方。因此,接收方需要先将接收到的数据存储在缓冲区中,等待读取。.inWaiting() 方法可以用于检查当前串口缓冲区中等待读取的字节数,以便读取相应数量的字节。

我用流程图表述一下代码的读取原理

初始化串口
是否达到一个周期时间
根据真实数据长度读取数据
继续等待

python解析数据

在接收到了IMU传过来的数据之后,我们就需要对其数据进行解析了。

解析这个部分,没有特别多要说的,我是根据卖家给出的数据手册,按照状态机的方式接收并检查数据是否准确。这里把状态机的代码贴出来

def Read_data(self):'''Author: Liu Yuxiang Time: 2022.12.13description: 读取IMU数据'''# 初始化数据counter = 0 Recv_flag = 0Read_buffer = []# 接收数据至缓存区Read_buffer=self.IMU_Usart.read(40)         # 我们需要读取的是40个寄存器数据,即40个字节# 状态机判断收包数据是否准确while(1):# 第1帧是否是帧头ID 0xA4if (counter == 0):if(Read_buffer[0] != 0xA4):break    # 第2帧是否是读功能码 0x03  elif (counter == 1):if(Read_buffer[1] != 0x03):counter=0break# 第3帧判断起始帧        elif (counter == 2):if(Read_buffer[2] < 0x2c):start_reg=Read_buffer[2]else:counter=0 # 第4帧判断帧有多少数量 elif (counter == 3):if((start_reg+Read_buffer[3]) < 0x2C): # 最大寄存器为2C 大于0x2C说明数据肯定错了len=Read_buffer[3]else:counter=0break                  else:if(len+5==counter):#print('Recv done!')Recv_flag=1# 收包完毕if(Recv_flag):Recv_flag = 0sum = 0#print(Read_buffer)                                 # Read_buffer中的是byte数据字节流,用struct包解包data_inspect = str(binascii.b2a_hex(Read_buffer))   # data是将数据转化为原本的按照16进制的数据try:        # 如果接收数据无误,则执行数据解算操作for i in range(2,80,2):                 # 根据手册,检验所有帧之和低八位是否等于末尾帧sum += int(data_inspect[i:i+2],16)if (str(hex(sum))[-2:] == data_inspect[80:82]): # 如果数据检验没有问题,则进入解包过程#print('the Rev data is right')# 数据低八位在前,高八位在后#print(Read_buffer[4:-1])                       unpack_data = struct.unpack('<hhhhhhhhhBhhhhhhhh',Read_buffer[4:-1])# 切片并将其解析为我们所需要的数据,切出我们所需要的数据部分g = 9.8self.ACC_X  = unpack_data[0]/2048 * g       # unit m/s^2self.ACC_Y  = unpack_data[1]/2048 * g    self.ACC_Z  = unpack_data[2]/2048 * gself.GYRO_X = unpack_data[3]/16.4           # unit 度/sself.GYRO_Y = unpack_data[4]/16.4                self.GYRO_Z = unpack_data[5]/16.4                     self.roll   = unpack_data[6]/100                self.pitch  = unpack_data[7]/100                 self.yaw    = unpack_data[8]/100                          self.level  = unpack_data[9]self.temp   = unpack_data[10]/100 self.MAG_X  = unpack_data[11]/1000          # unit Gaos             self.MAG_Y  = unpack_data[12]/1000           self.MAG_Z  = unpack_data[13]/1000self.Q0     = unpack_data[14]/10000        self.Q1     = unpack_data[15]/10000                 self.Q2     = unpack_data[16]/10000                 self.Q3     = unpack_data[17]/10000#print(self.__dict__) except:print("Have Error in receiving data!!")counter=0               breakelse:counter += 1                        # 遍历整个接收数据的buffer

ROS2发布IMU数据

在跑通了整个读取数据的流程,并与卖家给的上位机返回的数据对比没问题之后,下一步就是需要将数据转换为ROS2的数据格式,并将其发布出来,ROS2中IMU的数据格式类型如下

std_msgs/Header header      # 时间戳和坐标系ID
geometry_msgs/Quaternion orientation # 四元数形式的方向
float64[9] orientation_covariance # 方向估计的协方差矩阵
geometry_msgs/Vector3 angular_velocity # 三维角速度
float64[9] angular_velocity_covariance # 角速度估计的协方差矩阵
geometry_msgs/Vector3 linear_acceleration # 三维线性加速度
float64[9] linear_acceleration_covariance # 线性加速度估计的协方差矩阵
  • header:标准的ROS消息头,包含测量的时间戳和坐标系。
    • 时间戳没有单位,坐标系ID是字符串类型;
  • orientation:以四元数形式表示的IMU传感器的方向,以 geometry_msgs/Quaternion 消息表示。四元数表示从IMU坐标系到由header指定的参考坐标系的旋转。四元数应该被归一化。
    • 四元数表示的方向没有单位;
  • orientation_covariance:一个包含9个元素的数组,表示方向估计的协方差矩阵。矩阵以行优先顺序存储。协方差值应以(x、y、z、x-y、x-z、y-z)的顺序表示。
    • 协方差矩阵是无单位的;
  • angular_velocity:以IMU坐标系表示的IMU传感器的角速度,以 geometry_msgs/Vector3 消息表示。
    • 角速度以弧度/秒(rad/s)为单位;
  • angular_velocity_covariance:一个包含9个元素的数组,表示角速度估计的协方差矩阵。矩阵以行优先顺序存储。协方差值应以(x、y、z、x-y、x-z、y-z)的顺序表示。
    • 角速度估计的协方差矩阵是以 (rad/s)^2 为单位的;
  • linear_acceleration:以IMU坐标系表示的IMU传感器的线性加速度,以 geometry_msgs/Vector3 消息表示。
    • 线性加速度以米/秒²(m/s²)为单位;
  • linear_acceleration_covariance:一个包含9个元素的数组,表示线性加速度估计的协方差矩阵。矩阵以行优先顺序存储。协方差值应以(x、y、z、x-y、x-z、y-z)的顺序表示。
    • 线性加速度估计的协方差矩阵是以 (m/s²)^2 为单位的。

这个IMU是可以直接传回四元数,因此我可以直接进行传参,而不需要再进行四元数转换

注意,这里需要用到ROS2的serial库,但是由于在ROS2 humble中并没有此库,因此,我们需要去下载这个库的源码,并手动安装,安装的教程参考我之前的这篇博客,地址如下:

ROS2安装serial库

这里把完整的代码贴出来

import rclpy                                     # ROS2 Python Client Library
from rclpy.node import Node                      # ROS2 Node
from sensor_msgs.msg import Imu# Usart Library
import serial
import struct
import binascii'''Author: Liu Yuxiang Time: 2022.12.13description: IMU底层串口收发代码
'''# imu接收数据类型
class IMU(Node):send_data = []def __init__(self):super().__init__('imu_publisher')self.publisher_ = self.create_publisher(Imu, 'imu_data', 1)# 串口初始化self.IMU_Usart = serial.Serial(port = '/dev/ttyUSB0',      # 串口baudrate=115200,            # 波特率timeout = 0.001             # 由于后续使用read_all按照一个timeout周期时间读取数据# imu在波特率115200返回数据时间大概是1ms,9600下大概是10ms# 所以读取时间设置0.001s)# 接收数据初始化self.ACC_X:float = 0.0                   # X轴加速度self.ACC_Y:float = 0.0                   # Y轴加速度self.ACC_Z:float  =  0.0                 # Z轴加速度self.GYRO_X :float = 0.0                 # X轴陀螺仪self.GYRO_Y :float = 0.0                 # Y轴陀螺仪self.GYRO_Z :float = 0.0                 # Z轴陀螺仪self.roll :float = 0.0                   # 横滚角    self.pitch :float = 0.0                  # 俯仰角self.yaw :float = 0.0                    # 航向角self.leve :float = 0.0                   # 磁场校准精度self.temp :float = 0.0                   # 器件温度self.MAG_X :float = 0.0                  # 磁场X轴self.MAG_Y :float = 0.0                  # 磁场Y轴self.MAG_Z :float = 0.0                  # 磁场Z轴self.Q0 :float = 0.0                     # 四元数Q0.0self.Q1 :float = 0.0                     # 四元数Q1self.Q2 :float = 0.0                     # 四元数Q2self.Q3 :float = 0.0                     # 四元数Q3# 判断串口是否打开成功if self.IMU_Usart.isOpen():print("open success")else:print("open failed")# 回调函数返回周期time_period = 0.001         self.timer = self.create_timer(time_period, self.timer_callback)# 发送读取指令self.Send_ReadCommand()def Send_ReadCommand(self):'''Author: Liu Yuxiang Time: 2022.12.13description: 发送读取IMU内部数据指令· 第一个寄存器0x08 最后一个读取寄存器0x2A 共35个· 读寄存器例子,读取模块内部温度,主站发送帧为:A4 03 1B 02 C4|   A4    |    03    |    1B   |     02    |    C4|  帧头ID  | 读功能码 |起始寄存器| 寄存器数量 |校验和低 8 位'''# 使用优雅的方式发送串口数据send_data = [0xA4,0x03,0x08,0x23,0xD2]                      #需要发送的串口包#send_data = [0xA4,0x03,0x08,0x1B,0xCA]                      #需要发送的串口包send_data=struct.pack("%dB"%(len(send_data)),*send_data)    #解析成16进制print(send_data)self.IMU_Usart.write(send_data)                             #发送def Read_data(self):'''Author: Liu Yuxiang Time: 2022.12.13description: 读取IMU数据'''# 初始化数据counter = 0 Recv_flag = 0Read_buffer = []# 接收数据至缓存区Read_buffer=self.IMU_Usart.read(40)         # 我们需要读取的是40个寄存器数据,即40个字节# 状态机判断收包数据是否准确while(1):# 第1帧是否是帧头ID 0xA4if (counter == 0):if(Read_buffer[0] != 0xA4):break    # 第2帧是否是读功能码 0x03  elif (counter == 1):if(Read_buffer[1] != 0x03):counter=0break# 第3帧判断起始帧        elif (counter == 2):if(Read_buffer[2] < 0x2c):start_reg=Read_buffer[2]else:counter=0 # 第4帧判断帧有多少数量 elif (counter == 3):if((start_reg+Read_buffer[3]) < 0x2C): # 最大寄存器为2C 大于0x2C说明数据肯定错了len=Read_buffer[3]else:counter=0break                  else:if(len+5==counter):#print('Recv done!')Recv_flag=1# 收包完毕if(Recv_flag):Recv_flag = 0sum = 0#print(Read_buffer)                                 # Read_buffer中的是byte数据字节流,用struct包解包data_inspect = str(binascii.b2a_hex(Read_buffer))   # data是将数据转化为原本的按照16进制的数据try:        # 如果接收数据无误,则执行数据解算操作for i in range(2,80,2):                 # 根据手册,检验所有帧之和低八位是否等于末尾帧sum += int(data_inspect[i:i+2],16)if (str(hex(sum))[-2:] == data_inspect[80:82]): # 如果数据检验没有问题,则进入解包过程#print('the Rev data is right')# 数据低八位在前,高八位在后#print(Read_buffer[4:-1])                       unpack_data = struct.unpack('<hhhhhhhhhBhhhhhhhh',Read_buffer[4:-1])# 切片并将其解析为我们所需要的数据,切出我们所需要的数据部分g = 9.8self.ACC_X  = unpack_data[0]/2048 * g       # unit m/s^2self.ACC_Y  = unpack_data[1]/2048 * g    self.ACC_Z  = unpack_data[2]/2048 * gself.GYRO_X = unpack_data[3]/16.4           # unit 度/sself.GYRO_Y = unpack_data[4]/16.4                self.GYRO_Z = unpack_data[5]/16.4                     self.roll   = unpack_data[6]/100                self.pitch  = unpack_data[7]/100                 self.yaw    = unpack_data[8]/100                          self.level  = unpack_data[9]self.temp   = unpack_data[10]/100 self.MAG_X  = unpack_data[11]/1000          # unit Gaos             self.MAG_Y  = unpack_data[12]/1000           self.MAG_Z  = unpack_data[13]/1000self.Q0     = unpack_data[14]/10000        self.Q1     = unpack_data[15]/10000                 self.Q2     = unpack_data[16]/10000                 self.Q3     = unpack_data[17]/10000#print(self.__dict__) except:print("Have Error in receiving data!!")counter=0               breakelse:counter += 1                        # 遍历整个接收数据的bufferdef timer_callback(self):# ----读取IMU的内部数据-----------------------------------try:count = self.IMU_Usart.inWaiting()if count > 0:self.Read_data()# 发布sensor_msgs/Imu 数据类型imu_data = Imu()imu_data.header.frame_id = "map"imu_data.header.stamp = self.get_clock().now().to_msg()imu_data.linear_acceleration.x = self.ACC_Ximu_data.linear_acceleration.y = self.ACC_Yimu_data.linear_acceleration.z = self.ACC_Zimu_data.angular_velocity.x = self.GYRO_X * 3.1415926 / 180.0  # unit transfer to rad/simu_data.angular_velocity.y = self.GYRO_Y * 3.1415926 / 180.0imu_data.angular_velocity.z = self.GYRO_Z * 3.1415926 / 180.0imu_data.orientation.x = self.Q0imu_data.orientation.y = self.Q1imu_data.orientation.z = self.Q2imu_data.orientation.w = self.Q3self.publisher_.publish(imu_data)             # 发布imu的数据# --------------------------------------------------------#print('读取中')except KeyboardInterrupt:if serial != None:print("close serial port")self.IMU_Usart.close()#--------------------------------------------------------def main(args=None):# 变量初始化---------------------------------------------    rclpy.init(args=args)IMU_node = IMU()rclpy.spin(IMU_node)rclpy.shutdown()if __name__ == '__main__':main()'''
░░░░░░░░░░░░░░░░░░░░░░░░▄░░
░░░░░░░░░▐█░░░░░░░░░░░▄▀▒▌░
░░░░░░░░▐▀▒█░░░░░░░░▄▀▒▒▒▐░
░░░░░▄▄▀▒░▒▒▒▒▒▒▒▒▒█▒▒▄█▒▐░
░░░▄▀▒▒▒░░░▒▒▒░░░▒▒▒▀██▀▒▌░
░░▐▒▒▒▄▄▒▒▒▒░░░▒▒▒▒▒▒▒▀▄▒▒░
░░▌░░▌█▀▒▒▒▒▒▄▀█▄▒▒▒▒▒▒▒█▒▐
░▐░░░▒▒▒▒▒▒▒▒▌██▀▒▒░░░▒▒▒▀▄
░▌░▒▄██▄▒▒▒▒▒▒▒▒▒░░░░░░▒▒▒▒
▀▒▀▐████▌▄░▀▒▒░░░░░░░░░░▒▒▒
狗狗保佑代码无bug!
'''

其实最关键的部分就是对其进行一个赋值并发布出去即可。

可视化IMU数据

当我们有了数据之后,我们希望对其进行可视化,这样能够非常直观的看到我们的数据,并且符不符合ROS2的数据格式,因此,我们接下来用rviz2来可视化

首先,需要安装IMU的可视化工具,imu-tools

sudo apt install ros-humble-imu-tools

注意:如果你的ROS2的不是humble版本,就将其改为你自己的版本即可

安装完毕后,运行节点,并开启rviz2,点击add,在By topic中添加Imu就可以可视化IMU数据啦

效果

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

借助#chatGPT#编写分割图片并加空白拼接代码

想编写程序实现下面图片的这种效果&#xff0c;找了半天没有找到想要的&#xff0c;于是借助chatGPT获得代码并修改&#xff0c;得到以下代码。 from PIL import Image import numpy as np# 打开图片文件 image Image.open(test1.jpg) #208*48# 获取图片尺寸 width, heigh…

ChatGPT学习企业产品、服务内容、往期方案,处理所输入的客户需求,定制化生成解决方案

【ChatGPT】前些天发现了一个巨牛的人工智能学习电子书&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;无广告&#xff0c;忍不住分享一下给大家。&#xff08;点击查看学习资料&#xff09; 该场景对应的关键词库&#xff08;6个&#xff09;&#xff1a; 企业产品和服…

chatgpt赋能python:Python聊天记录分析

Python聊天记录分析 聊天记录是人们日常生活中的重要组成部分&#xff0c;通过对聊天记录进行分析&#xff0c;我们可以了解到人们的话题、兴趣爱好、社交圈子等信息。Python作为一门强大的编程语言&#xff0c;可以帮助我们实现聊天记录的自动分析。 安装所需库 分析聊天记…

【chatGPT】chatGPT初步体验,赶快来学习吧

目录 1、什么是ChatGPT 2、我可以相信人工智能告诉我真相吗&#xff1f; 3、你会使用我的对话进行培训吗&#xff1f; 4、ChatGPT 接口参考 认证 请求组织 5、ChatGPT初体验 1、什么是ChatGPT ChatGPT的研究预览是免费使用的。 ChatGPT 是从 GPT-3.5 微调而来的&#x…

chatgpt赋能python:Python循环等待:什么是它?如何解决?

Python 循环等待&#xff1a;什么是它&#xff1f;如何解决&#xff1f; 在 Python 编程中&#xff0c;循环等待是一种常见的问题。它发生在代码一直等待某个操作的结果&#xff0c;而这个结果却永远不会到来。这种情况会导致程序停顿或挂起&#xff0c;从而影响整个应用程序。…

OpenAI 推出用于下一代对话式 AI 开发的 ChatGPT 和 Whisper API

人工智能已经成为技术行业的推动力&#xff0c;使机器能够学习和执行以前被认为是人类独有的任务。领先的 AI 研究机构 OpenAI 一直走在这场革命的最前沿&#xff0c;开发可以处理自然语言并生成类似人类文本的强大模型。其中一个模型是 ChatGPT API&#xff0c;它可以对文本输…

乌合之众再次上演,打工人将被AI一键淘汰?

ChatGPT&#xff0c;是一场以硅谷为圆心&#xff0c;辐射至全球的人工智能竞赛&#xff0c;人们关于人工智能的担忧与思考从未停歇。一起来看看这篇文章&#xff0c;了解一下——大浪来袭&#xff0c;要怎么做才能保证自己不会溺水&#xff1f; 上个月底&#xff0c;千余名科技…

AI数字人定制热潮来袭,虚拟数字人引领企业数字化服务新趋势

2023年伊始&#xff0c;AIGC 强势爆发、类 ChatGPT 语言大模型横空出世&#xff0c;掀起了人工智能热潮。ChatGPT的强势崛起&#xff0c;也推动着同样火爆出圈的元宇宙驶入发展快车道。作为一个人工智能领域超大的语言模型&#xff0c;ChatGPT目前主要应用在交互式对话的领域中…

2022年度十大AI技术盘点:AIGC风暴来袭,自动驾驶后会无期?

“科学不能告诉我们应该做什么&#xff0c;只能告诉我们能做什么。” ——让-保罗萨特《存在与虚无》 这一年&#xff0c;AI又有哪些前沿技术突破呢&#xff1f;通过汇总梳理2022年10大AI技术&#xff0c;AI科技大本营发现&#xff0c;这些突破主要集中在图像、视频和语音语义领…

算网时代新思考,2023 移动云大会重磅来袭!

4 月 20 日&#xff0c;中国移动发起微博话题 #算力网络如何助力数字中国建设#并重磅预告“云擎未来 智信天下”2023移动云大会即将启幕。“为什么大家如此关注算力网络的发展”&#xff0c;今天我们就着这个话题聊起。 算力作为发展数字经济的关键支撑&#xff0c;正改变我们…

超炫酷项目来袭!DragGAN 火爆开源社区!

你在 Github 上见过一个空仓库在短短几天内就斩获 10K star 的项目吗&#xff1f; 今天树先生给大家介绍一款超炫酷的项目——DragGAN&#xff0c;来一起看看它为何如此火爆。 DragGAN 是什么&#xff1f; 不同于之前大火的 Stable Diffusion 与 Midjourney 使用的扩散模型&a…

Hotel booking酒店预订——数据分析与建模

Hotel booking酒店预订——数据分析与建模&#xff1a;https://zhuanlan.zhihu.com/p/196757364?utm_sourcewechat_session 写文章 Hotel booking酒店预订——数据分析与建模&#xff08;转载翻译自kaggle&#xff09; 海上泊舟 数据分析师 数据源&#xff1a; https://www.sc…

Android开发酒店预定预约管理系统

基于Android平台开发的名宿酒店管理系统 现代酒店组织日益庞大&#xff0c;服务项目多、信息量大已经成为酒店行业的一大特点。想要提高工作效率、提高服务质量、降低成本就必须借助现代计算机技术实现高效率的管理模式。作为一个现代化的酒店&#xff0c;要想在激烈的竞争中夺…

基于android的酒店客房预订客户端app

随着社会的脚步的加快&#xff0c;人们的生活节奏也变得越来越快&#xff0c;在这同一时代中盛行的产品便是手机&#xff0c;各种高端的手机的出现&#xff0c;为人们的生活增添了很大的乐趣&#xff0c;也为人们的日常生活带来了相当大的便利。各种在手机上出现的应用被大家所…

国内酒店预定接口

酒店预订&#xff0c;在线订房&#xff0c;酒店信息查询 一、接口介绍 通过用户输入的关键词对特定及周边酒店信息进行查询&#xff0c;获取酒店门头照片、地址、房价、入住时间等酒店信息&#xff0c;同时提供创建、取消、支付订单并输出订单详情信息等服务。广泛应用于在线订…

【转载】用 ChatGPT+LangChain 部署到服务器,打造专属 GPT知识库

原文链接&#xff1a;https://www.bilibili.com/read/cv23216734 本地部署 安装 python&#xff0c;小白自己去找安装教程 pip install llama-index&#xff0c;安装 llama-index 库 pip install langchain&#xff0c;安装 langchain 库 pip install gradio&#xff0c;安…

音视频技术开发周刊 | 283

每周一期&#xff0c;纵览音视频技术领域的干货。 新闻投稿&#xff1a;contributelivevideostack.com。 基于隐扩散模型的高分辨率图像合成 本文提出的隐扩散模型(LDM)在图像修补和类条件图像合成方面具有一定优势&#xff0c;并且在各种任务(包括文本到图像合成、无条件图像生…

智能摩尔定律?Sam Altman被Marcus怼了;再也不用学Excel了?自愿降薪 40% 的库克,要被“踢出”董事会?...

本周AI业界又有哪些新鲜事&#xff1f; ChatGPT 肯尼亚工人为ChatGPT标注数据&#xff0c;2美元/小时 作为近年来AI领域的爆炸技术&#xff0c;ChatGPT热度一直不减。然而&#xff0c;就和视频数据需要标注一样&#xff0c;ChatGPT在构建内容过滤器时也需要进行数据标注。这些数…

OpenAI 的外包数据标注员,时薪不足2美元,称工作是“精神创伤”

这是「进击的Coder」的第 810 篇技术分享 译者&#xff1a;核子可乐 策划&#xff1a;李冬梅 来源&#xff1a;infoQ “ 阅读本文大概需要 3 分钟。 ” ChatGPT 被视为近几年最具创新性的 AI 工具之一。这款强大的 AI 聊天机器人几乎可以生成任何问题的文本&#xff0c;从莎士…

ChatGPT用transformer算法在训练么

transformer算法是什么 Transformer 算法是一种用于序列处理的神经网络架构&#xff0c;首次在 2017 年的论文 "Attention is All You Need" 中提出。 它的主要特点是使用了注意力机制&#xff0c;能够自动学习到序列中重要的信息&#xff0c;并在计算时给予更多的…