机器人入门(四)—— 创建你的第一个虚拟小车
机器人入门(四)—— 创建你的第一个虚拟小车
- 一、小车建立过程
- 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…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
