【ROS机械臂入门教程】

news2024/11/27 10:21:43

首先声明一下,此项目是参考B站哈萨克斯坦UP的【ROS机械臂入门教程】,前期以复现【机械臂视觉抓取从理论到实战】
此内容为他研究生生涯的阶段性成果展示和技术分享,所有数据和代码均开源。所以鹏鹏我又特此来复现一下,我采用的硬件与之有所不同,UP主使用UR5,我实验室采用的是UR3,下面列出相关材料
在这里插入图片描述UR3CB3.12:https://www.universal-robots.cn/cb3/
【UR3系统升级到CB3.12附带URcap1.05】

硬件支持

序号名称功能
1UR3机械臂一切行动的执行者
2D435i执行者的眼睛
3Ubuntu深度学习环境执行者思维的大脑
4平面抓取平台实验操作环境
56*6黑白棋盘标定板相机眼在手外标定
63x3x3cm 3D打印小方块工件演员

代码支持
ros机械臂入门教程代码 version3.0链接:
链接:https://pan.baidu.com/s/1KFLQXVWShG5KfroCd6eM0A=8888
提取码:8888
【ROS机械臂入门教程-小五】PPT
链接:https://pan.baidu.com/s/18ierKnf8OJPPvGn8uOf1hw=8888
提取码:8888

1. 概述

在这里插入图片描述

在这里插入图片描述

【Autolabor初级教程】ROS机器人入门

机器人操作系统 ROS 快速入门教程

在这里插入图片描述
在这里插入图片描述

2. ROS简介

在这里插入图片描述

2.1 ROS介绍

ROS官网:http://wiki.ros.org/
在这里插入图片描述

在这里插入图片描述在这里插入图片描述在这里插入图片描述autolabor地址:http://www.autolabor.com.cn/book/ROSTutorials/

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Moveit api:https://moveit.ros.org/documentation/source-code-api/

在这里插入图片描述

melodic:http://docs.ros.org/en/melodic/api/moveit_tutorials/html/index.html

在这里插入图片描述

2.2 ROS机器人包在这里插入图片描述

在这里插入图片描述ros-melodic:git clone https://github.com/ros-industrial/universal_robot.git
ros-noetic:https://blog.csdn.net/Dawn_yc/article/details/114791755

3. 机器人URDF建模

在这里插入图片描述

3.1 URDF简介

在这里插入图片描述

URDF是ROS中机器人模型的描述格式,包含对机器人刚体外观、物理属性、关节类型等方面的描述

在这里插入图片描述
在这里插入图片描述

3.2 查看模型

在这里插入图片描述
$ check_urdf xxx.urdf 检查xxx.urdf文件,发现错误
$ urdf_to_graphiz xxx.urdf
将urdf文件生成pdf文件,进行可视化
在这里插入图片描述
$ roslaunch ur_description view_ur5.launch 展示ur5模型在这里插入图片描述

3.3 配置保存Rviz

在这里插入图片描述roslaunch ur_description view_ur5_with_gripper.launch 展示ur5+robotiq85模型
在这里插入图片描述

在这里插入图片描述

roslaunch ur_description view_ur5.launch
rviz

rviz保存路径在universal_robot/ur_description/cfg/2222.rviz

<?xml version="1.0"?>
<launch>
  <include file="$(find ur_description)/launch/ur5_upload.launch"/>

  <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" >
    <param name="use_gui" value="true"/>
  </node>
  <node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
  <node name="rviz" pkg="rviz" type="rviz" args="-d $(find ur_description)/cfg/2222.rviz" required="true" />
</launch>

在这里插入图片描述

4. Moveit!核心功能介绍及Rviz控制

4.1 Moveit!简介

在这里插入图片描述MoveIt! 是机械臂相关的工具集软件,
集成了各种功能:
Ø 运动学(Kinematics)
Ø 运动规划(Motion Planning)
Ø 碰撞检测(Collision Checking)
Ø 3D 感知(Perception)
Ø 操作(Manipulation)
在这里插入图片描述
在这里插入图片描述

4.2 机器人ROS包架构

在这里插入图片描述
在这里插入图片描述rosrun moveit_setup_assistant moveit_setup_assistant
加载urdf模型
在这里插入图片描述检查关节之间是否有碰撞

在这里插入图片描述
选择求解器
在这里插入图片描述
选择基准连接和末端求解
在这里插入图片描述在这里插入图片描述
配置相关姿态位置
在这里插入图片描述
平躺全零
在这里插入图片描述
up姿态0,-1.5708,0-1.5708,0,0

在这里插入图片描述配置末端夹爪
在这里插入图片描述

填写个人信息
在这里插入图片描述最后创建模型
在这里插入图片描述

直接导入模型
在这里插入图片描述

4.3 电脑设置

在这里插入图片描述moveit配置之后有对应的Rviz demo

roslaunch ur5_moveit_config demo.launch

在这里插入图片描述在这里插入图片描述

在这里插入图片描述随机目标位置,点击plan&execute,即可运动到对应位置
在这里插入图片描述
添加障碍物
在这里插入图片描述夹爪demo

roslaunch ur5_gripper_moveit_config demo.launch

在这里插入图片描述

5. Gazebo仿真or控制真实机器人

超级终端

sudo apt install terminator

5.1 Moveit与控制器的连接

在这里插入图片描述在这里插入图片描述使用方式

# gazebo仿真中控制机器人
roslaunch ur_gazebo ur5.launch
roslaunch ur5_moveit_config ur5_moveit_planning_execution.launch sim:=true
roslaunch ur5_moveit_config moveit_rviz.launch config:=true
# 控制真实UR5机器人
一键启动: 
roslaunch ur_planning start_ur5.launch
分开启动:
roslaunch ur_modern_driver ur5_bringup.launch
roslaunch ur5_moveit_config ur5_moveit_planning_execution.launch
roslaunch ur5_moveit_config moveit_rviz.launch config:=true
# rviz 仅作可视化显示
roslaunch ur5_moveit_config demo.launch
rosrun ur_planning moveitServer.py

5.2 Gazebo仿真

在这里插入图片描述在这里插入图片描述

5.3 控制真实UR5机器人

一键启动:

roslaunch ur_planning start_ur5.launch

分开启动:

roslaunch ur_modern_driver ur5_bringup.launch
roslaunch ur5_moveit_config ur5_moveit_planning_execution.launch
roslaunch ur5_moveit_config moveit_rviz.launch config:=true

在这里插入图片描述

6. Moveit基础(python)

在这里插入图片描述

6.1 Moveit!回顾

在这里插入图片描述

6.2 关节空间运动

Python中安装moveit_commander

sudo apt-get update
sudo apt-get install ros-melodic-moveit-commander

在这里插入图片描述

# 关节规划,输入6个关节角度(单位:弧度)
    def move_j(self, joint_configuration=None,a=1,v=1):
        # 设置机械臂的目标位置,使用六轴的位置数据进行描述(单位:弧度)
        if joint_configuration==None:
            joint_configuration = [0, -1.5707, 0, -1.5707, 0, 0]
        self.arm.set_max_acceleration_scaling_factor(a)
        self.arm.set_max_velocity_scaling_factor(v)
        self.arm.set_joint_value_target(joint_configuration)
        rospy.loginfo("move_j:"+str(joint_configuration))
        self.arm.go()
        rospy.sleep(1)

在这里插入图片描述

    # 空间规划,输入xyzRPY
    def move_p(self, tool_configuration=None,a=1,v=1):
        if tool_configuration==None:
            tool_configuration = [0.3,0,0.3,0,-np.pi/2,0]
        self.arm.set_max_acceleration_scaling_factor(a)
        self.arm.set_max_velocity_scaling_factor(v)

        target_pose = PoseStamped()
        target_pose.header.frame_id = self.reference_frame
        target_pose.header.stamp = rospy.Time.now()
        target_pose.pose.position.x = tool_configuration[0]
        target_pose.pose.position.y = tool_configuration[1]
        target_pose.pose.position.z = tool_configuration[2]
        q = quaternion_from_euler(tool_configuration[3],tool_configuration[4],tool_configuration[5])
        target_pose.pose.orientation.x = q[0]
        target_pose.pose.orientation.y = q[1]
        target_pose.pose.orientation.z = q[2]
        target_pose.pose.orientation.w = q[3]

        self.arm.set_start_state_to_current_state()
        self.arm.set_pose_target(target_pose, self.end_effector_link)
        rospy.loginfo("move_p:" + str(tool_configuration))
        traj = self.arm.plan()
        self.arm.execute(traj)
        rospy.sleep(1)

6.3 笛卡尔空间运动

在这里插入图片描述

# 空间直线运动,输入(x,y,z,R,P,Y,x2,y2,z2,R2,...)
    # 默认仅执行一个点位,可以选择传入多个点位
    def move_l(self, tool_configuration,waypoints_number=1,a=0.5,v=0.5):
        if tool_configuration==None:
            tool_configuration = [0.3,0,0.3,0,-np.pi/2,0]
        self.arm.set_max_acceleration_scaling_factor(a)
        self.arm.set_max_velocity_scaling_factor(v)

        # 设置路点
        waypoints = []
        for i in range(waypoints_number):
            target_pose = PoseStamped()
            target_pose.header.frame_id = self.reference_frame
            target_pose.header.stamp = rospy.Time.now()
            target_pose.pose.position.x = tool_configuration[6*i+0]
            target_pose.pose.position.y = tool_configuration[6*i+1]
            target_pose.pose.position.z = tool_configuration[6*i+2]
            q = quaternion_from_euler(tool_configuration[6*i+3],tool_configuration[6*i+4],tool_configuration[6*i+5])
            target_pose.pose.orientation.x = q[0]
            target_pose.pose.orientation.y = q[1]
            target_pose.pose.orientation.z = q[2]
            target_pose.pose.orientation.w = q[3]
            waypoints.append(target_pose.pose)
        rospy.loginfo("move_l:" + str(tool_configuration))
        self.arm.set_start_state_to_current_state()
        fraction = 0.0  # 路径规划覆盖率
        maxtries = 100  # 最大尝试规划次数
        attempts = 0  # 已经尝试规划次数

        # 设置机器臂当前的状态作为运动初始状态
        self.arm.set_start_state_to_current_state()

        # 尝试规划一条笛卡尔空间下的路径,依次通过所有路点
        while fraction < 1.0 and attempts < maxtries:
            (plan, fraction) = self.arm.compute_cartesian_path(
                waypoints,  # waypoint poses,路点列表
                0.001,  # eef_step,终端步进值
                0.00,  # jump_threshold,跳跃阈值
                True)  # avoid_collisions,避障规划
            attempts += 1
        if fraction == 1.0:
            rospy.loginfo("Path computed successfully. Moving the arm.")
            self.arm.execute(plan)
            rospy.loginfo("Path execution complete.")
        else:
            rospy.loginfo(
                "Path planning failed with only " + str(fraction) +
                " success after " + str(maxtries) + " attempts.")
        rospy.sleep(1)

6.4 与环境交互

在这里插入图片描述

# 在机械臂下方添加一个table,使得机械臂只能够在上半空间进行规划和运动
    # 避免碰撞到下方的桌子等其他物体
    def set_scene(self):
        ## set table
        self.scene = PlanningSceneInterface()
        self.scene_pub = rospy.Publisher('planning_scene', PlanningScene, queue_size=5)
        self.colors = dict()
        rospy.sleep(1)
        table_id = 'table'
        self.scene.remove_world_object(table_id)
        rospy.sleep(1)
        table_size = [2, 2, 0.01]
        table_pose = PoseStamped()
        table_pose.header.frame_id = self.reference_frame
        table_pose.pose.position.x = 0.0
        table_pose.pose.position.y = 0.0
        table_pose.pose.position.z = -table_size[2]/2 -0.02
        table_pose.pose.orientation.w = 1.0
        self.scene.add_box(table_id, table_pose, table_size)
        self.setColor(table_id, 0.5, 0.5, 0.5, 1.0)
        self.sendColors()

7. Moveit基础(C++) 实现带约束的路径规划

在这里插入图片描述

8. 运动规划-如何选择Moveit中的规划算法?

8.1 为什么要路径规划

Ø 避障:避免与桌子等机械臂附近的静态物体发生碰撞;避免与(突然走近的)人
等动态物体发生碰撞
Ø 任务对运动的路径有要求:具有运动学或动力学约束,如焊接、抓取装有水的
杯子等
n 路径规划分类
Ø 基于搜索,Dijkstra,A*,Anytime A*、ARA*、D*
Ø 基于采样,PRM,RRT,RRT-connect,RRT*,Kinodynamic-
RRT*(符合动力学),Anytime RRT*,Informed RRT*
Ø 智能算法如遗传算法、蚁群算法
在这里插入图片描述基于采样的路径规划算法
Ø 基础知识:概论完备:时间无穷大必能找到解;
Ø PRM:1.先随机采样n个点构成图 2.基于图进行搜索
Ø RRT:快速搜索随机树,非最优解;查询near可用kdtree等数据结构,
快速找到树中最近结点
Ø RRT-connect:双向扩展的RRT,从start和goal同时扩展,搜索速度比
较快,ros-moveit默认算法
Ø RRT*:作了两个改进,一是改变了新节点连接到树的规则,二是对搜
索树进行“剪枝”操作,使之更接近于真实的最优路径
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

8.2 如何选择路径规划算法

在这里插入图片描述
在这里插入图片描述

  1. Rviz
    在这里插入图片描述
  2. Moveit_setup_assistant
    在这里插入图片描述
    在这里插入图片描述
  3. 程序中

在这里插入图片描述

9. 视觉避障

在这里插入图片描述

9.1 引入

在这里插入图片描述

9.2 官方demo

Ø 只需要有一个点云/深度图输入,即可由此生成栅格图;

$ roslaunch moveit_tutorials obstacle_avoidance_demo.launch

Ø 由栅格图又可生成圆柱体障碍物

$ roslaunch moveit_tutorials detect_and_add_cylinder_collision_object_demo.launch

(注:运行此语句时,需要关闭上一条命令)
功能包:

https://github.com/ros-planning/moveit_tutorials
https://github.com/ros-planning/panda_moveit_config

在这里插入图片描述

9.3 实战

roslaunch ur5_moveit_config demo_with_obstacle_avoidance.launch

在这里插入图片描述
在这里插入图片描述
主要步骤
Ø 1.启动相机ros程序

$ sudo apt-get install ros-melodic-realsense2-camera
$ sudo apt-get install ros-melodic-realsense2-description
$ roslaunch realsense2_camera demo_pointcloud.launch

Ø 2.修改moveit配置文件
(1)修改xxx_moveit_config/config/sensors_kinect_pointcloud.yaml的
point_cloud_topic为自己相机点云发布的话题
(2)或者修改xxx_moveit_config/config/sensors_kinect_depthmap.yaml的
image_topic为自己相机深度图发布的话题
Ø 3(可选)修改视觉避障参数,如栅格分辨率octomap_resolution等
Ø 4(可选)修改相机参数,如分辨率、更新频率等
Ø 5.发布相机相对于机械臂基坐标的位姿

<node pkg="tf2_ros" type="static_transform_publisher"
name="camera_to_robot" args="0.72032458 -0.21936176 0.90925255
0.98422218 0.0969083 -0.04779138 0.14011233 camera_color_optical_frame
world" />

在这里插入图片描述

roslaunch ur5_moveit_config demo_with_obstacle_avoidance.launch

参考https://blog.csdn.net/ssw_1990/article/details/104053041
在这里插入图片描述参考https://blog.csdn.net/ssw_1990/article/details/104053041
在这里插入图片描述

10. ROS与深度学习

10.1 引入

ROS-Moveit!

ROS-melodic以及之前版本Moveit!默认使用python2.7
ROS-noetic以及ROS2支持python3

深度学习
深度学习均使用python3,且深度学习一般需要在虚拟环境中配置环境
如何将深度学习融入ROS呢?
在这里插入图片描述
在这里插入图片描述

10. 2 实战

n ROS与Anaconda共存
Ø 1.一键安装ROS

$ wget http://fishros.com/install -O fishros && bash fishros

Ø 2.安装anaconda
https://blog.csdn.net/KIK9973/article/details/118772450
百度搜索对应ubuntu版本的anaconda安装教程
Ø 3.anaconda中创建虚拟环境

conda create -n YOUR_ENV_NAME
pyhton=3.7

Ø 4.在虚拟环境中安装ros库

$ conda activate
$ pip install rospkg/rospy

注:不管是不是虚拟环境,只要安装了rospkg 就一定能找到ros的包如rospy,
std_msgs等,因此便可进行话题通信和服务通信
Ø 5.将moveit功能封装成一个server (第6讲-Moveit基础-python/ros服务通信)

$ rosrun ur_planning moveitServer.py

Ø 6.环境中脚本中写一个client,通过服务通信与moveit功能连接
在这里插入图片描述
在这里插入图片描述

11. 基于ROS-Moveit实现6-DOF视觉抓取

11.1 视觉抓取

  1. 平面抓取
    Ø Cornell数据集:1035张RGBD,8019个标签
    Ø Jacquard数据集:54K张RGBD,110万个标签
    Ø 经典平面抓取算法:GGCNN[1]、GRCNN[2]、
    Swin-Transformer[3]
  2. 六自由度抓取
    GraspNet-1Billion数据集

在这里插入图片描述
在这里插入图片描述

11.系统框架设计

n 运动规划
Ø 作用:到达算法指定
位置和姿态
Ø 路径规划:从当前位
置到期望位置规划一
条无碰撞轨迹
n 手眼标定
Ø 作用:获得机器人坐标系和相机
坐标系的关系
Ø 效果:目前可达到误差在±5mm在这里插入图片描述
在这里插入图片描述

11. 3 抓取实验

n graspness[6]单物体抓取实验
抓取物品清单:
共11个物体:1.苹果 2.香蕉 3.手电筒 4.棒球
5.鞋刷 6.羽毛球盒 7.收音机 8.羽绒服清洁剂
9.小白鞋清洁剂 10.U盘 11.遥控器
在这里插入图片描述

11.3 抓取实验

n graspness[6]复杂场景连续抓取实验
Ø 结论:与其他算法相比,graspness[6]抓取姿态预测结果更准确;对大多数小物体
和与背景颜色相同的物体也能检测出抓取姿态,鲁棒性更强。
Ø 存在的问题:
l 过于“平坦”且高度较低的物体,很难检测到抓取姿态
l 抓取过程中,可能产生对其他物体的碰撞
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Redis源码篇 - Reactor设计模式 和 Redis Reactor设计模式

Reactor &#xff1a;反应器模式或者应答者模式&#xff0c;它是一种基于事件驱动的设计模式。拥有一个或者多个输入源&#xff0c;通过反应器分发给多个worker线程处理&#xff0c;实现并发场景下事件处理。 此图网上找的&#xff0c;画的很好&#xff1a;

中国新一代载人运载火箭“长征十号”发布,衍生型号积极研发中

我国新一代载人运载火箭“长征十号”已发布&#xff0c;主要用于将月面着陆器和登月飞船送入地月转移轨道。此外&#xff0c;“长征十号”还有一个衍生型号正在积极研发中。根据中国运载火箭技术研究院官方消息&#xff0c;近期&#xff0c;火箭院北京强度环境研究所圆满完成了…

SQlite3数据库相关相关命令

1&#xff09;系统命令 以 ‘.’ 开头 .help 帮助手册 .exit 退出 .table 查看当前数据库的有的表格名 .databases .schema 查看表的结构属性2&#xff09;sql语句 以 ;结尾 1. 创建表格 create table <table-name> (id integer, age integer, name char, score f…

夜深人静学32系列18——DMA+ADC单/多通道采集

夜深人静学32系列18——DMAADC单/多通道采集 DMA & ADC (理论篇)DMADMA框图DMA通道与外设对应表 ADC重要知识不同模式组合的作用 为什么要是用DMA ADC&#xff1f;DMA & ADC (实战篇)任务要求原理图CubeMX配置代码实现实验现象 很久没更新了&#xff0c;这次我们浅浅的…

MVSNet、PatchMatchNet环境配置、运行演示

文章目录 1 环境配置要求2 配置流程2.1 创建新环境mvs环境2.2 配置 PatchMatchNet环境3 程序运行演示1 环境配置要求 Ubuntu 18.04 python 3.7 , CUDA 10.1。 requirements.txt torch==1.4.0 torchvision==0.5.0 opencv-python numpy plyfile pillow tensorboard以上环境MV…

Docker 快速搞定 selenium grid 分布式测试

目录 前言&#xff1a; NO.1 搭环境 NO.2 写代码 NO.3 并发 感想 前言&#xff1a; Docker是一个流行的容器化平台&#xff0c;它可以帮助开发人员快速构建、部署和运行应用程序。Selenium Grid是一个用于分布式测试的工具&#xff0c;它可以并行执行多个测试用例&#xf…

做接口测试需要哪些技能、怎么做?

目录 1、什么是接口测试&#xff1f; 2、接口测试需要会什么&#xff1f; 3、如何学这些技能&#xff1f; 4、如何获取接口相关信息&#xff1f; 5、如何进行进行接口测试&#xff1f; 6、自动化接口测试 7、其他 1、什么是接口测试&#xff1f; 定义&#xff1a;测试系…

【ARM Coresight 系列文章 10 - ARM Coresight STM 介绍及使用】

文章目录 ARM System Trace MacrocellSTM FeaturesSTM 与 ETM/PTM的差异STM Master ARM System Trace Macrocell ARM 对STM 的解释是其支持高带宽的"仪器化输出"&#xff0c;仪器化输出其实也就是像 Cortex-M 系列中的 ITM 一样&#xff0c;通过将数据写入 STM 的 s…

(中等)LeetCode 328. 奇偶链表 Java

对于链表中有零个、一个、两个节点的情况&#xff0c;直接返回即可 对于链表的节点数大于两个的情况&#xff0c;需要讨论&#xff0c;看当前节点是第奇数个节点还是第偶数个节点 class Solution {public ListNode oddEvenList(ListNode head) {if (head null || head.next …

Android Glide onlyRetrieveFromCache downloadOnly submit ,kotlin

Android Glide onlyRetrieveFromCache downloadOnly submit ,kotlin Glide预加载&#xff0c;加载到磁盘或者内存缓存&#xff0c;然后加载的图片只从缓存&#xff08;磁盘缓存或者内存缓存&#xff09;中取。 private val imageFile File("/storage/emulated/0/DCIM/Ca…

百科创建必看攻略!人物百度百科怎么创建?5分钟教会你创建人物百度百科词条

百度人物百科是一个广受欢迎的在线百科平台&#xff0c;它为用户提供了一个便捷的方式来了解各种各样的人物信息。如果你有一个人物的详细资料&#xff0c;你可以通过创建一个百度人物百科页面来分享这些信息。 下面是分媒互动分享的创建百度人物百科页面的步骤以及需要注意的几…

ConfigMap 补充 和 Secret

对于上一篇文章我们分享了为什么要使用 ConfigMap &#xff0c;我们创建 ConfigMap 的时候可以传入单个或者多个键值对&#xff0c;也可以传入文件&#xff0c;还分享了如何简单的传入 ConfigMap 里面的数据作为环境变量 我们补充一下使用 ConfigMap 一次性传递多个条目吧 一…

直击现场|Sui Builder House巴黎站倒计时0天

Sui Builder House下一站即将在法国巴黎举行&#xff0c;为世界各地的开发人员提供在这座被誉为“City of Light”的城市学习和交流的机会。 Sui Builder House将于7月18–19日在巴黎举行&#xff0c;这是展示Sui突破性技术的绝佳机会。在丹佛Builder House活动之后&#xff0c…

PCIe总线的链路训练

目录 概述 链路训练的目的 几个关键概念 Lane reveral &#xff1a; Polarity inversion&#xff1a; De-skew&#xff1a; link number&#xff1a; Lane number&#xff1a; Bit lock&#xff1a; Symbol lock&#xff1a; 几个特殊序列&#xff1a; TS1和TS2&am…

深度学习系列8——分类模型评估指标

1. 概述 1.1 分类 分类&#xff1a;标签为离散值。 回归&#xff1a;标签为连续值。 2. 混淆矩阵 二分类的混淆矩阵&#xff1a; TP 和 TN 为网络预测正确的部分&#xff0c;FP 和 FN 为网络预测错误的部分。 3. 二级指标 准确率&#xff1a; 针对模型的整体评估&#xf…

Java基础之复习笔记(上)

目录 一、Java是什么&#xff1f; &#x1f496;Java概念 &#x1f496;Java运行机制 二、Java的语言基础 &#x1f496;关键字 &#x1f496;基本数据类型 &#x1f496;运算符 三、Java逻辑控制 &#x1f496;分支结构 &#x1f496;循环结构 四、Java的方法 &#…

嵌入式基础知识-系统调度

系统调度是操作系统重要功能&#xff0c;在嵌入式开发&#xff0c;也要了解系统调度的基本原理。对于嵌入式Linux开发&#xff0c;一般使用多线程和多进程开发&#xff0c;对于运行RTOS的嵌入式系统&#xff0c;一般使用多任务开发。这些线程、进程、任务的调度&#xff0c;有许…

RS232转Profinet网关怎么设置

大家好&#xff0c;今天我要给大家带来一个很有意思的案例分享。你们猜猜&#xff0c;这回我们要用远创智控的一款神奇的网关YC-RSPN-002做什么呢&#xff1f;没错&#xff0c;我们要把一台扫码枪设备通过这个RS232转PROFINET网关&#xff0c;接入到一台西门子S7-1200PLC的Prof…

在这个高度自动化的时代,为什么自动化测试取代不了手功测试?

在这个高度自动化的时代&#xff0c;为什么自动化测试取代不了手功测试&#xff1f;06:1101自动化测试和手工测试的概念 自动化测试和手工测试都是软件测试的两种基本方法。 自动化测试是基于脚本或工具自动执行测试用例的过程。测试人员可以使用自动化测试工具来编写测试脚本…

【美团面试】软件测试面试题

一、设计登录界面测试用例 功能测试(Function test) 0. 什么都不输入&#xff0c;点击提交按钮&#xff0c;看提示信息。&#xff08;非空检查&#xff09; 1.输入正确的用户名和密码&#xff0c;点击提交按钮&#xff0c;验证是否能正确登录。&#xff08;正常输入&#xff0…