迷你无人车 Navigation 导航(3)

迷你无人车 Navigation 导航(3)

自己实现了对于迷你无人车关节的控制,由于原本的关节布置仅支持阿克曼转向,因此先进行阿克曼转向的控制

修改 URDF 文件

添加 transmission 标签,定义关节的驱动

<transmission name="right_rear_joint_trans"><type>transmission_interface/SimpleTransmission</type><joint name="right_rear_joint"><hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface></joint><actuator name="right_rear_joint_motor"><hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface><mechanicalReduction>1</mechanicalReduction></actuator></transmission>
<transmission name="front_steer_right_joint_trans"><type>transmission_interface/SimpleTransmission</type><joint name="front_steer_right_joint"><hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface></joint><actuator name="front_steer_right_joint_motor"><hardwareInterface>hardware_interface/EffortJointInterface</hardwareInterface><mechanicalReduction>1</mechanicalReduction></actuator>
</transmission>

注意位置控制关节中 limit 的设置,一开始均设置为 0,无法进行位置控制

<joint name="front_steer_right_joint" type="revolute"><origin rpy="0 0 0"  xyz="0.17 -0.21 0.102" /><parent link="base_link" /><child link="front_steer_right_link" /><axis xyz="0 0 1" />     <!-- charge steer direction default is 0 0 1--><limit lower="-0.69" upper="0.69" effort="2.0" velocity="1.0" /></joint>

配置 ros_control 插件

<gazebo><plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so"><!-- <robotSimType>steer_bot_hardware_gazebo/SteerBotHardwareGazebo</robotSimType><legacyModeNS>false</legacyModeNS> --><robotNamespace>/steer_neor_mini</robotNamespace><robotSimType>gazebo_ros_control/DefaultRobotHWSim</robotSimType><legacyModeNS>true</legacyModeNS></plugin></gazebo>

注意命名空间的设置

配置 yaml 文件

在该文件中添加各关节控制器类型(速度控制/位置控制),以及控制器的 PID 系数

steer_neor_mini:joint_state_controller:type: joint_state_controller/JointStateControllerpublish_rate: 50# Velocity Controllers ----速度控制器---------------------left_rear_wheel_velocity_controller:type: effort_controllers/JointVelocityControllerjoint: left_rear_jointpid: {p: 1.0, i: 0.0, d: 0.0, i_clamp: 0.0}right_rear_wheel_velocity_controller:type: effort_controllers/JointVelocityControllerjoint: right_rear_jointpid: {p: 1.0, i: 0.0, d: 0.0, i_clamp: 0.0}left_front_wheel_velocity_controller:type: effort_controllers/JointVelocityControllerjoint: front_left_wheel_jointpid: {p: 1.0, i: 0.0, d: 0.0, i_clamp: 0.0}right_front_wheel_velocity_controller:type: effort_controllers/JointVelocityControllerjoint: front_right_wheel_jointpid: {p: 1.0, i: 0.0, d: 0.0, i_clamp: 0.0}# Position Controllers ---位置控制器-----------------------left_steering_hinge_position_controller:joint: front_steer_left_jointtype: effort_controllers/JointPositionControllerpid: {p: 0.5, i: 0.0, d: 0.0}right_steering_hinge_position_controller:joint: front_steer_right_jointtype: effort_controllers/JointPositionControllerpid: {p: 0.5, i: 0.0, d: 0.0}

配置 launch 文件

<?xml version="1.0"?>
<launch><arg name="x" default="0.0"/><arg name="y" default="0.0"/><arg name="z" default="0.0" /><arg name="roll" default="0.0"/><arg name="pitch" default="0.0"/><arg name="yaw" default="0.0"/><arg name="controllers" default="joint_state_controllerleft_rear_wheel_velocity_controller right_rear_wheel_velocity_controllerleft_front_wheel_velocity_controller right_front_wheel_velocity_controllerleft_steering_hinge_position_controller right_steering_hinge_position_controller"/><!-- Gazebo  --><!--Load the surrounding environment into Gazebo--><include file="$(find gazebo_ros)/launch/empty_world.launch" ><arg name="world_name" value="$(find neor_mini)/worlds/cooneo_office.world"/></include><!-- Load the robot description --><param name="robot_description" command="cat $(find neor_mini)/urdf/neor_mini_gazebo_sensors.urdf"/><!-- Load ros_controllers configuration parameters --><!-- <rosparam file="$(find steer_mini_gazebo)/mini_control/config/ctrl_ackermann_steering_controller.yaml" command="load"   /> --><!-- <rosparam file="$(find steer_mini_gazebo)/mini_control/config/ctrl_gains.yaml" command="load"   /> --><rosparam file="$(find steer_mini_gazebo)/mini_control/config/ctrl_joint_state_publisher.yaml" command="load"   /><!-- <rosparam file="$(find steer_mini_gazebo)/mini_control/config/ctrl_steer_bot_hardware_gazebo.yaml" command="load"   /> --><rosparam file="$(find steer_mini_gazebo)/mini_control/config/my_controller.yaml" command="load"/><!-- Spawn the controllers --><!-- <node pkg="controller_manager" type="spawner" name="controller_spawner"  args="joint_state_publisher ackermann_steering_controller" output="screen" respawn="false" /> --><node pkg="controller_manager" type="spawner" name="controller_spawner" output="screen" respawn="false" ns="/steer_neor_mini" args="$(arg controllers)"/><!-- Launch  the robot state publisher --><node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"><param name="publish_frequency" value="50.0"/><remap from="/joint_states" to="/steer_neor_mini/joint_states"/></node><!-- Launch a rqt steering GUI for publishing to /steer_bot/steer_drive_controller/cmd_vel --><!-- <node pkg="rqt_robot_steering" type="rqt_robot_steering" name="rqt_robot_steering" > --><!-- <param name="default_topic" value="ackermann_steering_controller/cmd_vel"/>                         default velocity control topic name --><!-- <param name="default_vx_max" value="1.0"/>                        linear velocity max value    m/s --><!-- <param name="default_vx_min" value="-1.0"/>                       linear velocity min value    m/s --><!-- <param name="default_vw_max" value="0.69"/>                    angular velocity max value  rad/s (adaptor for urdf joint limit) --><!-- <param name="default_vw_min" value="-0.69"/>                   angular velocity min value  rad/s (adaptor for urdf joint limit) --><!-- </node> --><!-- Start the Gazebo node and configure the location and posture of the accident when the model is loaded --><node name="spawn_vehicle" pkg="gazebo_ros" type="spawn_model" args="-urdf -param robot_description -model neor_mini -gazebo_namespace /gazebo -x $(arg x) -y $(arg y) -z $(arg z)-R $(arg roll) -P $(arg pitch) -Y $(arg yaw)"respawn="false" output="screen" /><!-- ******************************************************************************************************************************************* --><node name="laser_to_base_link" pkg="tf" type="static_transform_publisher" args="0.0 0.0 0.135 0 0 0 base_link laser_link 40 " /><node name="imu_to_base_link" pkg="tf" type="static_transform_publisher" args="-0.10 0.0 0.02 0 0 0 base_link imu_link 40 " /><node name="camera_to_base_link" pkg="tf" type="static_transform_publisher" args="0.12 0.0 0.12 0 0 0 base_link camera_link 40 " /></launch>

💡 注意各文件中命名空间的一致性

车轮速度解算

沿用四轮车的解算代码,更新车长、车宽以及车轮直径参数,目前只进行阿克曼转向的解算控制

#include <cmd_to_neor/wheelparams.h>
#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
#include <std_msgs/Float64.h>
#include <Eigen/Core>
#include <Eigen/Dense>
#include <cmath>
#include <iostream>
#include <mutex>
#include "myTools.hpp"
using namespace std;
using namespace Eigen;ros::Publisher pub_vel_left_rear_wheel;
ros::Publisher pub_vel_right_rear_wheel;
ros::Publisher pub_vel_left_front_wheel;
ros::Publisher pub_vel_right_front_wheel;
ros::Publisher pub_pos_left_steering_hinge;
ros::Publisher pub_pos_right_steering_hinge;
cmd_to_neor::wheelparams w_params;
AidTool::Ptr aidtool;Matrix<double, 8, 3> coff_mat; // 机器人模型参数矩阵
Matrix<double, 3, 1> xyw;      // 机器人Vx, Vy, W向量
Matrix<double, 8, 1> p_xyw;// 机器人长的一半
const double half_len = 0.3492 / 2;
// 机器人宽的一半
const double half_wid = 0.36 / 2;
const double WHELL_DIA = 0.0625;
const double REDUCER_RATIO = 1.0;mutex mut;void computeWheelVel_pivotSteer();
void computeWheelVel_ackermannSteer(double linear_vel, double front, double rear);
double computeAckermannRatio(double vel);std_msgs::Float64 vel_left_rear_wheel;
std_msgs::Float64 vel_right_rear_wheel;
std_msgs::Float64 vel_left_front_wheel;
std_msgs::Float64 vel_right_front_wheel;
std_msgs::Float64 pos_left_steering_hinge;
std_msgs::Float64 pos_right_steering_hinge;double toRealVel(const double vel){return vel / (M_PI * WHELL_DIA) * REDUCER_RATIO;
}double toReaPos(const double pos){return pos * 180 / M_PI * REDUCER_RATIO;
}void robot_callback(const geometry_msgs::Twist::ConstPtr &msg)
{memset(&w_params, 0, sizeof(w_params));doublelinear_vel = msg->linear.x;double front_angle = msg->angular.z;computeWheelVel_ackermannSteer(linear_vel, front_angle, 0);vel_left_rear_wheel.data = toRealVel(w_params.lb_v);vel_right_rear_wheel.data = toRealVel(w_params.rb_v);vel_left_front_wheel.data = toRealVel(w_params.lf_v);vel_right_front_wheel.data = toRealVel(w_params.rf_v);pos_left_steering_hinge.data = w_params.lf_p;pos_right_steering_hinge.data = w_params.rf_p;cout << "lr_v:" << vel_left_rear_wheel.data << ";rr_v:" << vel_right_rear_wheel.data << \";lf_v:" << vel_left_front_wheel.data << ";rf_v:" << vel_right_front_wheel.data << endl;cout << "lf_p:" << pos_left_steering_hinge.data << ";rf_p:" << pos_right_steering_hinge.data << endl;cout << "--------------" << endl; lock_guard<mutex> lock(mut);pub_vel_left_rear_wheel.publish(vel_left_rear_wheel);pub_vel_right_rear_wheel.publish(vel_right_rear_wheel);pub_vel_left_front_wheel.publish(vel_left_front_wheel);pub_vel_right_front_wheel.publish(vel_right_front_wheel);pub_pos_left_steering_hinge.publish(pos_left_steering_hinge);pub_pos_right_steering_hinge.publish(pos_right_steering_hinge);mut.unlock();
}int main(int argc, char **argv)
{coff_mat << 1, 0, -half_wid,0, 1, half_len,1, 0, -half_wid,0, 1, -half_len,1, 0, half_wid,0, 1, -half_len,1, 0, half_wid,0, 1, half_len;const string vel_left_rear_wheel_topic = "/steer_neor_mini/left_rear_wheel_velocity_controller/command";const string vel_right_rear_wheel_topic = "/steer_neor_mini/right_rear_wheel_velocity_controller/command";const string vel_left_front_wheel_topic = "/steer_neor_mini/left_front_wheel_velocity_controller/command";const string vel_right_front_wheel_topic = "/steer_neor_mini/right_front_wheel_velocity_controller/command";const string pos_left_steering_hinge_topic = "/steer_neor_mini/left_steering_hinge_position_controller/command";const string pos_right_steering_hinge_topic = "/steer_neor_mini/right_steering_hinge_position_controller/command";aidtool = make_shared<AidTool>();ros::init(argc, argv, "cmd_to_neor");ros::NodeHandle nh;pub_vel_left_rear_wheel = nh.advertise<std_msgs::Float64>(vel_left_rear_wheel_topic, 1);pub_vel_right_rear_wheel = nh.advertise<std_msgs::Float64>(vel_right_rear_wheel_topic, 1);pub_vel_left_front_wheel = nh.advertise<std_msgs::Float64>(vel_left_front_wheel_topic, 1);pub_vel_right_front_wheel = nh.advertise<std_msgs::Float64>(vel_right_front_wheel_topic, 1);pub_pos_left_steering_hinge = nh.advertise<std_msgs::Float64>(pos_left_steering_hinge_topic, 1);pub_pos_right_steering_hinge = nh.advertise<std_msgs::Float64>(pos_right_steering_hinge_topic, 1);ros::Subscriber sub = nh.subscribe("/cmd_vel", 1, robot_callback);ros::spin();return 0;
}void computeWheelVel_pivotSteer()
{lock_guard<mutex> lock(mut);// 左前if (p_xyw(0, 0) == 0){if (p_xyw(1, 0) > 0){w_params.lf_p = M_PI_2;}else if (p_xyw(1, 0) < 0){w_params.lf_p = -M_PI_2;}else{w_params.lf_p = 0;}}else{w_params.lf_p = atan(p_xyw(1, 0) / p_xyw(0, 0));}if (p_xyw(0, 0) == 0.0 && p_xyw(1, 0) == 0.0){w_params.lf_v = 0.0;}else if (p_xyw(0, 0) == 0){w_params.lf_v = p_xyw(1, 0) / sin(w_params.lf_p);}else{w_params.lf_v = p_xyw(0, 0) / cos(w_params.lf_p);}// 左后if (p_xyw(2, 0) == 0){if (p_xyw(3, 0) > 0){w_params.lb_p = M_PI_2;}else if (p_xyw(3, 0) < 0){w_params.lb_p = -M_PI_2;}else{w_params.lb_p = 0;}}else{w_params.lb_p = atan(p_xyw(3, 0) / p_xyw(2, 0));}if (p_xyw(2, 0) == 0.0 && p_xyw(3, 0) == 0.0){w_params.lb_v = 0.0;}else if (p_xyw(2, 0) == 0){w_params.lb_v = p_xyw(3, 0) / sin(w_params.lb_p);}else{w_params.lb_v = p_xyw(2, 0) / cos(w_params.lb_p);}// 右后if (p_xyw(4, 0) == 0){if (p_xyw(5, 0) > 0){w_params.rb_p = M_PI_2;}else if (p_xyw(5, 0) < 0){w_params.rb_p = -M_PI_2;}else{w_params.rb_p = 0;}}else{w_params.rb_p = atan(p_xyw(5, 0) / p_xyw(4, 0));}if (p_xyw(4, 0) == 0.0 && p_xyw(5, 0) == 0.0){w_params.rb_v = 0.0;}else if (p_xyw(4, 0) == 0){w_params.rb_v = p_xyw(5, 0) / sin(w_params.rb_p);}else{w_params.rb_v = p_xyw(4, 0) / cos(w_params.rb_p);}// 右前if (p_xyw(6, 0) == 0){if (p_xyw(7, 0) > 0){w_params.rf_p = M_PI_2;}else if (p_xyw(7, 0) < 0){w_params.rf_p = -M_PI_2;}else{w_params.rf_p = 0;}}else{w_params.rf_p = atan(p_xyw(7, 0) / p_xyw(6, 0));}if (p_xyw(6, 0) == 0.0 && p_xyw(7, 0) == 0.0){w_params.rf_v = 0.0;}else if (p_xyw(6, 0) == 0){w_params.rf_v = p_xyw(7, 0) / sin(w_params.rf_p);}else{w_params.rf_v = p_xyw(6, 0) / cos(w_params.rf_p);}mut.unlock();
}void computeWheelVel_ackermannSteer(double linear_vel, double front, double rear)
{lock_guard<mutex> lock(mut);// cout << "front_angle: " << aidtool->rad2deg(front) << "\t rear_angle: " << aidtool->rad2deg(rear) << endl;double d_vertical = 0.0, l_up = half_len;if (front != 0){d_vertical = 2 * half_len * cos(front) * cos(rear) / sin(front - rear);l_up = 2 * half_len * sin(front) * cos(rear) / sin(front - rear);// cout << "d_vertical: " << d_vertical << "\tl_up: " << l_up << endl;w_params.lf_p = atan(2 * half_len * sin(front) * cos(rear) / (2 * half_len * cos(front) * cos(rear) - half_wid * sin(front - rear)));w_params.rf_p = atan(2 * half_len * sin(front) * cos(rear) / (2 * half_len * cos(front) * cos(rear) + half_wid * sin(front - rear)));w_params.lb_p = atan(2 * half_len * cos(front) * sin(rear) / (2 * half_len * cos(front) * cos(rear) - half_wid * sin(front - rear)));w_params.rb_p = atan(2 * half_len * cos(front) * sin(rear) / (2 * half_len * cos(front) * cos(rear) + half_wid * sin(front - rear)));}double Rc = sqrt(pow(half_len - l_up, 2) + pow(d_vertical, 2));if (Rc == 0){w_params.lf_v = linear_vel;w_params.rf_v = linear_vel;w_params.lb_v = linear_vel;w_params.rb_v = linear_vel;}else{double Rlf = sqrt(pow(l_up, 2) + pow(d_vertical - half_wid, 2));double Rrf = sqrt(pow(l_up, 2) + pow(d_vertical + half_wid, 2));double Rlr = sqrt(pow(2 * half_len - l_up, 2) + pow(d_vertical - half_wid, 2));double Rrr = sqrt(pow(2 * half_len - l_up, 2) + pow(d_vertical + half_wid, 2));double angular_vel = linear_vel / Rc;w_params.lf_v = angular_vel * Rlf;w_params.rf_v = angular_vel * Rrf;w_params.lb_v = angular_vel * Rlr;w_params.rb_v = angular_vel * Rrr;}mut.unlock();
}double computeAckermannRatio(double vel)
{double corner_stiffness = -100000.0;double mass = 250;lock_guard<mutex> lock(mut);double ratio = 1 - 4 * half_len * corner_stiffness / (2 * half_len * corner_stiffness - mass * pow(vel, 2));mut.unlock();return ratio;
}

话题组织

完整的话题组织如下,可以通过 Logitech 手柄控制 Gazebo 中的迷你无人车以阿克曼转向方式运动

在这里插入图片描述

实际效果如下

在这里插入图片描述

下一步计划修改 URDF 模型进行四轮转向和原地转向控制

参考

阿克曼结构移动机器人的gazebo仿真(五)

阿克曼结构移动机器人的gazebo仿真(六)

https://wiki.ros.org/urdf/XML/Transmission

https://wiki.ros.org/urdf/XML/joint

探究–gazebo里 关节是如何动起来的____实现默认插件joint控制

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

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

相关文章

Mysql binlog的三种模式statement,row,mixed详解,以及无主键造成复制延时的测试

2.1 Statement 模式的概念 Statement 是基于语句的复制模式。 Statement 模式将数据库中执行的修改操作记录为 SQL 语句&#xff0c;再从数据库上执行相同的 SQL 语句来实现数据同步。 2.2 Statement 模式的优点 Statement 模式的优点是简单明了&#xff0c;易于理解和实现。…

基于Java SSM+layui+mysql实现的图书借记管理系统源代码+数据库

介绍 本项目使用的技术栈是SSMlayuimysql&#xff0c;服务器使用的是tomcat 其中书籍图片存放的位置需要先在tomcat根目录下conf/setting.xml中配置虚拟路径&#xff0c;本项目配置的是D:\upload 完整代码下载地址&#xff1a;图书借记管理系统 用户角色划分 游客 使用本系…

ArcGis地图

1、概述 官网&#xff1a;https://developers.arcgis.com/qt/ 官网&#xff1a;官网指导 官网&#xff1a;Add graphics to a map view 官网&#xff1a;Esri官方博客 官网(github)&#xff1a;https://github.com/Esri Arcgis runtime sdk for Qt 开发记录&#xff08;系列文…

Vue+NodeJS实现邮件发送

一.邮箱配置 这里以QQ邮箱为例,网易邮箱类似. 设置->账号 二.后端服务搭建 index.js const express require(express) const router require(./router); const app express()// 使用路由文件 app.use(/,router);app.listen(3000, () > {console.log(server…

项目上线部署--》网站运行机制

网站运行机制 &#x1f31f;名词解释 域名 DNS 服务器 服务器 &#x1f31f; 网站请求流程 静态页面 动态页面 前后端分离的页面 前后端不分离的页面 &#x1f31f;写在最后 &#x1f31f;名词解释 域名 www.baidu.comwww.taobao.comwww.qq.com 域名俗称网址&#xf…

Linux centos7 bash编程训练__打印各类形状

利用for循环&#xff0c;打印各种不同的三角形、矩形和菱形。 主要是fort循环嵌套使用&#xff0c;及条件判断等。 因方法简单&#xff0c;不作更多解释&#xff0c;部分注释可以帮助初学者掌握代码。 下面列出代码&#xff0c;供参考。 #! /bin/bash ## 打印输出各种*型形…

觉非科技数据闭环系列 | BEV感知研发实践

随着自动驾驶迈向量产场景&#xff0c;“BEV感知数据闭环”已成为新一代自动驾驶量产系统的核心架构。数据成为了至关重要的技术驱动力&#xff0c;发挥数据闭环的飞轮效应或将成为下半场从1到N的胜负关键。 觉非科技在此方面已进行了大量的研究工作&#xff0c;并在实际量产项…

解决nbsp;不生效的问题

代码块 {{title}} title:附 \xa0\xa0\xa0件,//或者 <span v-html"title"></span> title:附 件&#xff1a;,效果图

Elasticsearch近实时架构

1 Elasticsearch 与 Lucene 的结构理解 一个Elasticsearch索引由一个或多个分片&#xff08;shards&#xff09;组成。这些分片可以是主分片&#xff08;primary shard&#xff09;或副本分片&#xff08;replica shard&#xff09;。每个分片都是一个独立的Lucene索引&#xf…

Unity 性能优化Shader分析处理函数:ShaderUtil.GetShaderGlobalKeywords用法

Unity 性能优化Shader分析处理函数&#xff1a;ShaderUtil.GetShaderGlobalKeywords用法 点击封面跳转下载页面 简介 Unity 性能优化Shader分析处理函数&#xff1a;ShaderUtil.GetShaderGlobalKeywords用法 在Unity开发中&#xff0c;性能优化是一个非常重要的方面。一个常见…

修改Tomcat的默认端口号

1、找到Tomcat的安装路径。 2、打开conf文件夹。 3、用记事本打开server.xml文件 4、找到 <Connector port"8080" protocol"HTTP/1.1"&#xff0c;其中的8080就是tomcat的默认端口&#xff0c;将其修改为你需要的端口即可。

github 创建自己的分支 并下载代码

github创建自己的分支 并下载代码 目录概述需求&#xff1a; 设计思路实现思路分析1.进入到master分支&#xff0c;git checkout master;2.master-slave的个人远程仓库3.爬虫调度器4.建立本地分支与个人远程分支之间的联系5.master 拓展实现 参考资料和推荐阅读 Survive by day…

Prometheus 监控指南:如何可靠地记录数字时间序列数据

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f405;&#x1f43e;猫头虎建议程序员必备技术栈一览表&#x1f4d6;&#xff1a; &#x1f6e0;️ 全栈技术 Full Stack: &#x1f4da…

第69步 时间序列建模实战:ARIMA建模(R)

基于WIN10的64位系统演示 一、写在前面 这一期&#xff0c;我们使用R进行SARIMA模型的构建。 同样&#xff0c;这里使用这个数据&#xff1a; 《PLoS One》2015年一篇题目为《Comparison of Two Hybrid Models for Forecasting the Incidence of Hemorrhagic Fever with Re…

html的日期选择插件

1.效果 2.文档 https://layui.gitee.io/v2/docs/ 3.引入 官网地址&#xff1a; https://layui.gitee.io/v2/ 引入&#xff08;在官网下载&#xff0c;&#xff09;jquery-1.7.2.min.js,layui/layui.js **<link href"js/layui/css/layui.css" rel"stylesh…

Mysql数据库基础和增删改查操作

一、数据库基本概念 数据&#xff1a;描述事物的符号记录&#xff0c;包括数字&#xff0c;文字、图形、图像、声音、档案记录等&#xff0c;以“记录”形式按统一的格式进行存储。 表&#xff1a;将不同的记录组织在一起用来存储具体数据。 数据库&#xff1a;表的集合&…

10.2 整流电路

在分析整流电路时&#xff0c;为了突出重点&#xff0c;简化分析过程&#xff0c;一般均假定负载为纯电阻性&#xff1b;整流二极管为理想二极管&#xff0c;即导通时正向压降为零&#xff0c;截止时反向电流为零&#xff1b;变压器无损耗&#xff0c;内部压降为零等。 一、整…

java封装国密SM4为 jar包,PHP调用

java封装国密SM4为 jar包,PHP调用 创建java工程引入SM4 jar包封装CMD可调用jar包PHP 传参调用刚用java弄了个class给php调用,本以为项目上用到java封装功能的事情就结束了,没想到又来了java的加密需求,这玩意上头,毕竟不是强项,没办法,只好再次封装。 但是这次的有点不…

thinkPhp5返回某些指定字段

//去除掉密码$db new UserModel();$result $db->field(password,true)->where("username{$params[username]} AND password{$params[password]}")->find(); 或者指定要的字段的数组 $db new UserModel();$result $db->field([username,create_time…

总结986

时间记录&#xff1a; 7:10起床 8:00~下午2:00课程设计&#xff0c;偷学了3小时 2:17~3:55午觉 4:10~5:30计网 5:35~6:41数据结构 7:00~7:22继续数据结构课后习题重做 7:23~8:07考研政治&#xff0c;做题20道纠错 8:15~8:39每日长难句 8:39~10:21 14年tex2纠错标记 1…