ROS进阶:使用URDF和Xacro构建差速轮式机器人模型

前言

本篇文章介绍的是ROS高效进阶内容,使用URDF 语言(xml格式)做一个差速轮式机器人模型,并使用URDF的增强版xacro,对机器人模型文件进行二次优化。

差速轮式机器人:两轮差速底盘由两个动力轮位于底盘左右两侧,两轮独立控制速度,通过给定不同速度实现底盘转向控制。一般会配有一到两个辅助支撑的万向轮。

此次建模,不引入算法,只是把机器人模型的样子做出来,所以只使用 rivz 进行可视化显示。

机器人的定义和构成

  1. 机器人定义:机器人是一种自动化的机器,所不同的是这种机器具备一些与人或生物相似的智能能力,如感知能力、规划能力、动作能力和协同能力,是一种具有高级灵活性的自动化机器。目前,自动驾驶汽车也被认为是一种机器人。

  2. 机器人构成:机器人通常分为四大部分,即执行机构,驱动系统,传感系统和控制系统。以自动驾驶汽车为例,执行机构就是油门,转向和刹车;驱动系统就是电动机;传感系统就是各种传感器:lidar,radar,camera,uss,imu,GNSS;控制系统就是智驾算法系统:感知,定位,规划和控制。

  3. 机器人四大部分的控制回路,大致如图:

URDF建模套路

  1. URDF:Unified Robot Description Format,统一的机器人描述文件格式。urdf 文件使用 xml 格式。

  2. 用 urdf 描述机器人,套路如下:每个机器人都是由多个 link(连杆) 和 joint(关节)组成。这里的 link 和joint 很宽泛,形状不一定是杆和轴。比如桌子,桌面和腿都是link,连接处是固定的 joint。

<?xml version="1.0" ?>
<robot name="name of robot"><link> ... </link><joint> ... </joint>...
</robot>

  1. link:描述机器人某个刚体部分的外观和物理属性。外观包括:尺寸,颜色,形状。物理属性包括:惯性矩阵(inertial matrix)和碰撞参数(collision properties)。在机器人建模中,每个link 都是一个坐标系。下面是差速轮式机器人底盘的建模,底盘一般称为 base。

  <link name="base_link">// visual 标签就是外观<visual>// base_link本身是个坐标系,这也是差速轮式机器人各组成部分的根坐标系,一般会把他的坐标原点设置在rviz的中心处// origin表示底盘在其base_link坐标系下的原始位置和旋转状态// xyz表示底盘质心在base_link坐标系的偏移位置,rpy(roll,pitch,yaw)是底盘绕base_link的x,y,z三个轴的旋转值<origin xyz="0 0 0" rpy="0 0 0"/>// geometry是物体几何外形<geometry>// 这里的底盘,用圆柱体表示,length值为高度,radius是半径值<cylinder length="0.16" radius="0.2"/></geometry>// material是材料,这里指定底盘颜色为红色,rgba是三色+透明度表示法,三色的范围是0~1,而不是0-255<material name="red"><color rgba="1 0 0 1"/></material></visual></link>

这里我们只进行外观建模,因此暂不涉及物理属性配置。

  1. joint:描述两个 link 之间的关系,包括运动学和动力学属性,这里暂时只关注运动学属性。通常情况下,两个 link 的关系一般分为六种:

continuous:旋转关节,可以围绕单轴360度无限旋转,比如轮子的轴

revolute:旋转关节,但是有旋转角度的范围限制,比如钟摆

prismatic:滑动关节,也叫活塞关节,沿某一轴线移动的关节,有位置限制,强调一维,比如打气筒

planar:平面关节,允许在平面正交方向上平移或旋转,强调平面,比如抽屉内外滑动

floating:浮动关节,允许进行平移和旋转运动,比如人体的肩关节

fixed:固定关节,比如桌子腿和桌面

下面是差速轮式机器人主动轮与底盘的 joint 样例:

  // joint标签就是关节,type表示链接关系<joint name="left_wheel_joint" type="continuous">// origin表示轮子在base_link坐标系下的偏移和旋转<origin xyz="0 0.19 -0.05" rpy="0 0 0" />// 根link是底盘,子link是轮子<parent link="base_link" /><child link="left_wheel_link" />// axis描述的轮子相对于其自身坐标系的 y 轴旋转,=<axis xyz="0 1 0" /></joint>// 这是轮子link<link name="left_wheel_link"><visual>// 轮子相当于其x轴,旋转90度,也就是立起来<origin xyz="0 0 0" rpy="1.5707 0 0"/><geometry><cylinder length="0.06" radius="0.06"/></geometry><material name="white"><color rgba="1 1 1 0.9"/></material></visual></link>

使用URDF做一个差速轮式机器人模型

  1. 创建 mbot_description 软件包及相关文件

cd ~/catkin_ws/src
catkin_create_pkg mbot_description urdf xacrocd mbot_description 
mkdir -p config doc launch meshes urdf/sensor
touch launch/display_mbot_urdf.launch launch/display_mbot_xacro.launch
touch urdf/mbot_base.urdf urdf/mbot_base.xacro
touch urdf/sensor/camera.xacro urdf/sensor/kinect.xacro urdf/sensor/laser.xacro
  1. mbot_base.urdf :这是整个mbot建模的文件,包括底盘,两个动力伦,两个万向轮,一个camera,一个kinect(深度相机),一个lidar。

<?xml version="1.0" ?>
<robot name="mbot"><link name="base_link"><visual><origin xyz="0 0 0" rpy="0 0 0"/><geometry><cylinder length="0.16" radius="0.2"/></geometry><material name="red"><color rgba="1 0 0 1"/></material></visual></link><joint name="left_wheel_joint" type="continuous"><origin xyz="0 0.19 -0.05" rpy="0 0 0" /><parent link="base_link" /><child link="left_wheel_link" /><axis xyz="0 1 0" /></joint><link name="left_wheel_link"><visual><origin xyz="0 0 0" rpy="1.5707 0 0"/><geometry><cylinder length="0.06" radius="0.06"/></geometry><material name="white"><color rgba="1 1 1 0.9"/></material></visual></link><joint name="right_wheel_joint" type="continuous"><origin xyz="0 -0.19 -0.05" rpy="0 0 0" /><parent link="base_link" /><child link="right_wheel_link" /><axis xyz="0 1 0" /></joint><link name="right_wheel_link"><visual><origin xyz="0 0 0" rpy="1.5707 0 0"/><geometry><cylinder length="0.025" radius="0.06" /></geometry><material name="white"><color rgba="1 1 1 0.9"/></material></visual></link><joint name="front_caster_joint" type="continuous"><origin xyz="0.18 0 -0.095" rpy="0 0 0" /><parent link="base_link"/><child link="front_caster_link" /><axis xyz="0 1 0" /></joint><link name="front_caster_link"><visual><origin xyz="0 0 0" rpy="0 0 0" /><geometry><sphere radius="0.015" /></geometry><material name="white"><color rgba="1 1 1 0.9"/></material></visual></link><joint name="back_caster_joint" type="continuous"><origin xyz="-0.18 0 -0.095" rpy="0 0 0" /><parent link="base_link"/><child link="back_caster_link" /><axis xyz="0 1 0" /></joint><link name="back_caster_link"><visual><origin xyz="0 0 0" rpy="0 0 0" /><geometry><sphere radius="0.015" /></geometry><material name="white"><color rgba="1 1 1 0.9"/></material></visual></link><joint name="camera_joint" type="fixed"><origin xyz="-0.17 0 0.1" rpy="0 0 0" /><parent link="base_link"/><child link="camera_link" />    </joint><link name="camera_link"><visual><origin xyz="0 0 0" rpy="0 0 0" /><geometry><box size="0.03 0.04 0.04" /></geometry><material name="grey"><color rgba="0.5 0.5 0.5 1"/></material></visual></link><joint name="stage_joint" type="fixed"><origin xyz="0 0 0.14" rpy="0 0 0" /><parent link="base_link"/><child link="stage_link" />    </joint><link name="stage_link"><visual><origin xyz="0 0 0" rpy="0 0 0"/><geometry><cylinder length="0.12" radius="0.1"/></geometry><material name="red"><color rgba="1 0 0 1"/></material></visual></link><joint name="laser_joint" type="fixed"><origin xyz="0 0 0.085" rpy="0 0 0" /><parent link="stage_link"/><child link="laser_link" />    </joint><link name="laser_link"><visual><origin xyz="0 0 0" rpy="0 0 0" /><geometry><cylinder length="0.05" radius="0.05"/></geometry><material name="grey"><color rgba="0.5 0.5 0.5 1"/></material></visual></link><joint name="kinect_joint" type="fixed"><origin xyz="0.15 0 0.11" rpy="0 0 0" /><parent link="base_link"/><child link="kinect_link" />    </joint><link name="kinect_link"><visual><origin xyz="0 0 0" rpy="0 0 1.5708" /><geometry>// 使用三维软件导出的模型文件<mesh filename="package://mbot_description/meshes/kinect.dae" /></geometry></visual></link>
</robot>
  1. display_mbot_urdf.launch

<launch>// 设置ros的全局参数robot_description,指定机器人模型文件<param name="robot_description" textfile="$(find mbot_description)/urdf/mbot_base.urdf" /><!-- 设置GUI参数,显示关节控制插件 -->// 用这个可以控制机器人关节,但本文的demo没看到这个,有点遗憾<param name="use_gui" value="true"/><!-- 运行joint_state_publisher节点,发布机器人的关节状态  --><node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" /><!-- 运行robot_state_publisher节点,发布tf  --><node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" />// robot_state_publisher结合joint_state_publisher可以实时把机器人各关节和各坐标系关系发布出来,让rviz显示。如果不设置,rviz无法完整加载机器人模型。// rviz显示后会生成配置文件,保存后再打开,就不用频繁设置了。<!-- 运行rviz可视化界面 --><node name="rviz" pkg="rviz" type="rviz" args="-d $(find mbot_description)/config/mbot_urdf.rviz" required="true" /></launch>
  1. 使用 urdf_to_graphiz 命令行工具可以把 urdf 文件的内容,以树的样子dump出来,格式是pdf。使用这个可以快速读取 urdf 的 link 和 joint,下图是上面例子的节点树状图。

cd ~/catkin_ws/
urdf_to_graphiz src/mbot_description/urdf/mbot_base.urdf

  1. 编译和运行

cd ~/catkin_ws/
catkin_make --source src/mbot_description
source devel/setup.bash
roslaunch mbot_description display_mbot_urdf.launch

使用xacro优化差速轮式机器人模型

  1. 原始的urdf语法比较简单,导致机器人模型文件比较冗长啰嗦,比如两个动力轮,两个万向轮的编写就非常重复。ROS 提出了xacro语法,让机器人模型文件具有可编程能力,比如设置参数,定义宏函数并调用,文件包含等。下面进行分类举例:设置并调用参数:

   // xacro:property设置参数<xacro:property name="M_PI" value="3.1415926" />// 引用参数用${}<origin xyz="0 0 0" rpy="${M_PI/2} 0 0"/>

设置宏函数并调用:

  // xacro:macro设置宏函数,名字是wheel,参数是prefix 和 reflect<xacro:macro name="wheel" params="prefix reflect"><joint name="${prefix}_wheel_joint" type="continuous"><origin xyz="${wheel_joint_x} ${reflect*wheel_joint_y} ${-wheel_joint_z}" rpy="0 0 0" /><parent link="base_link" /><child link="${prefix}_wheel_link" /><axis xyz="0 1 0" /></joint><link name="${prefix}_wheel_link"><visual><origin xyz="0 0 0" rpy="${M_PI/2} 0 0"/><geometry><cylinder length="${wheel_length}" radius="${wheel_radius}"/></geometry><material name="white" /></visual></link></xacro:macro>// 调用wheel宏函数<xacro:wheel prefix="left"  reflect="1"/>  <xacro:wheel prefix="right"  reflect="-1"/>  

文件包含

  // xacro:include是文件包含,camera.xacro里面定义了一个宏函数<xacro:include filename="$(find mbot_description)/urdf/sensor/camera.xacro" />// 调用camera.xacro里面的宏函数<xacro:usb_camera joint_x="${camera_joint_x}" joint_y="${camera_joint_y}" joint_z="${camera_joint_z}"/>  
  1. 这里的几个文件是对上面的mbot_base.urdf的重写,使用xacro,具体语法看上面的解释。mbot_base.xacro

<?xml version="1.0" ?>
<robot name="mbot" xmlns:xacro="http://www.ros.org/wiki/xacro"><xacro:property name="M_PI" value="3.1415926" /><xacro:property name="wheel_joint_x" value="0" /><xacro:property name="wheel_joint_y" value="0.19" /><xacro:property name="wheel_joint_z" value="0.05" /><xacro:property name="wheel_length" value="0.06" /><xacro:property name="wheel_radius" value="0.06" /><xacro:property name="caster_joint_x" value="0.18" /><xacro:property name="caster_joint_y" value="0" /><xacro:property name="caster_joint_z" value="0.095" />  <xacro:property name="caster_radius" value="0.015" /><xacro:property name="base_length" value="0.16" /><xacro:property name="base_radius" value="0.2" /><xacro:property name="stage_length" value="0.12" /><xacro:property name="stage_radius" value="0.1" /><xacro:property name="camera_joint_x" value="0.17" /><xacro:property name="camera_joint_y" value="0" /><xacro:property name="camera_joint_z" value="0.1" />  <xacro:property name="kinect_joint_x" value="0.15" /><xacro:property name="kinect_joint_y" value="0" /><xacro:property name="kinect_joint_z" value="0.11" />  <xacro:property name="laser_joint_x" value="0" /><xacro:property name="laser_joint_y" value="0" /><xacro:property name="laser_joint_z" value="0.085" />  <material name="white"><color rgba="1 1 1 0.9"/></material><material name="red"><color rgba="1 0 0 1"/></material><material name="grey"><color rgba="0.5 0.5 0.5 1"/></material><xacro:macro name="base_stage"><link name="base_link"><visual><origin xyz="0 0 0" rpy="0 0 0"/><geometry><cylinder length="${base_length}" radius="${base_radius}"/></geometry><material name="red" /></visual></link><joint name="stage_joint" type="fixed"><origin xyz="0 0 ${(base_length + stage_length)/2}" rpy="0 0 0" /><parent link="base_link"/><child link="stage_link" />    </joint><link name="stage_link"><visual><origin xyz="0 0 0" rpy="0 0 0"/><geometry><cylinder length="${stage_length}" radius="${stage_radius}"/></geometry><material name="red" /></visual></link></xacro:macro><xacro:macro name="wheel" params="prefix reflect"><joint name="${prefix}_wheel_joint" type="continuous"><origin xyz="${wheel_joint_x} ${reflect*wheel_joint_y} ${-wheel_joint_z}" rpy="0 0 0" /><parent link="base_link" /><child link="${prefix}_wheel_link" /><axis xyz="0 1 0" /></joint><link name="${prefix}_wheel_link"><visual><origin xyz="0 0 0" rpy="${M_PI/2} 0 0"/><geometry><cylinder length="${wheel_length}" radius="${wheel_radius}"/></geometry><material name="white" /></visual></link></xacro:macro><xacro:macro name="caster" params="prefix reflect"><joint name="${prefix}_caster_joint" type="continuous"><origin xyz="${reflect*caster_joint_x} ${caster_joint_y} ${-caster_joint_z}" rpy="0 0 0" /><parent link="base_link"/><child link="${prefix}_caster_link" /><axis xyz="0 1 0" /></joint><link name="${prefix}_caster_link"><visual><origin xyz="0 0 0" rpy="0 0 0" /><geometry><sphere radius="${caster_radius}" /></geometry><material name="white" /></visual></link></xacro:macro><xacro:base_stage />  <xacro:wheel prefix="left"  reflect="1"/>  <xacro:wheel prefix="right"  reflect="-1"/>  <xacro:caster prefix="front"  reflect="1"/>  <xacro:caster prefix="back"  reflect="-1"/>  <xacro:include filename="$(find mbot_description)/urdf/sensor/camera.xacro" /><xacro:usb_camera joint_x="${camera_joint_x}" joint_y="${camera_joint_y}" joint_z="${camera_joint_z}"/>  <xacro:include filename="$(find mbot_description)/urdf/sensor/kinect.xacro" /><xacro:kinect joint_x="${kinect_joint_x}" joint_y="${kinect_joint_y}" joint_z="${kinect_joint_z}"/>  <xacro:include filename="$(find mbot_description)/urdf/sensor/laser.xacro" /><xacro:laser joint_x="${laser_joint_x}" joint_y="${laser_joint_y}" joint_z="${laser_joint_z}"/>  </robot>

camera.xacro

<?xml version="1.0" ?>
<robot name="mbot" xmlns:xacro="http://www.ros.org/wiki/xacro"><xacro:macro name="usb_camera" params="joint_x joint_y joint_z"><joint name="camera_joint" type="fixed"><origin xyz="${-joint_x} ${joint_y} ${joint_z}" rpy="0 0 0" /><parent link="base_link"/><child link="camera_link" />    </joint><link name="camera_link"><visual><origin xyz="0 0 0" rpy="0 0 0" /><geometry><box size="0.03 0.04 0.04" /></geometry><material name="grey" /></visual></link></xacro:macro>
</robot>

kinect.xacro

<?xml version="1.0" ?>
<robot name="mbot" xmlns:xacro="http://www.ros.org/wiki/xacro"><xacro:macro name="kinect" params="joint_x joint_y joint_z"><joint name="kinect_joint" type="fixed"><origin xyz="${joint_x} ${joint_y} ${joint_z}" rpy="0 0 0" /><parent link="base_link"/><child link="kinect_link" />    </joint><link name="kinect_link"><visual><origin xyz="0 0 0" rpy="0 0 1.5708" /><geometry><mesh filename="package://mbot_description/meshes/kinect.dae" /></geometry></visual></link></xacro:macro></robot>

laser.xacro

<?xml version="1.0" ?>
<robot name="mbot" xmlns:xacro="http://www.ros.org/wiki/xacro"><xacro:macro name="laser" params="joint_x joint_y joint_z"><joint name="laser_joint" type="fixed"><origin xyz="${joint_x} ${joint_y} ${joint_z}" rpy="0 0 0" /><parent link="stage_link"/><child link="laser_link" />    </joint><link name="laser_link"><visual><origin xyz="0 0 0" rpy="0 0 0" /><geometry><cylinder length="0.05" radius="0.05"/></geometry><material name="grey"/></visual></link></xacro:macro>
</robot>
  1. display_mbot_xacro.launch

<launch>// 引入xacro的解释器,不然无法读取 .xacro文件<arg name="model" default="$(find xacro)/xacro '$(find mbot_description)/urdf/mbot_base.xacro'" /><param name="robot_description" command="$(arg model)" /><!-- 设置GUI参数,显示关节控制插件 --><param name="use_gui" value="true"/><!-- 运行joint_state_publisher节点,发布机器人的关节状态  --><node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" /><!-- 运行robot_state_publisher节点,发布tf  --><node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher" /><!-- 运行rviz可视化界面 --><node name="rviz" pkg="rviz" type="rviz" args="-d $(find mbot_description)/config/mbot_xacro.rviz" required="true" /></launch>
  1. 运行效果如下,这里显示了坐标系轴

部分配置代码

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

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

相关文章

VPI photonics的一些使用经验(测相位 快速搜索)持续更新

1.使用FuncSinEl模块的注意事项&#xff1a; 2.在VPI player&#xff08;示波器&#xff09;测电信号相位时候&#xff0c;可以使用正则表达式&#xff0c;快速搜索。 比如我要搜索以30开头的数据&#xff0c;输入&#xff1a; ^30 其他的正则表达式不适用&#xff0c;比如以…

前端知识点---this的用法 , this动态绑定(Javascript)

文章目录 this动态绑定 , this的用法01. 全局作用域下的 this02. 函数中的 this2.1 普通函数调用2.2 构造函数调用2.3 箭头函数中的 this 03对象方法调用04. 事件处理中的 this05. 动态绑定的方式5.1 call 方法5.2 apply 方法5.3 bind 方法 06类中的 this07. 总结 this动态绑定…

【MySQL 保姆级教学】详细讲解视图--(15)

视图 1. 为什么要有视图&#xff1f;2.视图的定义和特点3. 创建视图4. 视图的使用举例4.1 创建表并插入数据4.2 举例 5. 视图和基表之间有什么联系呢&#xff1f; 1. 为什么要有视图&#xff1f; 当我们频繁地使用用多表查询和复合查询出的结果时&#xff0c;就需要频繁的使用…

聊聊Flink:Flink的分区机制

一、前言 flink任务在执行过程中&#xff0c;一个流&#xff08;stream&#xff09;包含一个或多个分区&#xff08;Stream partition&#xff09;。TaskManager中的一个slot的subtask就是一个stream partition&#xff08;流分区&#xff09;&#xff0c;一个Job的流&#xf…

探索SAP财务管理软件:重塑企业财务管理新境界

在当今瞬息万变的商业环境中&#xff0c;企业对于财务管理的精准性、高效性和透明度要求日益增高。作为全球领先的企业管理软件解决方案提供商&#xff0c;SAP凭借其强大的财务管理软件&#xff0c;正引领着全球企业迈向财务管理的新纪元。 SAP 财务管理系统通过智能化技术&am…

数字孪生乡村:数字乡村智慧化营建思路

数字化技术已然成为全球理论和产业界关注的热点命题 &#xff0c;并广泛应用于城市规划、交通管理、工业、医疗、教育等领域&#xff0c;已经成为文化遗产保护领域最主要方式 &#xff0c;如数字非遗、数字文物、数字文旅等。 传统村落的数字化保护呈现由单一技术向多技术集成…

《FreeRTOS任务基础知识以及任务创建相关函数》

目录 1.FreeRTOS多任务系统与传统单片机单任务系统的区别 2.FreeRTOS中的任务&#xff08;Task&#xff09;介绍 2.1 任务特性 2.2 FreeRTOS中的任务状态 2.3 FreeRTOS中的任务优先级 2.4 在任务函数中退出 2.5 任务控制块和任务堆栈 2.5.1 任务控制块 2.5.2 任务堆栈…

SpringCloud基础 入门级 学习SpringCloud 超详细(简单通俗易懂)

Spring Cloud 基础入门级学习 超详细&#xff08;简单通俗易懂&#xff09; 一、SpringCloud核心组件第一代&#xff1a;SpringCloud Netflix组件第二代&#xff1a;SpringCloud Alibaba组件SpringCloud原生组件 二、SpringCloud体系架构图三、理解分布式与集群分布式集群 四、…

Photoshop(PS)——人像磨皮

1.新建一个文件&#xff0c;背景为白色&#xff0c;将图片素材放入文件中 2.利用CtrlJ 复制两个图层出来&#xff0c;选择第一个拷贝图层&#xff0c;选择滤镜---杂色---蒙尘与划痕 3.调整一下数值&#xff0c;大概能够模糊痘印痘坑&#xff0c;点击确定。 4.然后选择拷贝2图层…

core 文件

sysctl -a | grep core_pattern 查看core 的路径 linux下寻找段错误的方法 - 空水 - 博客园 /var/log/messages dmesg -T 一、dmesg命令 dmesg命令&#xff0c;用于获取程序出错时的堆栈地址&#xff0c;用grep过滤出发生崩溃的程序&#xff0c;以及对应的堆栈信息 [Thu Nov …

centos rich 美观打印日志

文章目录 步骤 1: 安装 Python 和 pip步骤 2: 安装 rich-cli步骤 3: 验证安装步骤 4: 使用 rich-cli参考 在 CentOS 上安装 rich-cli 工具&#xff0c;你可以按照以下步骤进行操作。rich-cli 是一个命令行工具&#xff0c;用于将 rich 库的功能&#xff08;例如美化输出&#x…

《动手学深度学习》中d2l库的安装以及问题解决

当我们在按照《动手学深度学习》这本书或者网课学习时会有需要导入d2l库的使用。​d2I是一个与《动手学深度学习》(Dive into Deep Learning&#xff09;一书配套的开源教学库&#xff0c;它包含了作者李沐设计的深度学习相关代码和示例。这个库旨在帮助读者通过实践经验来理解…

【大模型实战篇】vLLM的由来以及大模型部署、推理加速实践

1. 问题背景分析及vLLM的由来 大模型毫无疑问&#xff0c;在工作、生活中已经逐渐扮演越来越重要的角色。但大模型的尺寸一般都比较大&#xff0c;处理一个大模型请求的成本可能比传统关键字查询高出 10 倍。推理的成本代价较高&#xff0c;因此提高大模型服务系统的吞吐量&…

常用在汽车PKE无钥匙进入系统的高度集成SOC芯片:CSM2433

CSM2433是一款集成2.4GHz频段发射器、125KHz接收器和8位RISC&#xff08;精简指令集&#xff09;MCU的SOC芯片&#xff0c;用在汽车PKE无钥匙进入系统里。 什么是汽车PKE无钥匙进入系统&#xff1f; 无钥匙进入系统具有无钥匙进入并且启动的功能&#xff0c;英文名称是PKE&…

路由器基本原理与配置

一 &#xff0c; 路由是什么&#xff1f; 从源主机到目标主机的转发过程&#xff1b; 二 &#xff0c; 路由器 &#xff08;1&#xff09;路由器的工作原理 路由器是一种三层设备&#xff0c;是使用IP地址寻址&#xff0c;实现从源IP到达目标IP地址的端到端的服务&#xff0c…

NPOI 实现Excel模板导出

记录一下使用NPOI实现定制的Excel导出模板&#xff0c;已下实现需求及主要逻辑 所需Json数据 对应参数 List<PurQuoteExportDataCrInput> listData [{"ItemName": "电缆VV3*162*10","Spec": "电缆VV3*162*10","Uom":…

element plus的表格内容自动滚动

<el-table:data"tableData"ref"tableRef"borderstyle"width: 100%"height"150"><el-table-column prop"date" label"名称" width"250" /><el-table-column prop"name" label&…

【Linux网络编程】简单的UDP网络程序

目录 一&#xff0c;socket编程的相关说明 1-1&#xff0c;sockaddr结构体 1-2&#xff0c;Socket API 二&#xff0c;基于Udp协议的简单通信 一&#xff0c;socket编程的相关说明 Socket编程是一种网络通信编程技术&#xff0c;它允许两个或多个程序在网络上相互通信&…

AI 写作(九)实战项目二:智能新闻报道(9/10)

一、项目概述 在当今信息爆炸的时代&#xff0c;新闻传播行业正面临着前所未有的挑战与机遇。随着科技的飞速发展&#xff0c;人们获取信息的渠道日益多样化&#xff0c;对新闻的时效性、准确性和个性化需求也不断提高。在这样的背景下&#xff0c;AI 写作在智能新闻报道中的重…

针对gitgitee的使用

1.下载git 链接 打开终端&#xff0c;桌面鼠标右键 2.配置密钥 登录gitee。 设置密钥 查看官方文档 跟着教程 复制最后的输出进行密钥添加 验证是否添加成功 3.创建&连接远程仓库 创建仓库 git终端进行配置 远程仓库克隆到本地 桌面终端clone,克隆他人|自己的仓库到本地…