机器人入门(四)—— 创建你的第一个虚拟小车
机器人入门(四)—— 创建你的第一个虚拟小车
- 一、小车建立过程
- 1.1 dd_robot.urdf —— 建立身体
- 1.2 dd_robot2.urdf —— 添加轮子
- 1.3 dd_robot3.urdf —— 添加万向轮
- 1.4 dd_robot4.urdf —— 添加颜色
- 1.5 dd_robot5.urdf —— 添加碰撞检测(Collision Detection)
- 1.6 使用gui模式转动小车车轮
- 1.7 dd_robot6.urdf —— 添加惯性属性
- 二、Gazebo仿真实验
- 2.1 环境预备与问题处理
- 2.2 dd_robot.gazebo
- 三、其它仿真手段
- 3.1 Matlab
- 3.2 Stage
- 3.3 Virtual Robot Experimentation Platform (V-REP)
- 四、六大关节种类
- 无限旋转关节(continous)
- 固定关节(fixed)
- 有限旋转关节(revolute)
- 滑动关节(prismatic)
- 浮动关节(floating)
- 平面关节(planar)
- 总结
参考书籍为:ROS Robotics By Example (Second Edition) —— Carol Fairchild Dr.Thomas L.Harman,微信读书可免费阅读。
一、小车建立过程
首先,在catkin_ws工作空间下,使用catking_create_pkg建立package目录ros_robotics
programmer@ubuntu:~/catkin_ws/src$ catkin_create_pkg ros_robotics
Created file ros_robotics/package.xml
Created file ros_robotics/CMakeLists.txt
Successfully created files in /home/programmer/catkin_ws/src/ros_robotics. Please adjust the values in package.xml.
然后,使用catkin_make进行编译
programmer@ubuntu:~/catkin_ws/src$ cd ~/catkin_ws
programmer@ubuntu:~$ catkin_make
再建立urdf目录,用来存放描述机器人的文件
programmer@ubuntu:~/catkin_ws/src/ros_robotics$ cd ~/catkin_ws/src/ros_robotics
programmer@ubuntu:~/catkin_ws/src/ros_robotics$ mkdir urdf
programmer@ubuntu:~/catkin_ws/src/ros_robotics$ cd urdf
本节的代码文件都可以直接从github下载,不想阅读源码可通过该链接下载 ROS-Robotics-By-Example-2nd-Edition/Chapter2_code/ros_robotics/urdf/,,如果不想下载全部,只下载指定的文件内容,看这篇文章《如何从 GitHub 上下载指定项目的单个文件或文件夹》。
1.1 dd_robot.urdf —— 建立身体
并在urdf目录下,建立一份dd_robot.urdf文件,但记得拷贝进去时,内容里不要有中文,经实践,中文不在其支持的字符范围内,解析会出错,内容为:
<?xml version='1.0'?>
<robot name="dd_robot"><!-- Base Link --><link name="base_link"><visual><!--放置的位置在(x,y,z) = (0,0,0)处,摆放方式有roll(滚动), pitch(俯仰), yaw(偏向)--><origin xyz="0 0 0" rpy="0 0 0" /><geometry><!--形状是box,长宽高是0.5 0.5 0.25,单位m--><box size="0.5 0.5 0.25"/></geometry></visual></link></robot>
然后前往ros_robotics目录下,建立一个子目录launch,并在此目录下建立一份ddrobot_rviz.launch文件
programmer@ubuntu:~/catkin_ws/src/ros_robotics/urdf$ cd ..
programmer@ubuntu:~/catkin_ws/src/ros_robotics$ mkdir launch
programmer@ubuntu:~/catkin_ws/src/ros_robotics$ vim ddrobot_rviz.launch
<!--ddrobot_rviz.launch-->
<launch><!-- values passed by command line input --><arg name="model" /><arg name="gui" default="False" /><!-- set these parameters on Parameter Server --><param name="robot_description" textfile="$(find ros_robotics)/urdf/$(arg model)"/><param name="use_gui" value="$(arg gui)"/><!-- Start 3 nodes: joint_state_publisher,robot_state_publisher and rviz --><node name="joint_state_publisher"pkg="joint_state_publisher"type="joint_state_publisher" /><node name="robot_state_publisher"pkg="robot_state_publisher"type="state_publisher" /><node name="rviz" pkg="rviz" type="rviz"args="-d $(find ros_robotics)/urdf.rviz"required="true" />
</launch>
然后在终端执行以下命令,就会弹出一个rviz窗口
$ roslaunch ros_robotics ddrobot_rviz.launch model:=dd_robot.urdf
点击Displays工具栏右下角的Add,添加组件,并编辑Fixed Frame为base_link

然后就有

1.2 dd_robot2.urdf —— 添加轮子
然后添加轮子,仿照dd_robot.urdf,在相同目录下建立第二份文件dd_robot2.urdf,在dd_robot.urdf文件的基础上,加了两个轮子,具体内容为:
<?xml version='1.0'?>
<!--dd_robot2.urdf-->
<robot name="dd_robot"><!-- Old Content --><!-- Base Link --><link name="base_link"><visual><origin xyz="0 0 0" rpy="0 0 0" /><geometry><box size="0.5 0.5 0.25"/></geometry></visual></link><!-- New Content --><!-- Right Wheel --><link name="right_wheel"><visual><origin xyz="0 0 0" rpy="1.570795 0 0" /><geometry><cylinder length="0.1" radius="0.2" /></geometry></visual></link><joint name="joint_right_wheel" type="continuous"><parent link="base_link"/><child link="right_wheel"/><origin xyz="0 -0.30 0" rpy="0 0 0" /><axis xyz="0 1 0" /></joint><!-- Left Wheel --><link name="left_wheel"><visual><origin xyz="0 0 0" rpy="1.570795 0 0" /><geometry><cylinder length="0.1" radius="0.2" /></geometry></visual></link><joint name="joint_left_wheel" type="continuous"><parent link="base_link"/><child link="left_wheel"/><origin xyz="0 0.30 0" rpy="0 0 0" /><axis xyz="0 1 0" /></joint></robot>
保存好后,关闭上一个rviz窗口,执行
$ roslaunch ros_robotics ddrobot_rviz.launch model:=dd_robot2.urdf
就会看到,红色轴是X轴,绿色轴是Y轴,蓝色轴是Z轴。TF - ROS Wiki

1.3 dd_robot3.urdf —— 添加万向轮
再建一份dd_robot3.urdf文件,在底部添加一个万向轮
<?xml version='1.0'?>
<!--dd_robot3.urdf-->
<robot name="dd_robot"><!-- Base Link --><link name="base_link"><visual><origin xyz="0 0 0" rpy="0 0 0" /><geometry><box size="0.5 0.5 0.25"/></geometry></visual><!-- New Content --><!-- Caster --><visual name="caster"><origin xyz="0.2 0 -0.125" rpy="0 0 0" /><geometry><sphere radius="0.05" /></geometry></visual></link><!-- Right Wheel --><link name="right_wheel"><visual><origin xyz="0 0 0" rpy="1.570795 0 0" /><geometry><cylinder length="0.1" radius="0.2" /></geometry></visual></link><joint name="joint_right_wheel" type="continuous"><parent link="base_link"/><child link="right_wheel"/><origin xyz="0 -0.30 0" rpy="0 0 0" /><axis xyz="0 1 0" /></joint><!-- Left Wheel --><link name="left_wheel"><visual><origin xyz="0 0 0" rpy="1.570795 0 0" /><geometry><cylinder length="0.1" radius="0.2" /></geometry></visual></link><joint name="joint_left_wheel" type="continuous"><parent link="base_link"/><child link="left_wheel"/><origin xyz="0 0.30 0" rpy="0 0 0" /><axis xyz="0 1 0" /></joint></robot>
dd_robot3.urdf效果图

1.4 dd_robot4.urdf —— 添加颜色
新建一份dd_robot4.urdf,修改各模块颜色,可以看到left wheel只简单引用了一个<material>标签也产生了效果,所以这个标签可以一次定义,全局起效,定义位置不影响其生效的先后关系,定义在文件末尾也一样,rgba属性值里的a代表alpha,表示透明度,1不透明,0透明。
<?xml version='1.0'?>
<!--dd_robot4.urdf-->
<robot name="dd_robot"><!-- Base Link --><link name="base_link"><visual><origin xyz="0 0 0" rpy="0 0 0" /><geometry><box size="0.5 0.5 0.25"/></geometry><!-- New Content --><material name="blue"><color rgba="0 0.5 1 1"/></material></visual><!-- Caster --><visual name="caster"><origin xyz="0.2 0 -0.125" rpy="0 0 0" /><geometry><sphere radius="0.05" /></geometry></visual></link><!-- Right Wheel --><link name="right_wheel"><visual><origin xyz="0 0 0" rpy="1.570795 0 0" /><geometry><cylinder length="0.1" radius="0.2" /></geometry><!-- New Content --><material name="black"><color rgba="0.05 0.05 0.05 1"/></material></visual></link><joint name="joint_right_wheel" type="continuous"><parent link="base_link"/><child link="right_wheel"/><origin xyz="0 -0.30 0" rpy="0 0 0" /><axis xyz="0 1 0" /></joint><!-- Left Wheel --><link name="left_wheel"><visual><origin xyz="0 0 0" rpy="1.570795 0 0" /><geometry><cylinder length="0.1" radius="0.2" /></geometry><!-- New Content --><material name="black"/></visual></link><joint name="joint_left_wheel" type="continuous"><parent link="base_link"/><child link="left_wheel"/><origin xyz="0 0.30 0" rpy="0 0 0" /><axis xyz="0 1 0" /></joint></robot>

1.5 dd_robot5.urdf —— 添加碰撞检测(Collision Detection)
给各个link添加<collision>属性,用来之后在Gazebo中进行碰撞检测
<?xml version='1.0'?>
<!--dd_robot5.urdf-->
<robot name="dd_robot"><!-- Base Link --><link name="base_link"><visual><!-- Base collision --><collision><origin xyz="0 0 0" rpy="0 0 0" /><geometry><box size="0.5 0.5 0.25"/></geometry></collision><material name="blue"><color rgba="0 0.5 1 1"/></material></visual><!-- Caster --><visual name="caster"><!-- Caster collision --><collision><origin xyz="0.2 0 -0.125" rpy="0 0 0" /><geometry><sphere radius="0.05" /></geometry></collision></visual></link><!-- Right Wheel --><link name="right_wheel"><visual><collision><origin xyz="0 0 0" rpy="1.570795 0 0" /><geometry><cylinder length="0.1" radius="0.2" /></geometry></collision><material name="black"><color rgba="0.05 0.05 0.05 1"/></material></visual></link><joint name="joint_right_wheel" type="continuous"><parent link="base_link"/><child link="right_wheel"/><origin xyz="0 -0.30 0" rpy="0 0 0" /><axis xyz="0 1 0" /></joint><!-- Left Wheel --><link name="left_wheel"><visual><collision><origin xyz="0 0 0" rpy="1.570795 0 0" /><geometry><cylinder length="0.1" radius="0.2" /></geometry></collision><material name="black"/></visual></link><joint name="joint_left_wheel" type="continuous"><parent link="base_link"/><child link="left_wheel"/><origin xyz="0 0.30 0" rpy="0 0 0" /><axis xyz="0 1 0" /></joint></robot>
1.6 使用gui模式转动小车车轮
提前安装gui相关ros包
sudo apt update
#sudo apt install ros-<your_ros_version>-joint-state-publisher-gui,我的ros_version是kinetic,根据版本决定
sudo apt install ros-kinetic-joint-state-publisher-gui
然后执行
roslaunch ros_robotics ddrobot_rviz.launch model:=dd_robot5.urdf gui:=True
效果如图,random随机赋予旋转角度,center是位置归零按键

1.7 dd_robot6.urdf —— 添加惯性属性
给物体添加了inertia惯性属性
<?xml version='1.0'?>
<robot name="dd_robot"><!-- Base Link --><link name="base_link"><visual><origin xyz="0 0 0" rpy="0 0 0" /><geometry><box size="0.5 0.5 0.25"/></geometry><material name="blue"><color rgba="0 0.5 1 1"/></material></visual><!-- Base collision, mass and inertia --><collision><origin xyz="0 0 0" rpy="0 0 0" /><geometry><box size="0.5 0.5 0.25"/></geometry></collision><inertial><mass value="5"/><inertia ixx="0.13" ixy="0.0" ixz="0.0" iyy="0.21" iyz="0.0" izz="0.13"/></inertial><!-- Caster --><visual name="caster"><origin xyz="0.2 0 -0.125" rpy="0 0 0" /><geometry><sphere radius="0.05" /></geometry></visual><!-- Caster collision, mass and inertia --><collision><origin xyz="0.2 0 -0.125" rpy="0 0 0" /><geometry><sphere radius="0.05" /></geometry></collision><inertial><mass value="0.5"/><inertia ixx="0.0001" ixy="0.0" ixz="0.0" iyy="0.0001" iyz="0.0" izz="0.0001"/></inertial></link><!-- Right Wheel --><link name="right_wheel"><visual><origin xyz="0 0 0" rpy="1.570795 0 0" /><geometry><cylinder length="0.1" radius="0.2" /></geometry><material name="darkgray"><color rgba=".2 .2 .2 1"/></material></visual><!-- Right Wheel collision, mass and inertia --><collision><origin xyz="0 0 0" rpy="1.570795 0 0" /><geometry><cylinder length="0.1" radius="0.2" /></geometry></collision><inertial><mass value="0.5"/><inertia ixx="0.01" ixy="0.0" ixz="0.0" iyy="0.005" iyz="0.0" izz="0.005"/></inertial></link><!-- Right Wheel joint --><joint name="joint_right_wheel" type="continuous"><parent link="base_link"/><child link="right_wheel"/><origin xyz="0 -0.30 0" rpy="0 0 0" /> <axis xyz="0 1 0" /></joint><!-- Left Wheel --><link name="left_wheel"><visual><origin xyz="0 0 0" rpy="1.570795 0 0" /><geometry><cylinder length="0.1" radius="0.2" /></geometry><material name="darkgray"><color rgba=".2 .2 .2 1"/></material></visual><!-- Left Wheel collision, mass and inertia --><collision><origin xyz="0 0 0" rpy="1.570795 0 0" /><geometry><cylinder length="0.1" radius="0.2" /></geometry></collision><inertial><mass value="0.5"/><inertia ixx="0.01" ixy="0.0" ixz="0.0" iyy="0.005" iyz="0.0" izz="0.005"/></inertial></link><!-- Left Wheel joint --><joint name="joint_left_wheel" type="continuous"><parent link="base_link"/><child link="left_wheel"/><origin xyz="0 0.30 0" rpy="0 0 0" /> <axis xyz="0 1 0" /></joint></robot>
二、Gazebo仿真实验
2.1 环境预备与问题处理
在使用下面的命令运行gazebo时,我遇到了一个错误,可能你也会遇到,一个什么都没有的empty_world也还是需要阳光和大地,就像我的世界初始化一样。
$ roslaunch gazebo_ros empty_world.launch
Error [parser.cc:581] Unable to find uri[model://sun]
Error [parser.cc:581] Unable to find uri[model://ground_plane]
解决方案:Unable to find uri[model://sun]、uri[model://ground_plane] 错误解决,只要下载好对应的model包并放到指定位置即可,这里有两个下载源:gazebo_models - gitee和gazebo_models - github,使用DownGit工具,从github上下载指定内容会比全部下载更快些,我这里暂时只需要下载这两个。另外,如果遇到Gazebo闪退,请看控制台打印的信息,是否与该文章说明内容相同:《VMware: vmw_ioctl_command error Invalid argument解决办法》,若不同请找其它解决方案,记得source文件起效。
2.2 dd_robot.gazebo
文件后缀从.urdf变成了.gazebo,文件内容不贴了,以免文章过于冗长,请从github上下载,下载地址请往上翻阅,有些属性被替换成了gazebo中特有的。
书本上使用以下命令,判断是否能从urdf格式转换成sdf格式
$ gzsdf –p dd_robot.gazebo
但我的机器上出现了以下错误,查看专栏《ROS采坑记录》下的文章,原因是 gzsdf 在 gazebo3后的版本取消了,啊,妸荷甘与神农同学于老龙吉。
gzsdf: command not found
用以下命令替代,执行后会打印出很长的一段内容,没报错就先不管它。
gz sdf -p dd_robot.gazebo
在launch目录下建立一份ddrobot_gazebo.launch文件,内容为
<launch><!-- We resume the logic in gazebo_ros packageempty_world.launch,changing only the name of theworld to be launched --><include file="$(findgazebo_ros)/launch/empty_world.launch"><arg name="world_name"value="$(find ros_robotics)/worlds/ddrobot.world"/><arg name="paused" default="false"/><arg name="use_sim_time" default="true"/><arg name="gui" default="true"/><arg name="headless" default="false"/><arg name="debug" default="false"/></include><!-- Spawn dd_robot into Gazebo --><node name="spawn_urdf" pkg="gazebo_ros"type="spawn_model" output="screen"args="-file$(find ros_robotics)/urdf/dd_robot.gazebo-urdf -model ddrobot" /></launch>
在launch的同级目录下,建立一个worlds目录,不清楚具体目录和文件结构,可以看书本发布在github上的源码。并在worlds目录下,建立一份ddrobot.world文件,内容为
<?xml version="1.0" ?>
<sdf version="1.4"><world name="default"><include><uri>model://ground_plane</uri></include><include><uri>model://sun</uri></include><include><uri>model://construction_cone</uri><name>construction_cone</name><pose>-3.0 0 0 0 0 0</pose></include><include><uri>model://construction_cone</uri><name>construction_cone</name><pose>3.0 0 0 0 0 0</pose></include></world>
</sdf>
然后执行以下命令,效果如下。有model少的话,按之前的方法去下载。
$ roslaunch ros_robotics ddrobot_gazebo.launch


三、其它仿真手段
3.1 Matlab
除了Gazebo,Matlab Simulink通过 Robotics System Toolbox的加持,也支持对ROS进行仿真,见 Robot Operating System (ROS) Support from ROS Toolbox,Matlab也提供了例子,见 Get Started with ROS - MathWorks
3.2 Stage
Stage是一个针对移动机器人与传感器的开源2D仿真器,见 The Player Project - Free Software tools for robot and sensor applications
3.3 Virtual Robot Experimentation Platform (V-REP)
虚拟机器人实验平台,商用,由Coppelia Robotics公司开发,V-REP官网。
四、六大关节种类
在上面的例子中,只用到了一种Continous的连接关节,但这不是所有,还有其它5种,将以代码+动图形式,分别展示效果。
【ROS URDF模型中的6种joint类型】
无限旋转关节(continous)
首先,是我们在上文已经见过的continous关节

固定关节(fixed)
配图,配上关节的动图
有限旋转关节(revolute)
找到之前的dd_robot5.urdf文件,并复制一份命名为dd_robot5_revolute.urdf,并做出如下修改
...<joint name="joint_right_wheel" type="revolute"><parent link="base_link"/><child link="right_wheel"/><origin xyz="0 -0.30 0" rpy="0 0 0" /><!--New content--><limit effort="30" velocity="1.0" lower="-1.00" upper="1.00" /><axis xyz="0 1 0" /></joint>...<joint name="joint_left_wheel" type="revolute"><parent link="base_link"/><child link="left_wheel"/><origin xyz="0 0.30 0" rpy="0 0 0" /><!--New content--><limit effort="30" velocity="1.0" lower="-1.00" upper="1.00" /><axis xyz="0 1 0" /></joint>...
然后执行
roslaunch ros_robotics ddrobot_rviz.launch model:=dd_robot5_revolute.urdf gui:=True
效果如下

滑动关节(prismatic)
也称平移关节,找到之前的dd_robot5.urdf文件,并复制一份命名为dd_robot5_prismatic.urdf,并做出如下修改,看上去和revolute关节一样,但它们的lower和upper的单位一个是角度,一个是距离。
...<joint name="joint_right_wheel" type="revolute"><parent link="base_link"/><child link="right_wheel"/><origin xyz="0 -0.30 0" rpy="0 0 0" /><!--New content--><limit effort="30" velocity="1.0" lower="-3" upper="3" /><axis xyz="0 1 0" /></joint>...<joint name="joint_left_wheel" type="revolute"><parent link="base_link"/><child link="left_wheel"/><origin xyz="0 0.30 0" rpy="0 0 0" /><!--New content--><limit effort="30" velocity="1.0" lower="-3" upper="3" /><axis xyz="0 1 0" /></joint>...
然后执行
roslaunch ros_robotics ddrobot_rviz.launch model:=dd_robot5_prismatic.urdf gui:=True
效果如下,看上去有些不伦不类,但只是效果演示,但你要真说它是不伦不类还有点牵强,谁规定汽车轮子不能横移的呢?


浮动关节(floating)
//@TODO
平面关节(planar)
//@TODO
总结
| 名称 | 说明 |
|---|---|
| 固定关节(Fixed) | //@TODO |
| 有限旋转关节(Revolute) | //@TODO |
| 无限旋转关节(Continous) | //@TODO |
| 滑动关节(Prismatic) | //@TODO |
| 浮动关节(Float) | //@TODO |
| 平面关节(Planar) | //@TODO |
相关文章:
机器人入门(四)—— 创建你的第一个虚拟小车
机器人入门(四)—— 创建你的第一个虚拟小车 一、小车建立过程1.1 dd_robot.urdf —— 建立身体1.2 dd_robot2.urdf —— 添加轮子1.3 dd_robot3.urdf —— 添加万向轮1.4 dd_robot4.urdf —— 添加颜色1.5 dd_robot5.urdf —— 添加碰撞检测(Collision …...
部署K8S
防火强的初始化: [rootk8s-node-12 ~]# systemctl stop firewalld NetworkManager [rootk8s-node-12 ~]# systemctl disable firewalld NetworkManager Removed symlink /etc/systemd/system/multi-user.target.wants/NetworkManager.service. Removed symlink /et…...
[NSSCTF 2nd] web刷题记录
文章目录 php签到MyBox非预期解预期解 php签到 源代码 <?phpfunction waf($filename){$black_list array("ph", "htaccess", "ini");$ext pathinfo($filename, PATHINFO_EXTENSION);foreach ($black_list as $value) {if (stristr($ext, …...
MyBatis获取参数值的两种方式(重点)
文章目录 简介单个字面量类型的参数多个字面量类型的参数map集合类型的参数实体类类型的参数使用Param标识参数总结 简介 MyBatis获取参数值的两种方式:${}和#{}${}的本质就是字符串拼接,#{}的本质就是占位符赋值${}使用字符串拼接的方式拼接sql&#x…...
Cesium弹窗可随地图移动
目录 项目地址实现效果实现方法 项目地址 https://github.com/zhengjie9510/webgis-demo 实现效果 实现方法 handler new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas) handler.setInputAction((click) > {if (listener) {listener()listener undefinedthis.v…...
MySQL WITH AS及递归查询
MySQL WITH AS及递归查询 WITH AS 官网:WITH 是 SQL 中的一个关键字,用于创建临时表达式(也称为 Common Table Expression,CTE),它允许你在一个查询中临时定义一个表达式,然后在后续的查询中引…...
Harbor私有镜像仓库搭建
本文基于:https://zhuanlan.zhihu.com/p/143779176 1.环境准备 IP:192.168.10.136/24 操作系统:centos7 2.安装Docker、Docker-compose 2.1安装Docker-CE $ wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.re…...
线段树 区间赋值 + 区间加减 + 求区间最值
线段树好题:P1253 扶苏的问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 区间赋值 区间加减 求区间最大。 对于区间赋值和区间加减来说,需要两个懒标记,一个表示赋值cover,一个表示加减add。 区间赋值的优先级大于区间加…...
大模型之十九-对话机器人
大语言模型的最早应用是Chatbot,其实我最早接触语义理解在2014年,2014年做智能音箱的时候,那时也是国内第一批做智能音箱的,在现在看起来当时的智能音箱比较傻,很多问题无法回答,长下文效果也不好ÿ…...
『力扣刷题本』:删除排序链表中的重复元素
一、题目 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 示例 1: 输入:head [1,1,2] 输出:[1,2]示例 2: 输入:head [1,1,2,3,3] 输出&am…...
Android S从桌面点击图标启动APP流程 (六)
系列文章 Android S从桌面点击图标启动APP流程 (一)Android S从桌面点击图标启动APP流程 (二) Android S从桌面点击图标启动APP流程 (三) Android S从桌面点击图标启动APP流程 (四) Android S从桌面点击图标启动APP流程 (五) Android 12的源码链接: android 1…...
Java I/O (输入/输出)
1.流的概念 流是一种有序的数据序列,根据操作类型,可以分为输入流和输出流两种。I/O流(输入输出)提供了一条通道程序,可以使用这条通道把源中的字节序列送到目的地。 1.1 输入流: 程序从指向源的输入流中读…...
nodejs+vue食力派网上订餐系统-计算机毕业设计
采用当前流行的B/S模式以及3层架构的设计思想通过 技术来开发此系统的目的是建立一个配合网络环境的食力派网上订餐系统,这样可以有效地解决食力派网上订餐管理信息混乱的局面。 本设计旨在提高顾客就餐效率、优化餐厅管理、提高订单准确性和客户的满意度。本系统采…...
【计算机视觉】对极几何
文章目录 一、极线约束(Epipolar Constraint)二、相机标定过的情况三、相机没有标定过的情况四、八点算法(eight-point algorithm) 我的《计算机视觉》系列参考UC Berkeley的CS180课程,PPT可以在课程主页看到。 在上一…...
强大易于编辑的流程图组织图绘制工具draw.io Mac苹果中文版
draw.io可以绘制多种类型的图表,包括但不限于流程图、组织结构图、网络图、UML图、电气工程图等。draw.io提供了丰富的图形元素和编辑功能,使用户能够轻松地创建和编辑各种复杂的图表。同时,该软件还支持多种导出格式,方便用户在不…...
c# .net6 在线条码打印基于
条码打印基于:BarTender、ORM EF架构 UI展示: 主页代码: using NPOI.OpenXmlFormats.Spreadsheet; using ServerSide.Models; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawi…...
Hive SQL的编译过程
1.MapReduce实现基本SQL操作的原理 详细讲解SQL编译为MapReduce之前,我们先来看看MapReduce框架实现SQL基本操作的原理 1.1 Join的实现原理 select u.name, o.orderid from order o join user u on o.uid = u.uid; 在map的输出value中为不同表的数据打上tag标记,在reduce阶段…...
[架构之路-245/创业之路-76]:目标系统 - 纵向分层 - 企业信息化的呈现形态:常见企业信息化软件系统 - 企业资源管理计划ERP
目录 前言: 一、企业信息化的结果:常见企业信息化软件 1.1 企业资源管理计划 1.1.1 什么是ERP:企业最常用的信息管理系统 1.1.2 ERP的演进过程 1.1.3 EPR模块 1.1.4 EPR五个层级 1.1.5 企业EPR业务总体流程图 1.1.6 什么类型的企业需…...
数据库简史:多主数据库架构的由来和华为参天引擎的机遇
注:本文发表后,收到了很多后台反馈,其中关于大型机的早期成就不容省略。微调重发本文,纯属个人观点,错谬之处,仍然期待指正。 2023年10月13日,在北京举办的“2023金融业数据库技术大会"上&…...
C语言每日一练(二)
单链表经典算法专题 一、 单链表相关经典算法OJ题1:移除链表元素 解法一:在原链表中删除Node.nextnext的节点 typedef struct ListNode ListNode; struct ListNode* removeElements( ListNode* head, int val) {ListNode* pcur head;ListNode* pre h…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
