TF 坐标变换(已整理)

2023-05-16

文章目录

    • 坐标msg消息
    • 静态坐标变换
      • 1. C++实现
        • 发布方 demo01_static_pub.cpp
        • 订阅方 demo02_static_sub.cpp
      • 2. Python实现
        • 发布方 demo01_static_pub_p.py
        • 订阅方 demo02_static_sub_p.py
    • 动态坐标变换
      • 获取话题: rostopic list
      • 获取消息类型:rostopic info /turtle1/pose
      • 获取消息格式: rosmsg info turtlesim/Pose
      • 1. C++实现
        • 发布方 demo01_dynamic_pub.cpp
        • 订阅方 demo02_dynamic_sub.cpp
      • 2. Python实现
        • 发布方 demo01_dynamic_sub_p.py
        • 订阅方 demo02_dynamic_sub_p.py

坐标msg消息

geometry_msgs/TransformStamped
传输坐标系相关位置信息
std_msgs/Header header
uint32 seq
time stamp
string frame_id 被参考坐标系(基坐标系)
string child_frame_id 另外坐标系
geometry_msgs/Transform transform
geometry_msgs/Vector3 translation 平移
float64 x
float64 y
float64 z
geometry_msgs/Quaternion rotation 坐标A相对于坐标B的欧拉角(三个角)
float64 x 四元数,旋转
float64 y
float64 z
float64 w

geometry_msgs/PointStamped
传输某个坐标系内坐标点的信息
std_msgs/Header header
uint32 seq
time stamp
string frame_id
geometry_msgs/Point point
float64 x
float64 y
float64 z

静态坐标变换

静态坐标变换,是指两个坐标系之间的相对位置是固定的。
问题背景:
现有一机器人模型,核心构成包含主体与雷达,各对应一坐标系,坐标系的原点分别位于主体与雷达的物理中心,已知雷达原点相对于主体原点位移关系如下: x 0.2 y0.0 z0.5。当前雷达检测到一障碍物,在雷达坐标系中障碍物的坐标为 (2.0 3.0 5.0),请问,该障碍物相对于主体的坐标是多少?

建文件
tf01_static
roscpp rospy std_msgs tf2 tf2_ros tf2_geometry_msgs geometry_msgs

查看
rostopic list
rostopic echo /tf_static

图形化设置
rviz

transforms:
header:
seq: 0
stamp:
secs: 1658132852
nsecs: 825164513
frame_id: “base_link”
child_frame_id: “laser”
transform:
translation:
x: 0.2
y: 0.0
z: 0.5
rotation:
x: 0.0
y: 0.0
z: 0.0
w: 1.0

1. C++实现

发布方 demo01_static_pub.cpp

#include"ros/ros.h"
#include"tf2_ros/static_transform_broadcaster.h"
#include"geometry_msgs/TransformStamped.h"
#include"tf2/LinearMath/Quaternion.h"

/*
    需求: 发布两个坐标系的相对关系

    流程:
        1. 包含头文件
        2. 设置编码 节点初始化 NodeHandle
        3. 创建发布对象
        4. 组织被发布的消息
        5. 发布数据
        6. spin()
*/

int main(int argc, char *argv[])
{
    
    // 2. 设置编码 节点初始化 NodeHandle
    setlocale(LC_ALL,"");
    ros::init(argc,argv,"static_pub");
    ros::NodeHandle nh;

    // 3. 创建发布对象 静态坐标转换广播器,对应头文件2
    tf2_ros::StaticTransformBroadcaster pub;

    // 4. 组织被发布的消息,对应头文件3
    geometry_msgs::TransformStamped tfs;// 创建坐标系信息
    tfs.header.stamp = ros::Time::now();
    tfs.header.frame_id = "base_link";// 相对坐标系关系中被参考的那个,基坐标系
    tfs.child_frame_id = "laser";//雷达坐标系
    tfs.transform.translation.x = 0.2;//雷达x偏移值
    tfs.transform.translation.y = 0.0;//雷达y偏移值
    tfs.transform.translation.z = 0.5;//雷达z偏移值

    // 4.1 需要根据欧拉角转换 对应头文件4
    tf2::Quaternion qtn; // 创建四元数对象
    // 4.2 向该对象设置欧拉角,这个对象可以将欧拉角转换成四元数
    qtn.setRPY(0,0,0);// 设置偏航值,俯仰值,翻滚值,单位是弧度
    tfs.transform.rotation.x = qtn.getX();
    tfs.transform.rotation.y = qtn.getY();
    tfs.transform.rotation.z = qtn.getZ();
    tfs.transform.rotation.w = qtn.getW();

    // 5. 发布数据
    pub.sendTransform(tfs);

    // 6. spin()
    ros::spin();

    return 0;
}

订阅方 demo02_static_sub.cpp

#include"ros/ros.h"
#include"tf2_ros/transform_listener.h"
#include"tf2_ros/buffer.h"
#include"geometry_msgs/PointStamped.h"
#include"tf2_geometry_msgs/tf2_geometry_msgs.h"

/*
    订阅方: 订阅发布的坐标系相对关系,传入一个坐标系,调用tf实现转换

    流程:
        1. 包含头文件
        2. 编码 初始化 NodeHandle(必须)
        3. 创建订阅对象: ---> 订阅坐标系相对关系
        4. 组织一个坐标点数据
        5. 转换算法,需要调用tf内置实现
        6. 最后输出
*/

int main(int argc, char *argv[])
{
    // 2. 编码 初始化 NodeHandle(必须)
    setlocale(LC_ALL,"");
    ros::init(argc,argv,"static_sub");
    ros::NodeHandle nh;

    // 3. 创建订阅对象: ---> 订阅坐标系相对关系 头文件2\3
    // 3.1 创建一个buffer缓存
    tf2_ros::Buffer buffer;
    // 3.2 再创建监听对象(监听对象可以将订阅的数据存入buffer)
    tf2_ros::TransformListener listener(buffer);

    // 4. 组织一个坐标点数据 头文件4
    geometry_msgs::PointStamped ps;
    ps.header.stamp = ros::Time::now();
    ps.header.frame_id = "laser";// 坐标系 障碍物位置相对于雷达坐标系而言
    ps.point.x = 2.0; // 障碍物相对于雷达坐标系的位置
    ps.point.y = 3.0;
    ps.point.z = 5.0;
    
    // 添加休眠 防止订阅方没有订阅到发布方消息
    ros::Duration(2).sleep();
    // 5. 转换算法,需要调用tf内置实现
    ros::Rate rate(1);
    while(ros::ok())
    {
        // 核心代码 ---- 将 ps 转换成相对于 base_link的坐标点 头文件5
        geometry_msgs::PointStamped ps_out; 
        /*
            调用buffer(数据存在缓存buffer里面)的转换函数 transform
            参数1: 被转换的坐标点
            参数2: 目标坐标系
            返回值: 输出的坐标点
            注意1: 调用时必须包含头文件 tf2_geometry_msgs/tf2_geometry_msgs.h
            注意2: 运行时存在的问题,抛出一个异常 base_link不存在
                  原因:
                     订阅数据是一个耗时操作,可能调用transform转换函数时,
                     坐标系相对关系还没有订阅到,因此出现异常
                  解决:
                     方案1: 在调用转换函数时,执行休眠
                     方案2: 进行异常处理


        */
        ps_out = buffer.transform(ps,"base_link"); // 目标点信息,基参考系,输出转换后的坐标

        // 6. 最后输出 
        ROS_INFO("转换后的坐标值:(%.2f,%.2f,%.2f),参考的坐标系:%s",
                    ps_out.point.x,
                    ps_out.point.y,
                    ps_out.point.z,
                    ps.header.frame_id.c_str()
                    );
        rate.sleep();
        ros::spinOnce();
    }
    return 0;
}

2. Python实现

发布方 demo01_static_pub_p.py

#! /usr/bin/env python

"""
    发布方: 发布两个坐标系的相对关系(车辆底盘 --- base_link 和 雷达 --- laser)
    流程:
        1. 导包
        2. 初始化节点
        3. 创建发布对象
        4. 组织被发布的数据
        5. 发布数据
        6. spin()
"""

import rospy
import tf2_ros
import tf
from geometry_msgs.msg import TransformStamped

if __name__ == "__main__":
     
    # 2. 初始化节点
    rospy.init_node("start_pub_p")
    # 3. 创建发布对象 头文件2
    pub = tf2_ros.StaticTransformBroadcaster()
    # 4. 组织被发布的数据 头文件4
    tfs = TransformStamped()
    # 4.1 header
    tfs.header.stamp = rospy.Time.now()
    tfs.header.frame_id = "base_link"
    # 4.2 child frame
    tfs.child_frame_id = "laser"
    # 4.3 相对关系(偏移 与 四元数)
    tfs.transform.translation.x = 0.2
    tfs.transform.translation.y = 0.0
    tfs.transform.translation.z = 0.5
    # 4.4 先从欧拉角转换成四元数 头文件3
    qtn = tf.transformations.quaternion_from_euler(0,0,0)
    # 4.5 再设置四元数
    tfs.transform.rotation.x = qtn[0]
    tfs.transform.rotation.y = qtn[1]
    tfs.transform.rotation.z = qtn[2]
    tfs.transform.rotation.w = qtn[3]

    # 5. 发布数据
    pub.sendTransform(tfs)
    # 6. spin()
    rospy.spin()

订阅方 demo02_static_sub_p.py

#! /usr/bin/env python

"""
    订阅方: 订阅坐标变换消息,传入被转换的坐标,调用转换算法

    流程:
        1. 导包
        2. 初始化
        3. 创建订阅对象
        4. 组织被转换的坐标点
        5. 转换逻辑实现,调用tf封装的算法
        6. 输出结果
"""

import rospy
import tf2_ros
from tf2_geometry_msgs import tf2_geometry_msgs

if __name__ == "__main__":

    # 2. 初始化
    rospy.init_node("static_sub_p")

    # 3. 创建订阅对象
    # 3.1 创建一个缓存对象 头文件2
    buffer = tf2_ros.Buffer()
    # 3.2 创建订阅对象(将缓存传入)
    sub = tf2_ros.TransformListener(buffer)

    # 4. 组织被转换的坐标点 头文件3
    ps = tf2_geometry_msgs.PointStamped()
    ps.header.stamp = rospy.Time.now()
    ps.header.frame_id = "laser"
    ps.point.x = 2.0
    ps.point.y = 3.0
    ps.point.z = 5.0

    # 5. 转换逻辑实现,调用tf封装的算法
    rate = rospy.Rate(1)
    while not rospy.is_shutdown():
        # 使用try防止
        try:
            # 转换实现
        """
            参数1: 被转换的坐标点
            参数2: 目标坐标系
            返回值: 转换后的坐标点

            PS:
            问题: 抛出异常 base_link 不存在
            原因: 转换函数调用时,可能还没有订阅到坐标系的相对关系
            解决: try 捕获异常,并处理
        """
            ps_out = buffer.transform(ps,"base_link")
            # 6. 输出结果
            rospy.loginfo("转换后的坐标:(%.2f,%.2f,%.2f),参考的坐标系: %s",
                        ps_out.point.x,
                        ps_out.point.y,
                        ps_out.point.z,
                        ps_out.header.frame_id)
        except Exception as e:
            rospy.logwarn("错误提示:%s",e) 
        
        rate.sleep()

当坐标系之间的相对位置固定时,那么所需参数也是固定的: 父系坐标名称、子级坐标系名称、x偏移量、y偏移量、z偏移量、x 翻滚角度、y俯仰角度、z偏航角度,实现逻辑相同,参数不同,那么 ROS 系统就已经封装好了专门的节点,摄像头相对于基坐标系位置
rosrun tf2_ros static_transform_publisher 0.1 0.0 0.3 0 0 0 /base_link /camera

rviz
依次是偏航角,俯仰角,翻滚角

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

偏航:Yaw
俯仰:Pitch
翻滚:Roll
X轴:红色(翻滚角)正值 顺时针转动;负值 逆时针转动
Y轴:绿色(俯仰角)
Z轴:蓝色(偏航角)
在这里插入图片描述

在这里插入图片描述

动态坐标变换

话题:/turtle1/pose
消息类型:turtlesim/Pose
消息格式:

float32 x
float32 y
float32 theta
float32 linear_velocity
float32 angular_velocity

获取话题: rostopic list

rosrun turtlesim turtlesim_node
rostopic list

/rosout
/rosout_agg
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose 位姿发布使用的话题

获取消息类型:rostopic info /turtle1/pose

turtle1/pose
Type: turtlesim/Pose 消息类型
Publishers: * /turtlesim (http://rosnoetic-VirtualBox:37261/)
Subscribers: None

获取消息格式: rosmsg info turtlesim/Pose

float32 x
float32 y
float32 theta
float32 linear_velocity
float32 angular_velocity

1. C++实现

发布方 demo01_dynamic_pub.cpp

#include"ros/ros.h"
#include"turtlesim/Pose.h"
// 创建发布对象
#include"tf2_ros/transform_broadcaster.h"
// 组织发布数据
#include"geometry_msgs/TransformStamped.h"
// 坐标系四元数
#include"tf2/LinearMath/Quaternion.h"
/*
    发布方: 需要订阅乌龟的位姿信息, 转换成相对于窗体的坐标关系,并发布
    准  备: 
        话题: /turtle1/pose
        消息: turtlesim/Pose

    流程:
        1. 包含头文件
        2. 设置编码,初始化, NodeHandle
        3. 创建订阅对象,订阅/turtle1/pose
        4. 回调函数处理订阅信息: 将位姿信息转换成坐标相对关系并发布(关注)
        5. spin()

*/

// 给传进回调函数的数据定义范型 头文件2
void doPose(const turtlesim::Pose::ConstPtr& pose){
    // 获取位姿信息,转换成坐标系相对关系(核心),并发布
    // a. 创建发布对象 头文件3
    static tf2_ros::TransformBroadcaster pub;

    // b. 组织被发布的数据 头文件4
    geometry_msgs::TransformStamped ts;
    ts.header.frame_id = "world"; // 相对于世界坐标系
    ts.header.stamp = ros::Time::now();
    ts.child_frame_id = "turtle1";
    // 坐标系偏移量
    ts.transform.translation.x = pose->x;
    ts.transform.translation.y = pose->y;
    ts.transform.translation.z = 0; // z一直是零(2D)
    // 坐标系四元数 头文件5
    /*
        位姿信息中没有四元数,但是有偏航角度,又已知乌龟时2D,没有翻滚和俯仰角,所以得出乌龟的
        欧拉角: 0 0 theta
    */
    tf2::Quaternion qtn;
    qtn.setRPY(0,0,pose->theta);
    ts.transform.rotation.x = qtn.getX();
    ts.transform.rotation.y = qtn.getY();
    ts.transform.rotation.z = qtn.getZ();
    ts.transform.rotation.w = qtn.getW();

    // c. 发布
    pub.sendTransform(ts);

}

int main(int argc, char *argv[])
{
    // 2. 设置编码,初始化, NodeHandle
    setlocale(LC_ALL,"");
    ros::init(argc,argv,"dynamic_pub");
    ros::NodeHandle nh;

    // 3. 创建订阅对象,订阅/turtle1/pose
    ros::Subscriber sub = nh.subscribe("/turtle1/pose",100,doPose);

    // 4. 回调函数处理订阅信息: 将位姿信息转换成坐标相对关系并发布(关注)
    // 5. spin()
    ros::spin();
    return 0;
}

订阅方 demo02_dynamic_sub.cpp

roscore
rosrun turtlesim turtlesim_node
rosrun tf02_dynamic demo01_dynamic_pub
rosrun tf02_dynamic demo02_dynamic_sub

#include"ros/ros.h"
#include"tf2_ros/transform_listener.h"
#include"tf2_ros/buffer.h"
#include"geometry_msgs/PointStamped.h"
#include"tf2_geometry_msgs/tf2_geometry_msgs.h"

/*
    订阅方: 订阅发布的坐标系相对关系,传入一个坐标系,调用tf实现转换

    流程:
        1. 包含头文件
        2. 编码 初始化 NodeHandle(必须)
        3. 创建订阅对象: ---> 订阅坐标系相对关系
        4. 组织一个坐标点数据
        5. 转换算法,需要调用tf内置实现
        6. 最后输出
*/

int main(int argc, char *argv[])
{
    // 2. 编码 初始化 NodeHandle(必须)
    setlocale(LC_ALL,"");
    ros::init(argc,argv,"dynamic_sub");
    ros::NodeHandle nh;

    // 3. 创建订阅对象: ---> 订阅坐标系相对关系 头文件2\3
    // 3.1 创建一个buffer缓存
    tf2_ros::Buffer buffer;
    // 3.2 再创建监听对象(监听对象可以将订阅的数据存入buffer)
    tf2_ros::TransformListener listener(buffer);

    // 4. 组织一个坐标点数据 头文件4
    geometry_msgs::PointStamped ps;
    // 参考的坐标系
    ps.header.frame_id = "turtle1";// 坐标系 物体位置相对于乌龟坐标系而言
    // 时间戳
    ps.header.stamp = ros::Time(0.0);
    
    ps.point.x = 2.0; // 物体相对于乌龟坐标系的位置
    ps.point.y = 3.0;
    ps.point.z = 5.0;
    
    // 添加休眠 防止订阅方没有订阅到发布方消息(这个方法不建议用,最好使用try方法
    // ros::Duration(2).sleep();
    // 5. 转换算法,需要调用tf内置实现
    ros::Rate rate(1);
    while(ros::ok())
    {
        // 核心代码 ---- 将 ps 转换成相对于 base_link的坐标点 头文件5
        geometry_msgs::PointStamped ps_out; 
        /*
            调用buffer(数据存在缓存buffer里面)的转换函数 transform
            参数1: 被转换的坐标点
            参数2: 目标坐标系
            返回值: 输出的坐标点
            注意1: 调用时必须包含头文件 tf2_geometry_msgs/tf2_geometry_msgs.h
            注意2: 运行时存在的问题,抛出一个异常 base_link不存在
                  原因:
                     订阅数据是一个耗时操作,可能调用transform转换函数时,
                     坐标系相对关系还没有订阅到,因此出现异常
                  解决:
                     方案1: 在调用转换函数时,执行休眠
                     方案2: 进行异常处理


        */
       try
       {
            ps_out = buffer.transform(ps,"world"); // 目标点信息,基参考系,输出转换后的坐标 头文件5r

            // 6. 最后输出 
            ROS_INFO("转换后的坐标值:(%.2f,%.2f,%.2f),参考的坐标系:%s",
                        ps_out.point.x,
                        ps_out.point.y,
                        ps_out.point.z,
                        ps.header.frame_id.c_str()
                        );
       }
       catch(const std::exception& e)
       {
           ROS_INFO("异常消息:%s",e.what());
       }
        
        rate.sleep();
        ros::spinOnce();
    }
    
    return 0;
}

2. Python实现

发布方 demo01_dynamic_sub_p.py

roscore
rosrun turtlesim turtlesim_node
cd demo02_ws/
source ./devel/setup.bash
rosrun tf02_dynamic demo01_dynamic_pub_p.py

/rosout
/rosout_agg
/tf
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose

rostopic echo /tf 查看具体信息

ransforms:
header:
seq: 0
stamp:
secs: 1658287751
nsecs: 917598485
frame_id: “world”
child_frame_id: “turtle1”
transform:
translation:
x: 5.544444561004639
y: 5.544444561004639
z: 0.0
rotation:
x: 0.0
y: 0.0
z: 0.0
w: 1.0

#! /usr/bin/env python

"""
    发布方: 需要订阅乌龟的位姿信息, 转换成相对于窗体的坐标关系,并发布
    准  备: 
        话题: /turtle1/pose
        消息: turtlesim/Pose

    流程:
        1. 包含头文件
        2. 初始化ROS节点
        3. 创建订阅对象,订阅/turtle1/pose
        4. 回调函数处理订阅信息: 将位姿信息转换成坐标相对关系并发布(关注)
        5. spin()
"""

import rospy
from turtlesim.msg import Pose
import tf2_ros
from geometry_msgs.msg import TransformStamped
import tf
def doPose(pose):
    # 1. 创建发布坐标系相对关系的对象 头文件3
    pub = tf2_ros.TransformBroadcaster()
    # 2. 将 pose 转换成 坐标系相对关系消息 头文件4
    ts = TransformStamped()
    ts.header.frame_id = "world"
    ts.header.stamp = rospy.Time.now()
    ts.child_frame_id = "turtle1"
    
    # 2.1 子级坐标系相对于父级坐标系的偏移量
    ts.transform.translation.x = pose.x
    ts.transform.translation.y = pose.y
    ts.transform.translation.z = 0

    # 2.2 四元数 头文件5
    # 从欧拉角转换四元数
    """
        乌龟是2D,不存在 x 上的翻滚和 y 上的俯仰,只有 z 上的偏航
        0 0 pose.theta
    """
    qtn = tf.transformations.quaternion_from_euler(0,0,pose.theta)
    ts.transform.rotation.x = qtn[0]
    ts.transform.rotation.y = qtn[1]
    ts.transform.rotation.z = qtn[2]
    ts.transform.rotation.w = qtn[3]

    # 3. 发布
    pub.sendTransform(ts)

if __name__ == "__main__":

    # 2. 初始化ROS节点
    rospy.init_node("dynamic_pub_p")
    # 3. 创建订阅对象 头文件2
    sub = rospy.Subscriber("/turtle1/pose",Pose,doPose,queue_size = 100)# /tur是话题名称

    # 4. 回调函数处理订阅信息
    # 5. spin()
    rospy.spin()

订阅方 demo02_dynamic_sub_p.py

roscore
cd demo02_ws/
rosrun turtlesim turtlesim_node
source ./devel/setup.bash
rosrun tf02_dynamic demo01_dynamic_pub_p.py
rosrun tf02_dynamic demo02_dynamic_sub_p.py
控制乌龟运动
rosrun turtlesim turtle_teleop_key

#! /usr/bin/env python

"""
    订阅方: 订阅坐标变换消息,传入被转换的坐标,调用转换算法

    流程:
        1. 导包
        2. 初始化
        3. 创建订阅对象
        4. 组织被转换的坐标点
        5. 转换逻辑实现,调用tf封装的算法
        6. 输出结果
"""

import rospy
import tf2_ros
from tf2_geometry_msgs import tf2_geometry_msgs

if __name__ == "__main__":

    # 2. 初始化
    rospy.init_node("dynamic_sub_p")

    # 3. 创建订阅对象
    # 3.1 创建一个缓存对象 头文件2
    buffer = tf2_ros.Buffer()
    # 3.2 创建订阅对象(将缓存传入)
    sub = tf2_ros.TransformListener(buffer)

    # 4. 组织被转换的坐标点 头文件3
    ps = tf2_geometry_msgs.PointStamped()
    # 时间戳--0
    ps.header.stamp = rospy.Time()
    # 坐标系
    ps.header.frame_id = "turtle1"
    ps.point.x = 2.0
    ps.point.y = 3.0
    ps.point.z = 5.0

    # 5. 转换逻辑实现,调用tf封装的算法
    rate = rospy.Rate(1)
    while not rospy.is_shutdown():
        # 使用try防止
        try:
            # 转换实现
        """
            参数1: 被转换的坐标点
            参数2: 目标坐标系
            返回值: 转换后的坐标点

            PS:
            问题: 抛出异常 base_link 不存在
            原因: 转换函数调用时,可能还没有订阅到坐标系的相对关系
            解决: try 捕获异常,并处理
        """
            ps_out = buffer.transform(ps,"world")
            # 6. 输出结果
            rospy.loginfo("转换后的坐标:(%.2f,%.2f,%.2f),参考的坐标系: %s",
                        ps_out.point.x,
                        ps_out.point.y,
                        ps_out.point.z,
                        ps_out.header.frame_id)
        except Exception as e:
            rospy.logwarn("错误提示:%s",e) 
        
        rate.sleep()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TF 坐标变换(已整理) 的相关文章

  • 内外网共用操作

    1 首先将内网 外网的两根网线接入交换机 xff0c 再从交换机出来一根线接入你的电脑 xff08 如果是路由器的话 xff0c 内网 外网的网线接入LAN口 xff0c 再从LAN口出来一根线接入你的电脑 xff09 2 打开IP设置 x
  • 【从零学习OpenCV 4】了解OpenCV的模块架构

    本文首发于 小白学视觉 微信公众号 xff0c 欢迎关注公众号 本文作者为小白 xff0c 版权归人民邮电出版社所有 xff0c 禁止转载 xff0c 侵权必究 xff01 经过几个月的努力 xff0c 小白终于完成了市面上第一本OpenC
  • 对象检测和图像分割有什么区别?

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 01 人工智能中的图像预处理 对象检测和图像分割是计算机视觉的两种方法 xff0c 这两种处理手段在人工智能领域内相当常见 xff0c
  • 基于OpenCV的网络实时视频流传输

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 很多小伙伴都不会在家里或者办公室安装网络摄像头或监视摄像头 但是有时 xff0c 大家又希望能够随时随地观看视频直播 大多数人会选择使
  • 英伟达 GPU显卡计算能力查询表

    近期小白因为项目需要开始在电脑上配置深度学习环境 经过一些列的苦难折磨之后 xff0c 电脑环境终于配置好了 xff0c 但是却被我的显卡劝退了 我是用的是算力2 1的显卡 xff0c 环境要求算力3以上的显卡 xff0c 无奈最后只能使用
  • 一文看懂激光雷达

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 来源 xff1a 摘自中信证券 与雷达工作原理类似 xff0c 激光雷达通过测量激光信号的时间差和相位差来确定距离 xff0c 但其最
  • 传统CV和深度学习方法的比较

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 本文转自 xff1a 新机器视觉 摘要 xff1a 深度学习推动了数字图像处理领域的极限 但是 xff0c 这并不是说传统计算机视觉技
  • Opencv实战 | 用摄像头自动化跟踪特定颜色物体

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 本文转自 xff1a 新机器视觉 1 导语 在之前的某个教程里 xff0c 我们探讨了如何控制Pan Tilt Servo设备来安置一
  • 使用OpenCV和TesseractOCR进行车牌检测

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 目录 1 xff09 目的和简介 2 xff09 前言 3 xff09 使用OpenCV和Haar级联进行车牌检测 4 xff09 使
  • GPS(全球定位系统)

    GPS 全球定位系 统 xff0c 是美国国防部为陆 xff0c 海 xff0c 空三军研制的新一代卫星导航定位系统 xff0c 它是以 24 颗人造卫星作为基础 xff0c 全天候地向全球各地用户提供时实的三维定位 三维测速和全球同步时间
  • 单应性矩阵应用-基于特征的图像拼接

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 本文转自 xff1a 深度学习这件小事 前言 前面写了一篇关于单应性矩阵的相关文章 xff0c 结尾说到基于特征的图像拼接跟对象检测中
  • 前沿 | 一文详解自动驾驶激光雷达和摄像头的数据融合方法

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 本文转自 xff1a 计算机视觉联盟 自动驾驶感知模块中传感器融合已经成为了标配 xff0c 只是这里融合的层次有不同 xff0c 可
  • 使用 YOLO 进行目标检测

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 自从世界了解人工智能以来 xff0c 有一个特别的用例已经被讨论了很多 它们是自动驾驶汽车 我们经常在科幻电影中听到 读到甚至看到这些
  • 概述 | 全景图像拼接技术全解析

    点 击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 前言 图像 视频拼接的主要目的是为了解决相机视野 xff08 FOV Field Of View xff09 限制 xff0c 生成
  • 我靠这份无人机完全指南吹了一整年牛!

    对于多数无人机爱好者来说 xff0c 能自己从头开始组装一台无人机 xff0c 之后加入AI算法 xff0c 能够航拍 xff0c 可以进行目标跟踪 xff0c 是每个人心中的梦想 亲自从零开始完成复杂系统 xff0c 这是掌握核心技术的必
  • 奇异值分解(SVD)原理总结

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 前言 奇异值分解 xff08 SVD xff09 在降维 xff0c 数据压缩 xff0c 推荐系统等有广泛的应用 xff0c 任何矩
  • 用Python实现神经网络(附完整代码)!

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 在学习神经网络之前 xff0c 我们需要对神经网络底层先做一个基本的了解 我们将在本节介绍感知机 反向传播算法以及多种梯度下降法以给大
  • 一文图解卡尔曼滤波(Kalman Filter)

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 译者注 xff1a 这恐怕是全网有关卡尔曼滤波最简单易懂的解释 xff0c 如果你认真的读完本文 xff0c 你将对卡尔曼滤波有一个更
  • 计算机视觉方法概述

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 一 资源简介 今天给大家推荐一份最新的计算机视觉方法概述 xff0c 这份综述详细的讲述了当前计算机视觉领域中各种机器学习 xff0c
  • 通俗易懂的YOLO系列(从V1到V5)模型解读!

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 0 前言 本文目的是用尽量浅显易懂的语言让零基础小白能够理解什么是YOLO系列模型 xff0c 以及他们的设计思想和改进思路分别是什么

随机推荐

  • PWM电流源型逆变器

    nbsp nbsp nbsp nbsp 随着科学技术和生产力的发展 各种结构型式和各种控制方法的逆变器相继问世 而就逆变器而言 不管输出要求恒频恒压还是变频变压 有效消除或降低输出谐波是基本要求 因而逆变电源的谐波抑制一直是研究者致力于解决
  • 下划线在 Python 中的特殊含义

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 Python 中的下划线 下划线在 Python 中是有特殊含义的 xff0c 它们在 Python 的不同地方使用 下面是 Pyth
  • UFA-FUSE:一种用于多聚焦图像融合的新型深度监督混合模型

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 小白导读 论文是学术研究的精华和未来发展的明灯 小白决心每天为大家带来经典或者最新论文的解读和分享 xff0c 旨在帮助各位读者快速了
  • 实战 | 如何制作一个SLAM轨迹真值获取装置?

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 本文知乎作者杨小东授权转载 xff0c 未经授权禁止二次转载 原文 xff1a https zhuanlan zhihu com p
  • 通俗易懂理解朴素贝叶斯分类的拉普拉斯平滑

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 这个男生的四个特征是长相不帅 xff0c 性格不好 xff0c 身高矮 xff0c 不上进 xff0c 我们最终得出的结论是女生不嫁
  • 综述 | 激光与视觉融合SLAM

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 SLAM包含了两个主要的任务 xff1a 定位与构图 xff0c 在移动机器人或者自动驾驶中 xff0c 这是一个十分重要的问题 xf
  • KITTI数据集简介与使用

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 摘要 xff1a 本文融合了Are we ready for Autonomous Driving The KITTI Vision
  • DBSCAN聚类算法原理总结

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 DBSCAN是基于密度空间的聚类算法 xff0c 在机器学习和数据挖掘领域有广泛的应用 xff0c 其聚类原理通俗点讲是每个簇类的密度
  • 深度学习GPU最全对比,到底谁才是性价比之王?

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 本文转自AI新媒体量子位 xff08 公众号 ID QbitAI xff09 搞AI xff0c 谁又没有 GPU之惑 xff1f 张
  • 使用卡尔曼滤波器进行对象跟踪时最容易遗漏什么

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 介绍 卡尔曼滤波器是一种复杂的算法 xff0c 在大多数情况下 xff0c 我们在没有完全理解其方程的情况下使用它 当我开始使用卡尔曼
  • 10分钟掌握异常检测

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 异常检测 也称为离群点检测 是检测异常实例的任务 xff0c 异常实例与常规实例非常不同 这些实例称为异常或离群值 xff0c 而正常
  • 根据图像目标深度测试距离

    clc clear close all warning off addpath 39 func 39 计算物体的深度距离 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • SLAM基础环境配置

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 转自知乎作者 xff1a 佳浩 原文链接 xff1a https zhuanlan zhihu com p 385255026 如今
  • 多传感器融合定位:基于滤波的融合方法

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 SLAM 后端的优化方式大体分为滤波和优化 近些年优化越来越成为主流 xff0c 在学习优化之前 xff0c 掌握滤波的工作原理也十分
  • 不要错过!顶会审稿人带读【大语言模型】前沿论文!

    LLaMA GLM 130B SELF INSTRUCT是三篇最新的语言模型相关的论文 xff0c 它们都展示了语言模型在不同方面的创新和突破 这三篇论文都体现了语言模型在双语 大规模 通用 快速 可复现等方面的重要进展 xff0c 对于语
  • 收藏 | 最全深度学习训练过程可视化工具

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 仅作学术分享 xff0c 不代表本公众号立场 xff0c 侵权联系删除 转载于 xff1a 编辑丨极市平台 机器学习实验室 深度学习训
  • 为什么建议大家使用 Linux 开发?真的很很很优雅!

    点击上方 小白学视觉 xff0c 选择加 34 星标 34 或 置顶 重磅干货 xff0c 第一时间送达 编者荐语 Linux 开发不算简单 xff0c 要求同学们掌握的知识广且复杂 xff0c 有一定难度 但是同学们只要静下心来 xff0
  • favicon.ico不显示

    静态页面中 xff0c title前的favicon ico不显示的问题 原因还不详 解决办法 xff1a 清除浏览器缓存或者将favicon ico文件重命名
  • 树莓派系统镜像的下载和烧录

    一 树莓派镜像下载地址 树莓派官网的下载地址 xff1a 树莓派官网 软件安装 可在官网上下载最新的Raspbian树莓派系统 二 树莓派系统镜像烧写 准备 xff1a 一张2G以上的SD卡及读卡器 xff0c 最好是高速卡 xff0c 推
  • TF 坐标变换(已整理)

    文章目录 坐标msg消息静态坐标变换1 C 43 43 实现发布方 demo01 static pub cpp订阅方 demo02 static sub cpp 2 Python实现发布方 demo01 static pub p py订阅方