ROS进阶:使用URDF和Xacro构建差速轮式机器人模型
前言
本篇文章介绍的是ROS高效进阶内容,使用URDF 语言(xml格式)做一个差速轮式机器人模型,并使用URDF的增强版xacro,对机器人模型文件进行二次优化。
差速轮式机器人:两轮差速底盘由两个动力轮位于底盘左右两侧,两轮独立控制速度,通过给定不同速度实现底盘转向控制。一般会配有一到两个辅助支撑的万向轮。
此次建模,不引入算法,只是把机器人模型的样子做出来,所以只使用 rivz 进行可视化显示。
机器人的定义和构成
-
机器人定义:机器人是一种自动化的机器,所不同的是这种机器具备一些与人或生物相似的智能能力,如感知能力、规划能力、动作能力和协同能力,是一种具有高级灵活性的自动化机器。目前,自动驾驶汽车也被认为是一种机器人。
-
机器人构成:机器人通常分为四大部分,即执行机构,驱动系统,传感系统和控制系统。以自动驾驶汽车为例,执行机构就是油门,转向和刹车;驱动系统就是电动机;传感系统就是各种传感器:lidar,radar,camera,uss,imu,GNSS;控制系统就是智驾算法系统:感知,定位,规划和控制。
-
机器人四大部分的控制回路,大致如图:
URDF建模套路
-
URDF:Unified Robot Description Format,统一的机器人描述文件格式。urdf 文件使用 xml 格式。
-
用 urdf 描述机器人,套路如下:每个机器人都是由多个 link(连杆) 和 joint(关节)组成。这里的 link 和joint 很宽泛,形状不一定是杆和轴。比如桌子,桌面和腿都是link,连接处是固定的 joint。
<?xml version="1.0" ?>
<robot name="name of robot"><link> ... </link><joint> ... </joint>...
</robot>
-
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>
这里我们只进行外观建模,因此暂不涉及物理属性配置。
-
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做一个差速轮式机器人模型
-
创建 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
-
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>
-
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>
-
使用 urdf_to_graphiz 命令行工具可以把 urdf 文件的内容,以树的样子dump出来,格式是pdf。使用这个可以快速读取 urdf 的 link 和 joint,下图是上面例子的节点树状图。
cd ~/catkin_ws/
urdf_to_graphiz src/mbot_description/urdf/mbot_base.urdf
-
编译和运行
cd ~/catkin_ws/
catkin_make --source src/mbot_description
source devel/setup.bash
roslaunch mbot_description display_mbot_urdf.launch
使用xacro优化差速轮式机器人模型
-
原始的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}"/>
-
这里的几个文件是对上面的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>
-
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>
-
运行效果如下,这里显示了坐标系轴
部分配置代码
相关文章:
ROS进阶:使用URDF和Xacro构建差速轮式机器人模型
前言 本篇文章介绍的是ROS高效进阶内容,使用URDF 语言(xml格式)做一个差速轮式机器人模型,并使用URDF的增强版xacro,对机器人模型文件进行二次优化。 差速轮式机器人:两轮差速底盘由两个动力轮位于底盘左…...
windows编译使用gtest
下载: Release v1.12.1 google/googletest GitHub 编译: 编译源码中的CMakeLists.txt: 编译后生成的目录是BUILD: *(编译之前需要安装cmake: ) 关注下面这两个目录: 在vs中打开: 配置属性: 点击编译&a…...
C++编程,#include <iostream>详解,以及using namespace std;作用
在C编程中,#include <iostream> 是用来包含输入/输出流头文件的预处理指令。它允许程序使用标准的输入/输出对象如 std::cout 和 std::cin,以便与标准输入和输出流进行交互。这一头文件是编写输入输出操作时必不可少的部分。 讲到这里,…...
【愚公系列】《Python网络爬虫从入门到精通》008-正则表达式基础
标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…...
Golang并发编程最佳实践:协程与通道
Golang并发编程最佳实践:协程与通道 本文旨在介绍Golang并发编程的最佳实践,重点讨论协程和通道的使用方法,以及相关的实际案例和代码示例。 一、Golang并发编程简介 又称Go语言)是一种由Google开发的编程语言,旨在提供…...
neural_gcm模型进行气象预测教程
简介 NeuralGCM (General circulation models)是Google开发的一种新型的天气和气候模型,它结合了传统的物理建模与机器学习技术,相关论文于2024年发表在nature上。它既可以做短期的天气预报,也可以做长期的气候预测。…...
怎么让DeepSeek自动化写作文案
在数字化时代,内容创作已成为企业争夺用户注意力的核心竞争力。面对海量信息需求,企业往往面临内容创作效率低下、质量参差不齐、周期长等问题。如何用技术手段解决这些痛点,成为企业迫切需要破解的难题。今天,我们将以DeepSeek为…...
淘宝/天猫获得淘宝商品评论 API 返回值说明||API评论接口
item_review-获得淘宝商品评论 taobao.item_review 公共参数 名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,ite…...
全面理解-c++11的引用折叠
在 C 中,引用折叠(Reference Collapsing) 是一组用于处理多重引用(如 T& & 或 T&& &&)的规则,主要出现在模板参数推导、auto 类型推导和 decltype 的上下文中。它是实现**通用引用…...
考研高数复习规范
前言 这里记录我的高数复习规范与规划,希望能给需要考研的同学一点启发 规范原因 高数的内容很多,关键的是:会做题、拿高分首先最重要的就是抓住概念。比如有界无界的概念,间断点的概念、极限的概念其次是做题过程中得到的方法…...
2025 docker可视化管理面板DPanel的安装
1.什么是 DPanel ? DPanel 是一款 Docker 可视化管理面板,旨在简化 Docker 容器、镜像和文件的管理。它提供了一系列功能,使用户能够更轻松地管理和部署 Docker 环境。 软件特点: 可视化管理:提供直观的用户界面&#…...
「vue3-element-admin」Vue3 + TypeScript 项目整合 Animate.css 动画效果实战指南
🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template 🌺 仓库主页: GitCode︱ Gitee ︱ Github 💖 欢迎点赞 👍 收藏 ⭐评论 …...
Python函数进阶250215
函数返回值进阶 函数返回的内容也是地址 def func01():data [1, 2, 3]# 执行到此步后,[1, 2, 3]这块内存会有一个引用计数器,且值为2,因为内部的data与外部的v1都指向这块空间return data v1 func01()# v1 point the address of data, if…...
VMware Workstation Pro 下载(无需注册账号)
VMware Workstation Pro 目前对个人用户完全免费。有两种下载方式,分别为 1、Broadcom 官网下载 需要注册账号,我懒得注册 2、VMware 更新服务器下载 如果不想注册账号,可以通过 VMware 更新服务器直接下载。访问以下链接: ht…...
USB2.03.0摄像头区分UVC相机在linux中的常用命令
这里是引用 一. USB2.0 & 3.0接口支持区分 1.1. 颜色判断 USB接口的颜色并不是判断版本的可靠标准,但根据行业常见规范分析如下: USB接口颜色与版本对照表: 接口颜色常见版本内部触点数量传输速度黑色USB2.04触点480 Mbps (60 MB/s)白…...
Linux入侵检查流程
1. 初步信息收集 1.1 系统信息 • 目的:了解当前系统的基本情况,包括操作系统版本、内核版本等。 • 命令: # 查看操作系统发行版信息 cat /etc/os-release # 查看内核版本 uname -r 1.2 网络信息 • 目的:查看网络连接状态、…...
(尚硅谷 Java 学习 B 站大学版)Day17 多态练习
Instanceof 关键字 一:引言 不能调用子类特有的方法、属性; 如何才能调用子类特有的属性和方法 向下转型:使用强制类型转换符 Man m1(Man) p2 注:其中p2 为 Person 类型 使用强转时,可能出现 ClassCastException …...
vscode配置django环境并创建django项目(全图文操作)
文章目录 创建项目工作路径下载python插件:创建虚拟环境 1. 命令方式创建2. 图文方式创建 在虚拟环境中安装Django创建Django项目安装Django插件选择虚拟环境 创建项目工作路径 输入 code . 下载python插件: 创建虚拟环境 1. 命令方式创建 切换在工作…...
NLP 八股 DAY1:BERT
BERT全称:Pre-training of deep bidirectional transformers for language understanding,即深度双向Transformer。 模型训练时的两个任务是预测句⼦中被掩盖的词以及判断输⼊的两个句⼦是不是上下句。在预训练 好的BERT模型后⾯根据特定任务加上相应的⽹…...
53倍性能提升!TiDB 全局索引如何优化分区表查询?
作者: Defined2014 原文来源: https://tidb.net/blog/7077577f 什么是 TiDB 全局索引 在 TiDB 中,全局索引是一种定义在分区表上的索引类型,它允许索引分区与表分区之间建立一对多的映射关系,即一个索引分区可以对…...
基于单片机的常规肺活量SVC简单计算
常规肺活量 SVC(Slow Vital Capacity)是指尽力吸气后缓慢而又完全呼出的最大气量。 成年男性的肺活量通常在 3500-4000ml 之间,成年女性的肺活量通常在 2500-3000ml 之间。 单片机一般通过外接流量传感器,使用ADC高速采集的方式…...
html 点击弹出视频弹窗
一、效果: 点击视频按钮后,弹出弹窗 播放视频 二、代码 <div class="index_change_video" data-video-src="</...
机器学习:二分类和多分类
1. 二分类(Binary Classification) 定义 二分类是指将输入样本分成两个互斥的类别。例如: 邮件 spam 或不是 spam。病人是有病或健康。物品是正品或假货。实现方法 二分类任务可以通过多种算法实现,包括: 逻辑回归(Logistic Regression):通过sigmoid函数将输出值映射…...
Win11配置wsl、ubuntu、docker
系统要求 安装WSL。 开通虚拟化: 准备工作 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestartdism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestartwsl --set-default-versi…...
机试题——稀疏存储
题目描述 在虚拟化技术、芯片仿真器等领域,存在一种场景,即实际读写的数据量比较小,但要求可访问的地址空间却很大(要求 4GB、甚至 128GB 地址空间)。 实现一个地址范围为 32G的,可在该地址范围内任意位置…...
双指针专题1:有效三角形的个数
描述 给定一个正整数n,输入一行包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。 输入描述 第一行输入一个正整数n 第二行输入n个nums[i] 输出描述 输出其中可以组成三角形三条边的三元组个数。 解释一个样例: 4…...
Ansible内置模块之file
ansible.builtin.file 模块用于管理文件和目录的属性。可以创建、删除文件或目录,修改文件权限、所有者等属性。 1. 选 项 说 明 选项必须类型默认值说明path是str无要管理的文件或目录的路径state否str无状态或类型。可为 file,directory,absent,link 等mode否str…...
DeepSeek 助力 Vue 开发:打造丝滑的侧边栏(Sidebar)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
手写一个Java Android Binder服务及源码分析
手写一个Java Android Binder服务及源码分析 前言一、Java语言编写自己的Binder服务Demo1. binder服务demo功能介绍2. binder服务demo代码结构图3. binder服务demo代码实现3.1 IHelloService.aidl3.2 IHelloService.java(自动生成)3.3 HelloService.java…...
考研操作系统----操作系统的概念定义功能和目标(仅仅作为王道哔站课程讲义作用)
目录 操作系统的概念定义功能和目标 操作系统的四个特征 操作系统的分类 编辑 操作系统的运行机制 系统调用 操作系统体系结构 操作系统引导 虚拟机 操作系统的概念定义功能和目标 什么是操作系统: 操作系统是指控制和管理整个计算机系统的软硬件资源&…...
java.lang.IllegalArgumentException: 在请求目标中找到无效字符。有效字符在RFC 7230和RFC 3986中定义
Tomcat 屏蔽错误信息。java.lang.IllegalArgumentException: 在请求目标中找到无效字符。有效字符在RFC 7230和RFC 3986中定义 <h1>HTTP状态 400 - 错误的请求</h1><hr class"line" /><p><b>类型</b> 异常报告</p><p&…...
ros:ur机械臂初识
这是用来可视化的launch文件 比如,我运行 roslaunch ur_description view_ur3.launch ur3模型 ur3e模型 ur5模型 ur5e模型 ur10模型 ur20模型 ur30模型 后来我搜了一下 UR5 和 UR10 都是由 Universal Robots(简称 UR)生产的协作机器人&…...
计算机视觉-局部特征
一、局部特征 1.1全景拼接 先用RANSAC估计出变换,就可以拼接两张图片 ①提取特征 ②匹配特征 ③拼接图像 1.2 点的特征 怎么找到对应点?(才能做点对应关系RANSAC) :特征检测 我们希望找到的点具有的特征有什么特…...
LabVIEW袜品压力测试系统
开发了一种基于LabVIEW开发的袜品压力测试系统。该系统利用LabVIEW并结合灵敏的传感器和高精度的处理模块,实现了对袜品压力的精确测量和分析。系统不同于传统的服装压力测试方法,为研究和评价袜子的舒适性提供了新的测试手段。 项目背景 该系统的…...
Node.js 工具模块
Node.js 工具模块 引言 Node.js 是一个开源的、基于 Chrome V8 引擎的 JavaScript 运行时环境。它允许开发者使用 JavaScript 编写服务器端代码,从而构建快速、可扩展的网络应用。在 Node.js 开发过程中,工具模块扮演着至关重要的角色。本文将详细介绍 Node.js 中常用的工具…...
【Redis】下载安装Redis和Redis图形化界面工具教程(2024最新版本,史上最详细)
目录 一、Redis简介 二、Redis下载和安装 2.1、下载 2.2、安装 2.3、环境变量配置(可省略) 三、Redis启动验证 3.1、点击键盘上的WinR键,在跳出的运行界面中输入cmd并确定 3.2、输入redis-cli -v 查看redis的版本号 3.3、接着我们再…...
企业SSL 证书管理指南
文章从以下几个部分展开 SSL证书的用途和使用场景SSL证书的申请类型和实现方式SSL证书的管理SSL证书的续签 一、SSL 证书的用途和使用场景 1.1 为什么要使用 SSL 证书? 1. 数据安全 🛡️- 在 HTTP 传输中,TCP 包可以被截获,攻…...
JDK1.8新特性面试题
lambda表达式 Lambda表达式极大地简化了匿名内部类的创建,促进了函数式编程风格。开发者可以更简洁地定义只有一行代码的函数对象,并将其作为参数传递给方法或者赋值给变量。 三要素: 形式参数、箭头、代码块 (形式参数…...
floodfill算法系列一>太平洋大西洋水流问题
目录 题目方法解析:代码设计:代码呈现: 题目方法解析: 代码设计: 代码呈现: class Solution {int m,n;int[] dx {0,0,-1,1};int[] dy {-1,1,0,0};public List<List<Integer>> pacificAtlant…...
【信息学奥赛一本通 C++题解】1258:【例9.2】数字金字塔
信息学奥赛一本通(C版)在线评测系统 基础算法 第一节 动态规划的基本模型 1258:【例9.2】数字金字塔 小学生的课堂讲解 一、解题思路 同学们,今天我们要解决的是数字金字塔找最大路径和的问题。想象一下,数字金字塔就…...
初始c语言(指针和结构体)
前言: 内容: 昨天学的指针,今天复习指针,然后学习结构体 复习: 什么是指针,指针就是地址, int* p &a; p就是指针变量,但是口语一般成为指针 int 说明p指向的对象是in…...
C#(Winform)通过添加AForge添加并使用系统摄像机
先展示效果 AForge介绍 AForge是一个专门为开发者和研究者基于C#框架设计的, 也是NET平台下的开源计算机视觉和人工智能库 它提供了许多常用的图像处理和视频处理算法、机器学习和神经网络模型,并且具有高效、易用、稳定等特点。 AForge主要包括: 计算机视觉与人…...
Ubuntu安装geteck/jetlinks实战:源码启动
这个还是很复杂的,建议使用docker即可。 参考 使用源码启动JetLinks | JetLinks 物联网基础平台 安装Ubuntu虚拟机(略)安装JDK8编译Redis安装mysql ubuntu安装MySqL server-CSDN博客 初次使用,不要安装ElasticSearch下载源码…...
探索ELK 的魅力
在大数据时代,海量日志和数据的收集、存储、处理与可视化分析变得越来越重要。而 ELK 堆栈,由 Elasticsearch、Logstash、Beats 和 Kibana 组成,正是一个强大的开源解决方案,帮助开发者和运维人员高效管理和分析日志数据。本文将详…...
137,【4】 buuctf web [SCTF2019]Flag Shop
进入靶场 都点击看看 发现点击work会增加¥ 但肯定不能一直点下去 抓包看看 这看起来是一个 JWT(JSON Web Token)字符串。JWT 通常由三部分组成,通过点(.)分隔,分别是头部(Header&…...
变相提高大模型上下文长度-RAG文档压缩-2.带早停机制的map-refine
我试过用map-refine方法来精炼上下文,由于它是线性的,运行时间随着文档数量线性增长。所以可以考虑通过判断上下文是否可以满足QA来提前结束过程。 import os import json from langchain_core.documents import Documentdata [] file_path ./data/da…...
C++ 虚表(Vtable)和虚基表(Vbtale)与 虚函数 和 虚继承
C的虚表(Vtable)和虚基表(Vbtale)是与 虚函数 和 虚继承 密切相关的概念。它们都是用于支持多态(特别是动态绑定)和虚拟继承的机制,但它们的作用和实现方式有所不同。我们将逐步探讨虚表、虚基表…...
2021年全国研究生数学建模竞赛华为杯E题信号干扰下的超宽带(UWB)精确定位问题求解全过程文档及程序
2021年全国研究生数学建模竞赛华为杯 E题 信号干扰下的超宽带(UWB)精确定位问题 原题再现: 一、背景 UWB(Ultra-Wideband)技术也被称之为“超宽带”,又称之为脉冲无线电技术。这是一种无需任何载波,通过发送纳秒…...
SpringCould+vue3项目的后台用户管理的CURD【Taurus教育平台】
文章目录 一.SpringCouldvue3项目的后台用户管理的CURD【Taurus教育平台】 1.1 背景 二.用户列表(分页查询) 2.1 前端Vue3 (Vue3-Element-Admin)2.2 后端SpringCould 处理 三. 用户信息删除 3.1 前端Vue3 (Vue3-Eleme…...
草图绘制技巧
1、点击菜单栏文件–》新建–》左下角高级新手切换–》零件; 2、槽口:直槽口,中心点槽口,三点源槽口,中心点圆弧槽口; 3、草图的约束:需要按住ctrl键,选中两个草图,然后…...