TF学习

TF学习

一、tf::TransformListener

void lookupTransform(const std::string &target_frame, const std::string &source_frame, const ros::Time &time, StampedTransform &transform) const------Get the transform between two frames by frame ID

二、tf::StampedTransform

TF::stampedtransform是TF的一种特殊情况:它需要frame_id和stamp以及child_frame_id。参见https://www.cnblogs.com/li-yao7758258/p/7672521.html和https://blog.csdn.net/sru_alo/article/details/92804479

三、tf::Transform

包含旋转矩阵和位移向量

四、tf::poseTFToMsg

convert Pose to Pose msg

五、读取任意两个坐标系之间的其次变换关系

这里实现了两个marker的读取及机械臂到达两个marker的位置,并且加入了机械臂末端与marker相对的坐标关系,以下代码都是在这篇博客https://blog.csdn.net/qq_34897331/article/details/100982041和https://blog.csdn.net/qq_23670601/article/details/96704852的基础上修改的

#include "ros/ros.h"
#include <cstdlib> 
#include "std_msgs/Float64.h"
#include <unistd.h>
#include<iostream> //C++标准输入输出库 
#include <vector>
#include "std_msgs/String.h"
#include "geometry_msgs/PoseStamped.h"
#include <kinova_msgs/ArmPoseActionGoal.h> // 注意格式源文件名字为ArmPose.action
#include <ros/ros.h>
#include <kinova_driver/kinova_ros_types.h>

#include <actionlib/client/simple_action_client.h>
#include <kinova_msgs/SetFingersPositionAction.h>
#include <kinova_msgs/ArmPoseAction.h>
#include <kinova_msgs/HomeArm.h>
#include <kinova_msgs/ArmJointAnglesAction.h>
#include <tf/transform_broadcaster.h>
#include <tf/transform_listener.h>
#include <geometry_msgs/TransformStamped.h>

#include <Eigen/Core>
#include <Eigen/Geometry>
#include <cmath>
using namespace std;
const int FINGER_MAX = 3000;

class tl1{
   
public:
    tl1();
    void registerNodeHandle(ros::NodeHandle& _nh);
    void registerSub();
    void registerSrv();
    void MarkerCallback();
    bool cartesian_pose_client(float x, float y, float z, float qx, float qy, float qz, float qw);
    bool finger_control_client(float finger1, float finger2, float finger3);
    void GotoHome(kinova_msgs::HomeArm& _srv);
    bool getTransform(const std::string& refFrame,
                    const std::string& childFrame)
   {
   
    std::string errMsg;

    if ( !_tfListener.waitForTransform(refFrame,
                                       childFrame,
                                       ros::Time(0),
                                       ros::Duration(0.5),
                                       ros::Duration(0.01),
                                       &errMsg)
         )
    {
   
      ROS_ERROR_STREAM("Unable to get pose from TF: " << errMsg);
      return false;
    }
    else
    {
   
      try
      {
   
        _tfListener.lookupTransform( refFrame, childFrame,
                                     ros::Time(0),                  //get latest available
                                     transform);

       
      }
      catch ( const tf::TransformException& e)
      {
   
        ROS_ERROR_STREAM("Error in lookupTransform of " << childFrame << " in " << refFrame);
        return false;
      }

    }
    return true;
  }
private:
    ros::Subscriber Marke_sub;
    ros::NodeHandle nh;
    ros::ServiceClient start_to_home;
    tf::StampedTransform transform;
    std::string marker_frame;
    std::string camera_frame;
    std::string reference_frame;
    tf::TransformListener _tfListener;
    int tag;
};

int main(int argc, char **argv) {
   


    ros::init(argc, argv, "paragram1");
    ros::NodeHandle node_handle;

    tl1 loandmove;
    kinova_msgs::HomeArm srv;

    loandmove.registerNodeHandle(node_handle);

    loandmove.registerSrv();
    loandmove.GotoHome(srv);
    while ( ros::ok() )
    {
    loandmove.MarkerCallback();
    // ros::Duration( 0.5 ).sleep();
    //sleep(3);
    }
   





    //ros::spin();
    return 0;
}


tl1::tl1(){
   tag=0;};

void tl1::registerNodeHandle(ros::NodeHandle& _nh){
   
    nh = _nh;
};



void tl1::registerSrv(){
   

    start_to_home = nh.serviceClient<kinova_msgs::HomeArm>("j2n6s300_driver/in/home_arm");
    nh.param<std::string>("reference_frame", reference_frame, "j2n6s300_link_base");
    nh.param<std::string>("camera_frame", camera_frame, "j2n6s300_link_base");
    nh.param<std::string>("marker_frame", marker_frame, 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习(Machine learning)是人工智能的子集,是实现人工智能的一种途径,但并不是唯一的途径。它是一门专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能的学科。大概在上世纪80年代开始蓬勃发展,诞生了一大批数学统计相关的机器学习模型。 深度学习(Deep learning)是机器学习的子集,灵感来自人脑,由人工神经网络(ANN)组成,它模仿人脑中存在的相似结构。在深度学习中,学习是通过相互关联的「神经元」的一个深层的、多层的「网络」来进行的。「深度」一词通常指的是神经网络中隐藏层的数量。大概在2012年以后爆炸式增长,广泛应用在很多的场景中。机器学习涵盖了许多不同的算法,用于解决各种类型的问题。以下是一些常见的机器学习算法: 监督学习算法:线性回归(Linear Regression)逻辑回归(Logistic Regression)决策树(Decision Trees)随机森林(Random Forests)支持向量机(Support Vector Machines)朴素贝叶斯(Naive Bayes)K近邻算法(K-Nearest Neighbors)深度学习(Deep Learning)算法,如神经网络(Neural Networks) 无监督学习算法:K均值聚类(K-Means Clustering)层次聚类(Hierarchical Clustering)高斯混合模型(Gaussian Mixture Models)主成分分析(Principal Component Analysis,PCA)关联规则学习(Association Rule Learning) 这只是机器学习领域中的一小部分算法,还有许多其他的算法和技术。根据问题的性质和数据的特点,选择适合的算法是非常重要的。不同的算法有不同的假设和适用场景,因此在学习和应用机器学习算法时,需要综合考虑问题的需求和数据的特点。
TF 2.0深度学习实战4主要介绍了在TensorFlow 2.0版本中如何实现深度学习的相关内容。首先,TensorFlow 2.0版本相比之前的版本有很大的改进和优化,使得我们在构建、训练和部署深度学习模型时更加方便和高效。 在这本书中,我们可以学习到如何使用TF 2.0来构建卷积神经网络(CNN)、循环神经网络(RNN)和转移学习模型等。通过书中的实例代码,我们可以学习到如何使用TF 2.0来训练这些模型,并使用它们来解决实际的问题,比如图像分类、文本生成和语音识别等。 与此同时,本书还介绍了如何使用TF 2.0的低级API和高级API来构建深度学习模型。低级API提供了更加灵活和底层的操作,可以满足一些特定需求;而高级API则提供了更加简单和易于使用的接口,可以加速开发过程。通过书中的实例代码,读者可以学习到如何使用这些API来构建不同类型的深度学习模型。 此外,书中还介绍了TF 2.0版本的Eager Execution(即动态图计算),这是TF 2.0的一个重要特性,使得我们可以实时调试和追踪代码中的计算过程。通过学习如何使用Eager Execution,读者可以更好地理解和调试深度学习模型,并且能够更快地迭代和调整模型的结构和参数。 总之,TF 2.0深度学习实战4是一本介绍如何使用TensorFlow 2.0版本来实践深度学习的实用书籍。通过学习本书,读者可以了解到TF 2.0的优势和特性,并能够熟练地使用TF 2.0构建、训练和部署深度学习模型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值