【ROS】—— 机器人系统仿真 —URDF优化_xacro (十四)

news2025/1/19 7:56:21

文章目录

  • 前言
  • 1. URDF优化_xacro
  • 2. Xacro_快速体验
  • 3. Xacro_语法详解
    • 3.1 属性与算数运算
    • 3.2 宏
    • 3.3 文件包含
  • 4. Xacro_完整使用流程示例
    • 4.1 编写 Xacro 文件
    • 4.2 集成launch文件
  • 5. Xacro_实操

前言

📢本系列将依托赵虚左老师的ROS课程,写下自己的一些心得与笔记。
📢课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ
📢讲义链接:http://www.autolabor.com.cn/book/ROSTutorials/index.html
📢 文章可能存在疏漏的地方,恳请大家指出。

1. URDF优化_xacro

前面 URDF 文件构建机器人模型的过程中,存在若干问题。

  • 问题1:设计易出错。

  • 问题2:代码复用性问题。

如果在编程语言中,可以通过变量结合函数直接解决上述问题,在 ROS 中,已经给出了类似编程的优化方案,称之为:Xacro

概念
Xacro 是 XML Macros 的缩写,Xacro 是一种 XML 宏语言,是可编程的 XML。

原理
Xacro 可以声明变量,可以通过数学运算求解,使用流程控制控制执行顺序,还可以通过类似函数的实现,封装固定的逻辑,将逻辑中需要的可变的数据以参数的方式暴露出去,从而提高代码复用率以及程序的安全性。

作用
较之于纯粹的 URDF 实现,可以编写更安全、精简、易读性更强的机器人模型文件,且可以提高编写效率。

2. Xacro_快速体验

需求描述:

使用xacro优化上一节案例中驱动轮实现,需要使用变量封装底盘的半径、高度,使用数学公式动态计算底盘的关节点坐标,使用 Xacro 宏封装轮子重复的代码并调用宏创建两个轮子(注意: 在此,演示 Xacro 的基本使用,不必要生成合法的 URDF )。

编写 Xacro 文件,以变量的方式封装属性(常量半径、高度、车轮半径…),以函数的方式封装重复实现(车轮的添加)。

<robot name="mycar" xmlns:xacro="http://wiki.ros.org/xacro">
    <!-- 属性封装 -->
    <xacro:property name="wheel_radius" value="0.0325" />
    <xacro:property name="wheel_length" value="0.0015" />
    <xacro:property name="PI" value="3.1415927" />
    <xacro:property name="base_link_length" value="0.08" />
    <xacro:property name="lidi_space" value="0.015" />

    <!-- 宏 -->
    <xacro:macro name="wheel_func" params="wheel_name flag" >
        <link name="${wheel_name}_wheel">
            <visual>
                <geometry>
                    <cylinder radius="${wheel_radius}" length="${wheel_length}" />
                </geometry>

                <origin xyz="0 0 0" rpy="${PI / 2} 0 0" />

                <material name="wheel_color">
                    <color rgba="0 0 0 0.3" />
                </material>
            </visual>
        </link>

        <!-- 3-2.joint -->
        <joint name="${wheel_name}2link" type="continuous">
            <parent link="base_link"  />
            <child link="${wheel_name}_wheel" />
            <!-- 
                x 无偏移
                y 车体半径
                z z= 车体高度 / 2 + 离地间距 - 车轮半径

            -->
            <origin xyz="0 ${0.1 * flag} ${(base_link_length / 2 + lidi_space - wheel_radius) * -1}" rpy="0 0 0" />
            <axis xyz="0 1 0" />
        </joint>

    </xacro:macro>
    <xacro:wheel_func wheel_name="left" flag="1" />
    <xacro:wheel_func wheel_name="right" flag="-1" />
</robot>

执行:rosrun xacro xacro xxx.xacro > xxx.urdf, 会将 xacro 文件解析为 urdf 文件,内容如下:

<?xml version="1.0" ?>
<!-- =================================================================================== -->
<!-- |    This document was autogenerated by xacro from test.xacro                     | -->
<!-- |    EDITING THIS FILE BY HAND IS NOT RECOMMENDED                                 | -->
<!-- =================================================================================== -->
<robot name="mycar">
  <link name="left_wheel">
    <visual>
      <geometry>
        <cylinder length="0.0015" radius="0.0325"/>
      </geometry>
      <origin rpy="1.57079635 0 0" xyz="0 0 0"/>
      <material name="wheel_color">
        <color rgba="0 0 0 0.3"/>
      </material>
    </visual>
  </link>
  <!-- 3-2.joint -->
  <joint name="left2link" type="continuous">
    <parent link="base_link"/>
    <child link="left_wheel"/>
    <!-- 
                x 无偏移
                y 车体半径
                z z= 车体高度 / 2 + 离地间距 - 车轮半径

            -->
    <origin rpy="0 0 0" xyz="0 0.1 -0.0225"/>
    <axis xyz="0 1 0"/>
  </joint>
  <link name="right_wheel">
    <visual>
      <geometry>
        <cylinder length="0.0015" radius="0.0325"/>
      </geometry>
      <origin rpy="1.57079635 0 0" xyz="0 0 0"/>
      <material name="wheel_color">
        <color rgba="0 0 0 0.3"/>
      </material>
    </visual>
  </link>
  <!-- 3-2.joint -->
  <joint name="right2link" type="continuous">
    <parent link="base_link"/>
    <child link="right_wheel"/>
    <!-- 
                x 无偏移
                y 车体半径
                z z= 车体高度 / 2 + 离地间距 - 车轮半径

            -->
    <origin rpy="0 0 0" xyz="0 -0.1 -0.0225"/>
    <axis xyz="0 1 0"/>
  </joint>
</robot>

3. Xacro_语法详解

xacro 提供了可编程接口,类似于计算机语言,包括变量声明调用、函数声明与调用等语法实现。在使用 xacro 生成 urdf 时,根标签robot中必须包含命名空间声明:xmlns:xacro="http://wiki.ros.org/xacro"

3.1 属性与算数运算

用于封装 URDF 中的一些字段,比如: PAI 值,小车的尺寸,轮子半径 …
格式

    <xacro:property name="wheel_radius" value="0.0325" />
    <xacro:property name="wheel_length" value="0.0015" />
    <xacro:property name="PI" value="3.1415927" />
    <xacro:property name="base_link_length" value="0.08" />
    <xacro:property name="lidi_space" value="0.015" />

调用

         <cylinder radius="${wheel_radius}" length="${wheel_length}" />
         <origin xyz="0 0 0" rpy="${PI / 2} 0 0" />
         <origin xyz="0 ${0.1 * flag} ${(base_link_length / 2 + lidi_space - wheel_radius) * -1}" rpy="0 0 0" />

3.2 宏

类似于函数实现,提高代码复用率,优化代码结构,提高安全性
定义

    <xacro:macro name="wheel_func" params="wheel_name flag" >
    .....
    .....
    </xacro:macro>
    <!-- 宏 -->
    <xacro:macro name="wheel_func" params="wheel_name flag" >
        <link name="${wheel_name}_wheel">
            <visual>
                <geometry>
                    <cylinder radius="${wheel_radius}" length="${wheel_length}" />
                </geometry>

                <origin xyz="0 0 0" rpy="${PI / 2} 0 0" />

                <material name="wheel_color">
                    <color rgba="0 0 0 0.3" />
                </material>
            </visual>
        </link>

        <!-- 3-2.joint -->
        <joint name="${wheel_name}2link" type="continuous">
            <parent link="base_link"  />
            <child link="${wheel_name}_wheel" />
            <!-- 
                x 无偏移
                y 车体半径
                z z= 车体高度 / 2 + 离地间距 - 车轮半径

            -->
            <origin xyz="0 ${0.1 * flag} ${(base_link_length / 2 + lidi_space - wheel_radius) * -1}" rpy="0 0 0" />
            <axis xyz="0 1 0" />
        </joint>

    </xacro:macro>

调用

    <xacro:宏名称 参数1=xxx 参数2=xxx/>
    <xacro:wheel_func wheel_name="left" flag="1" />
    <xacro:wheel_func wheel_name="right" flag="-1" />

3.3 文件包含

机器人由多部件组成,不同部件可能封装为单独的 xacro 文件,最后再将不同的文件集成,组合为完整机器人,可以使用文件包含实现

文件包含

<robot name="xxx" xmlns:xacro="http://wiki.ros.org/xacro">
      <xacro:include filename="my_base.xacro" />
      <xacro:include filename="my_camera.xacro" />
      <xacro:include filename="my_laser.xacro" />
      ....
</robot>

4. Xacro_完整使用流程示例

4.1 编写 Xacro 文件

<robot name="mycar" xmlns:xacro="http://wiki.ros.org/xacro">

    <xacro:property name="footprint_radius" value="0.001"/>

    <link name = "base_footprint">
        <visual>
            <geometry>
                <sphere radius="${footprint_radius}"/>
            </geometry>
        </visual>
    </link> 

    <xacro:property name="base_length" value="0.08"/>
    <xacro:property name="base_radius" value="0.1"/>
    <xacro:property name="distance_ground" value="0.015"/>
    <xacro:property name="base_joint_z" value="${distance_ground+base_length / 2}"/>

    <link name = "base_link">
        <visual>
            <geometry>
                <cylinder radius = "0.1" length="0.08"/>
            </geometry>
            <origin xyz = "0 0 0" rpy="0 0 0"/>
            <material name="robot_color">
                <color rgba="0.2 0.2 0.2 1"/>
            </material>
        </visual>
    </link> 

    <joint name="baselink2basefootprint" type="fixed">
        <parent link = "base_footprint"/>
        <child link = "base_link" />
        <origin xyz="0 0 ${base_joint_z}" rpy="0 0 0" />
        <axis xyz="0 0 0" />
    </joint>

</robot>

4.2 集成launch文件

方式1:先将 xacro 文件转换出 urdf 文件,然后集成
先将 xacro 文件解析成 urdf 文件:rosrun xacro xacro xxx.xacro > xxx.urdf然后再按照之前的集成方式直接整合 launch 文件

方式2:在 launch 文件中直接加载 xacro(建议使用)

<launch> 
    <param name="robot_description" command="$(find xacro)/xacro $(find  urdf01_rviz)/urdf/xacro/demo06_base_footprint.urdf.xacro" />

    <!--启动rviz -->
    <node pkg = "rviz" type = "rviz" name="rviz" args="-d $(find urdf01_rviz)/config/demo01.rviz"/>
    <!-- 添加关节状态发布节点 -->
    <node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher" />
    <!-- 添加机器人状态发布节点 -->
    <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" />
    <!-- 可选:用于控制关节运动的节点 -->
    <node pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher_gui" />

</launch>

完整效果
在这里插入图片描述demo06_base_footprint.urdf.xacro

<robot name="mycar" xmlns:xacro="http://wiki.ros.org/xacro">

    <xacro:property name="footprint_radius" value="0.001"/>

    <material name="black">
        <color rgba="0 0 0 1"/>
    </material>

    <link name = "base_footprint">
        <visual>
            <geometry>
                <sphere radius="${footprint_radius}"/>
            </geometry>
        </visual>
    </link> 

    <xacro:property name="base_length" value="0.08"/>
    <xacro:property name="base_radius" value="0.1"/>
    <xacro:property name="distance_ground" value="0.015"/>
    <xacro:property name="base_joint_z" value="${distance_ground+base_length / 2}"/>

    <link name = "base_link">
        <visual>
            <geometry>
                <cylinder radius = "0.1" length="0.08"/>
            </geometry>
            <origin xyz = "0 0 0" rpy="0 0 0"/>
            <material name="robot_color">
                <color rgba="0.2 0.2 0.2 1"/>
            </material>
        </visual>
    </link> 

    <joint name="baselink2basefootprint" type="fixed">
        <parent link = "base_footprint"/>
        <child link = "base_link" />
        <origin xyz="0 0 ${base_joint_z}" rpy="0 0 0" />
        <axis xyz="0 0 0" />
    </joint>

    <xacro:property name="PI" value="3.1415927"/>
    <xacro:property name="wheel_radius" value="0.0325"/>
    <xacro:property name="wheel_length" value="0.015"/>
    <xacro:property name="wheel_joint_z" value="${(base_length / 2 + distance_ground - wheel_radius) * -1}"/>

    <xacro:macro name="wheel_func" params="wheel_name flag">

    <link name = "${wheel_name}">
        <visual>
            <geometry>
                <cylinder radius = "${wheel_radius}" length="${wheel_length}"/>
            </geometry>
            <origin xyz = "0 0 0" rpy="${PI / 2} 0 0"/>
            <material name="black"/>
        </visual>
    </link> 

    <joint name="${wheel_name}2baselink" type="continuous">
        <parent link = "base_link"/>
        <child link = "${wheel_name}" />
        <origin xyz="0 ${flag*0.1} ${wheel_joint_z}" />
        <axis xyz="0 1 0" />
    </joint>

    </xacro:macro>

    <xacro:wheel_func wheel_name="left_wheel" flag = "1" />
    <xacro:wheel_func wheel_name="right_wheel" flag = "-1" />

    <xacro:property name="small_wheel_radius" value="0.0075"/>
    <xacro:property name="small_joint_z" value="${(base_length / 2 + distance_ground - small_wheel_radius) * -1}"/>

    <xacro:macro name="small_wheel_func" params="small_wheel_name  flag">
    <link name = "${small_wheel_name}">
        <visual>
            <geometry>
                <sphere radius="${small_wheel_radius}" />
            </geometry>
            <origin xyz = "0 0 0" rpy="0 0 0"/>
            <material name="black"/>
        </visual>
    </link> 

    <joint name="${small_wheel_name}2baselink" type="continuous">
        <parent link = "base_link"/>
        <child link = "${small_wheel_name}" />
        <origin xyz="${(base_radius - small_wheel_radius)*flag} 0  ${small_joint_z}" />
        <axis xyz="1 1 1" />
    </joint>

    </xacro:macro>

    <xacro:small_wheel_func small_wheel_name ="front_small_wheel" flag = "1" />
    <xacro:small_wheel_func small_wheel_name ="back_small_wheel" flag = "-1" />
</robot>

5. Xacro_实操

实现流程:

  • 首先编写摄像头和雷达的 xacro 文件
  • 然后再编写一个组合文件,组合底盘、摄像头与雷达
  • 最后,通过 launch 文件启动 Rviz 并显示模型

摄像头 xacro 文件:

<robot name="my_camera" xmlns:xacro="http://wiki.ros.org/xacro">

    <xacro:property name="camera_length" value="0.01" /> 
    <xacro:property name="camera_width" value="0.025" /> 
    <xacro:property name="camera_height" value="0.025" /> 
    <xacro:property name="joint_camera_x" value="0.08" /> 
    <xacro:property name="joint_camera_y" value="0.0" /> 
    <xacro:property name="joint_camera_z" value="${base_length / 2 + camera_height / 2}" /> 

    <link name="camera">
        <visual>
            <geometry>
                <box size="${camera_length} ${camera_width} ${camera_height}" />
            </geometry>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
            <material name="black" />
        </visual>
    </link>

    <joint name="camera2base_link" type="fixed">
        <parent link="base_link" />
        <child link="camera" />
        <origin xyz="${joint_camera_x} ${joint_camera_y} ${joint_camera_z}" />
    </joint>
</robot>

雷达 xacro 文件:

<robot name="my_laser" xmlns:xacro="http://wiki.ros.org/xacro">

    <xacro:property name="support_length" value="0.15" /> 
    <xacro:property name="support_radius" value="0.01" /> 
    <xacro:property name="joint_support_x" value="0.0" /> 
    <xacro:property name="joint_support_y" value="0.0" /> 
    <xacro:property name="joint_support_z" value="${base_length / 2 + support_length / 2}" /> 

    <link name="support">
        <visual>
            <geometry>
                <cylinder radius="${support_radius}" length="${support_length}" />
            </geometry>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
            <material name="red">
                <color rgba="0.8 0.2 0.0 0.8" />
            </material>
        </visual>
    </link>

    <joint name="support2base_link" type="fixed">
        <parent link="base_link" />
        <child link="support" />
        <origin xyz="${joint_support_x} ${joint_support_y} ${joint_support_z}" />
    </joint>


    <xacro:property name="laser_length" value="0.05" /> 
    <xacro:property name="laser_radius" value="0.03" /> 
    <xacro:property name="joint_laser_x" value="0.0" /> 
    <xacro:property name="joint_laser_y" value="0.0" /> 
    <xacro:property name="joint_laser_z" value="${support_length / 2 + laser_length / 2}" /> 


    <link name="laser">
        <visual>
            <geometry>
                <cylinder radius="${laser_radius}" length="${laser_length}" />
            </geometry>
            <origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" />
            <material name="black" />
        </visual>
    </link>

    <joint name="laser2support" type="fixed">
        <parent link="support" />
        <child link="laser" />
        <origin xyz="${joint_laser_x} ${joint_laser_y} ${joint_laser_z}" />
    </joint>
</robot>

组合底盘摄像头与雷达的 xacro 文件

<robot name="mycar" xmlns:xacro="http://wiki.ros.org/xacro">
    <xacro:include filename="demo06_base_footprint.urdf.xacro" />
    <xacro:include filename="demo07_car_camera.urdf.xacro" />
    <xacro:include filename="demo08_car_lidar.urdf.xacro" />
</robot>

launch 文件

<launch> 
    <param name="robot_description" command="$(find xacro)/xacro $(find  urdf01_rviz)/urdf/xacro/car.urdf.xacro" />
    <!--启动rviz -->
    <node pkg = "rviz" type = "rviz" name="rviz" args="-d $(find urdf01_rviz)/config/demo01.rviz"/>
    <!-- 添加关节状态发布节点 -->
    <node pkg="joint_state_publisher" type="joint_state_publisher" name="joint_state_publisher" />
    <!-- 添加机器人状态发布节点 -->
    <node pkg="robot_state_publisher" type="robot_state_publisher" name="robot_state_publisher" />
    <!-- 可选:用于控制关节运动的节点 -->
    <node pkg="joint_state_publisher_gui" type="joint_state_publisher_gui" name="joint_state_publisher_gui" />
</launch>

在这里插入图片描述

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

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

相关文章

SpringBoot自动配置原理

1、自动配置原理 1、我们编写的SpringBoot启动类上有一个SpringBootApplication注解&#xff0c;表示当前类是springboot的启动类(入口类)。 package com.baidou;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBo…

微信小程序2.9.0基础库canvas2D新API,生成海报保存到手机功能实现

canvasToTempFilePath的官方文档写着在 draw()回调里调用该方法才能保证图片导出成功。文档地址&#xff1a;wx.canvasToTempFilePath(Object object, Object this) | 微信开放文档 我在这里面使用的canva 获取canvas实例&#xff0c;使用的官方的代码。用一个变量canvas保存实…

聊聊 AI 平台存储方案和选型

最近火爆全网的 ChatGPT 再次带来一股 AI 热潮。 过去的五年&#xff0c;AI 快速发展并应用到很多领域中。作为一家存储企业&#xff0c;我们也感受到了 AI 行业的活力&#xff0c;和我们交流团队中&#xff0c;AI 企业越来越多&#xff0c;有自动驾驶、蛋白质结构预测、量化投…

【HTML】【消失的花木兰】花木兰:三兔蹦迪走,安能辨我是兔子?

前言 &#xff08;改编&#xff09;  某日&#xff0c;参军后的花木兰刚回到家乡&#xff0c;却不料遇上抓拿自己的官兵… 因此&#xff0c;花木兰变成兔子躲了起来&#xff0c;你能否找到躲起来的花木兰呢&#xff1f;一起来拭目以待… 一、游戏名称与游戏规则&#xff08…

joinquant量化数据精准吗?

在股票量化投资中&#xff0c;joinquant量化数据起到很大的作用&#xff0c;因为joinquant量化平台的数据能够从众多只股票数据中&#xff0c;能够一一罗列出来&#xff0c;也就是说&#xff0c;joinquant量化数据可以在计算和分析数据模型中&#xff0c;能够帮助投资者找到他们…

【SpringBoot1】创建第一个SpringBoot项目

创建SpringBoot项目可以通过两种方式&#xff1a; 1、通过访问&#xff1a;https://start.spring.io/&#xff0c;SpringBoot的官方网站进行创建SpringBoot项目&#xff1b; 2、通过工具&#xff08;例如&#xff1a;Idea&#xff09;创建SpringBoot项目。本次使用IDEA创建第一…

数据结构进阶 红黑树

作者&#xff1a;小萌新 专栏&#xff1a;数据结构进阶 作者简介&#xff1a;大二学生 希望能和大家一起进步&#xff01; 本篇博客简介&#xff1a;介绍高阶数据结构: 红黑树 红黑树红黑树的概念红黑树的性质红黑树节点的定义红黑树的插入情况一情况二情况三红黑树的验证红黑…

远程监控网络摄像头通用指南

一、引言 随着物联网技术的发展&#xff0c;越来越多的场景需要我们通过技术手段去感知。画面和声音相当于机器的眼睛和耳朵&#xff0c;有了这些实时数据我们可以做很多事情&#xff0c;比如车牌识别、人脸识别、体温识别等等。本文将全方位介绍网络摄像头如何接入软件的实现…

2022.12 青少年机器人技术等级考试理论综合试卷(四级)

2022年12月 青少年机器人技术等级考试理论综合试卷&#xff08;四级&#xff09; 分数&#xff1a; 100 题数&#xff1a; 30 一、 单选题(共 20 题&#xff0c; 共 80 分) 1.以下关于 Arduino C 语言的说法&#xff0c; 正确的是?&#xff08; &#xff09; A.setup() 函数和…

SpringMVC Interceptor拦截器

SpringMVC中的拦截器用于拦截控制器方法的执行&#xff0c;执行在Controller前后&#xff0c;和视图渲染完成后。如下图所示&#xff1a; 一、创建拦截器 继承HandlerInterceptor 接口&#xff0c;并实现其中的方法 public class FirstInterceptor implements HandlerInter…

儿子小伟刚刚再婚,大衣哥就河南新乡商演,这是给孙子攒奶粉钱吗

现如今的社会&#xff0c;因为人们的攀比心理&#xff0c;结一次婚能让人脱一层皮&#xff0c;尤其是农村赚钱难&#xff0c;结婚花钱就更难了。其实不只是普通老百姓&#xff0c;强如农民歌唱家大衣哥这样的人&#xff0c;也架不住儿子一而再&#xff0c;再而三的结婚。 大衣哥…

Qt基础之二十一:QtRO(Qt Remote Object)实现进程间通信

这里将QtRO单独从上一篇Qt基础之二十:进程间通信拎出来,因为它是Qt5.9以后新加入的模块,专门用于进程间通信。其使用步骤有点类似之前介绍过的RPC(Remote Procedure Call)框架:gRPC和thrift,关于这两个框架详见 Qt中调用thrift和Qt中调用gRPC QtRO基于Socket封装,不仅支…

小程序开发——模板与配置

一、WXML 模板语法 1.数据绑定的基本原则 ① 在 data 中定义数据 ② 在 WXML 中使用数据2.在 data 中定义页面的数据 在页面对应的 .js 文件中&#xff0c;把数据定义到 data 对象中即可&#xff1a;3. Mustache 语法的格式 把data中的数据绑定到页面中渲染&#xff0c;使用…

【测试】java+selenium环境搭建

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录一、下载安装谷歌浏览器二、下载谷歌驱动三、常见问题&解决方法1. SessionNotCreatedException2. The version of ChromeDriver only support xxxxxxxxx3. The path to the driver executable the path to普通小…

5-2输入/输出管理-I/O核心子系统

文章目录一.I/O调度二.设备保护三.SPOOLing技术&#xff08;假脱机技术&#xff09;四.设备的分配与回收1.设备分配时应该考虑的因素2.静态分配和动态分配3.设备分配管理中的数据结构&#xff08;1&#xff09;设备控制表DCT&#xff08;Device Control Table&#xff09;&…

MySQL进阶篇之Linux安装MySQL8.0.26

Linux安装MySQL 需要更多安装MySQL的教程&#xff0c;请查阅Linux学习笔记——MySQL数据库管理系统安装部署 1、MySQL下载地址&#xff1a;https://downloads.mysql.com/archives/community/ 2、在FinalShell中输入rz&#xff0c;然后选择下载好的MySQL安装包&#xff0c;进行上…

【数据质量】一起聊聊数据质量

Garbage In, Garbage Out ​ 数据质量关注的是数据的健康&#xff0c;数据健康和人的健康很相似&#xff0c;人的健康会影响人的生活品质&#xff0c;同样数据的健康会影响数据的使用品质。为了保证我们健康&#xff0c;我们需要养成良好的生活习惯&#xff0c;膳食平衡&#x…

Open3D DBSCAN聚类(Python版本)

文章目录 一、简介二、算法步骤三、实现代码四、实现效果参考资料一、简介 DBSCAN算法,全称为“Density-Based Spatial Clustering of Applications with Node”,也就是“基于密度的聚类”。此类算法是假设聚类结构能通过样本分布的紧密程度确定,从样本密度的角度来考察样本…

亿发浅析:财务一体化功能与管理流程

在信息时代的背景下&#xff0c;企业信息化已成为中小企业降低成本、提高效率、提高竞争力的重要手段&#xff0c;也是中小企业实现长期可持续发展的有效途径。 信息化对企业管理的好处是显而易见的&#xff0c;如加快信息流&#xff0c;提高信息资源利用率&#xff0c;促进企业…

STM32使用FSMC驱动LCD

关于FSMC驱动LCD的函数LCD_WR_REG的理解首先你需要理解使用结构体LCD_BASE若有错误&#xff0c;请各位师兄师姐指点原理框图重要的函数理解关于LCD_BASE和函数LCD_WR_REG&#xff08;u16 regval&#xff09;的理解至于0X6C00 0802地址也是一样的。首先要说的是这是我个人的理解…