日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【RK3399Pro学习笔记】十四、ROS中tf坐标系广播与监听的编程实现

發(fā)布時間:2023/12/9 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【RK3399Pro学习笔记】十四、ROS中tf坐标系广播与监听的编程实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄

  • 創(chuàng)建功能包
  • 如何實現(xiàn)一個tf廣播器
    • 創(chuàng)建tf廣播器代碼(C++)
  • 如何實現(xiàn)一個tf監(jiān)聽器
    • 創(chuàng)建tf監(jiān)聽器代碼(C++)
  • 配置編譯規(guī)則
  • 編譯并運行
  • python
    • 編寫程序
      • turtle_tf_broadcaster.py
      • turtle_tf_listener.py
    • 運行

平臺:華碩 Thinker Edge R 瑞芯微 RK3399Pro
固件版本:Tinker_Edge_R-Debian-Stretch-V1.0.4-20200615


記錄自【古月居】古月·ROS入門21講 | 一學(xué)就會的ROS機(jī)器人入門教程 —— 古月居GYH P18 18.tf坐標(biāo)系廣播與監(jiān)聽的編程實現(xiàn)

創(chuàng)建功能包

cd ~/catkin_workspace/src catkin_create_pkg learning_tf roscpp rospy tf turtlesim

如何實現(xiàn)一個tf廣播器

  • 定義TF廣播器(TransformBroadcaster)
  • 創(chuàng)建坐標(biāo)變換值;
  • 發(fā)布坐標(biāo)變換(sendTransform)
  • 創(chuàng)建tf廣播器代碼(C++)

    nano ~/catkin_workspace/src/learning_tf/src/turtle_tf_broadcaster.cpp /*********************************************************************** Copyright 2020 GuYueHome (www.guyuehome.com). ***********************************************************************//*** 該例程產(chǎn)生tf數(shù)據(jù),并計算、發(fā)布turtle2的速度指令*/#include <ros/ros.h> #include <tf/transform_broadcaster.h> #include <turtlesim/Pose.h>std::string turtle_name;void poseCallback(const turtlesim::PoseConstPtr& msg) {// 創(chuàng)建tf的廣播器static tf::TransformBroadcaster br;// 初始化tf數(shù)據(jù)tf::Transform transform;transform.setOrigin( tf::Vector3(msg->x, msg->y, 0.0) );tf::Quaternion q;q.setRPY(0, 0, msg->theta);transform.setRotation(q);// 廣播world與海龜坐標(biāo)系之間的tf數(shù)據(jù)br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "world", turtle_name)); }int main(int argc, char** argv) {// 初始化ROS節(jié)點ros::init(argc, argv, "my_tf_broadcaster");// 輸入?yún)?shù)作為海龜?shù)拿?/span>if (argc != 2){ROS_ERROR("need turtle name as argument"); return -1;}turtle_name = argv[1];// 訂閱海龜?shù)奈蛔嗽掝}ros::NodeHandle node;ros::Subscriber sub = node.subscribe(turtle_name+"/pose", 10, &poseCallback);// 循環(huán)等待回調(diào)函數(shù)ros::spin();return 0; };

    如何實現(xiàn)一個tf監(jiān)聽器

  • 定義TF監(jiān)聽器;(TransformListener)
  • 查找坐標(biāo)變換;(waitForTransform,lookupTransform)
  • 創(chuàng)建tf監(jiān)聽器代碼(C++)

    nano ~/catkin_workspace/src/learning_tf/src/turtle_tf_listener.cpp /*********************************************************************** Copyright 2020 GuYueHome (www.guyuehome.com). ***********************************************************************//*** 該例程監(jiān)聽tf數(shù)據(jù),并計算、發(fā)布turtle2的速度指令*/#include <ros/ros.h> #include <tf/transform_listener.h> #include <geometry_msgs/Twist.h> #include <turtlesim/Spawn.h>int main(int argc, char** argv) {// 初始化ROS節(jié)點ros::init(argc, argv, "my_tf_listener");// 創(chuàng)建節(jié)點句柄ros::NodeHandle node;// 請求產(chǎn)生turtle2ros::service::waitForService("/spawn");ros::ServiceClient add_turtle = node.serviceClient<turtlesim::Spawn>("/spawn");turtlesim::Spawn srv;add_turtle.call(srv);// 創(chuàng)建發(fā)布turtle2速度控制指令的發(fā)布者ros::Publisher turtle_vel = node.advertise<geometry_msgs::Twist>("/turtle2/cmd_vel", 10);// 創(chuàng)建tf的監(jiān)聽器tf::TransformListener listener;ros::Rate rate(10.0);while (node.ok()){// 獲取turtle1與turtle2坐標(biāo)系之間的tf數(shù)據(jù)tf::StampedTransform transform;try{listener.waitForTransform("/turtle2", "/turtle1", ros::Time(0), ros::Duration(3.0));listener.lookupTransform("/turtle2", "/turtle1", ros::Time(0), transform);}catch (tf::TransformException &ex) {ROS_ERROR("%s",ex.what());ros::Duration(1.0).sleep();continue;}// 根據(jù)turtle1與turtle2坐標(biāo)系之間的位置關(guān)系,發(fā)布turtle2的速度控制指令geometry_msgs::Twist vel_msg;vel_msg.angular.z = 4.0 * atan2(transform.getOrigin().y(),transform.getOrigin().x());vel_msg.linear.x = 0.5 * sqrt(pow(transform.getOrigin().x(), 2) +pow(transform.getOrigin().y(), 2));turtle_vel.publish(vel_msg);rate.sleep();}return 0; };

    配置編譯規(guī)則

    nano ~/catkin_workspace/src/learning_tf/CMakeLists.txt add_executable(turtle_tf_broadcaster src/turtle_tf_broadcaster.cpp) target_link_libraries(turtle_tf_broadcaster ${catkin_LIBRARIES})add_executable(turtle_tf_listener src/turtle_tf_listener.cpp) target_link_libraries(turtle_tf_listener ${catkin_LIBRARIES})

    編譯并運行

    cd ~/catkin_workspace catkin_make# 新建一個終端 source ~/catkin_workspace/devel/setup.bash roscore # 新建一個終端 source ~/catkin_workspace/devel/setup.bash rosrun turtlesim turtlesim_node# 新建一個終端 source ~/catkin_workspace/devel/setup.bash rosrun learning_tf turtle_tf_broadcaster __name:=turtle1_tf_broadcaster /turtle1 # 新建一個終端 source ~/catkin_workspace/devel/setup.bash rosrun learning_tf turtle_tf_broadcaster __name:=turtle2_tf_broadcaster /turtle2# 新建一個終端 source ~/catkin_workspace/devel/setup.bash rosrun learning_tf turtle_tf_listener # 新建一個終端 source ~/catkin_workspace/devel/setup.bash rosrun turtlesim turtle_teleop_key# 新建一個終端 source ~/catkin_workspace/devel/setup.bash rqt_graph

    python

    編寫程序

    cd ~/catkin_workspace/src/learning_tf mkdir scripts

    turtle_tf_broadcaster.py

    nano ~/catkin_workspace/src/learning_tf/scripts/turtle_tf_broadcaster.py #!/usr/bin/env python # -*- coding: utf-8 -*-######################################################################## #### Copyright 2020 GuYueHome (www.guyuehome.com). ### ######################################################################### 該例程將請求/show_person服務(wù),服務(wù)數(shù)據(jù)類型learning_service::Personimport roslib roslib.load_manifest('learning_tf') import rospyimport tf import turtlesim.msgdef handle_turtle_pose(msg, turtlename):br = tf.TransformBroadcaster()br.sendTransform((msg.x, msg.y, 0),tf.transformations.quaternion_from_euler(0, 0, msg.theta),rospy.Time.now(),turtlename,"world")if __name__ == '__main__':rospy.init_node('turtle_tf_broadcaster')turtlename = rospy.get_param('~turtle')rospy.Subscriber('/%s/pose' % turtlename,turtlesim.msg.Pose,handle_turtle_pose,turtlename)rospy.spin()

    turtle_tf_listener.py

    nano ~/catkin_workspace/src/learning_tf/scripts/turtle_tf_listener.py #!/usr/bin/env python # -*- coding: utf-8 -*-######################################################################## #### Copyright 2020 GuYueHome (www.guyuehome.com). ### ######################################################################### 該例程將請求/show_person服務(wù),服務(wù)數(shù)據(jù)類型learning_service::Personimport roslib roslib.load_manifest('learning_tf') import rospy import math import tf import geometry_msgs.msg import turtlesim.srvif __name__ == '__main__':rospy.init_node('turtle_tf_listener')listener = tf.TransformListener()rospy.wait_for_service('spawn')spawner = rospy.ServiceProxy('spawn', turtlesim.srv.Spawn)spawner(4, 2, 0, 'turtle2')turtle_vel = rospy.Publisher('turtle2/cmd_vel', geometry_msgs.msg.Twist,queue_size=1)rate = rospy.Rate(10.0)while not rospy.is_shutdown():try:(trans,rot) = listener.lookupTransform('/turtle2', '/turtle1', rospy.Time(0))except (tf.LookupException, tf.ConnectivityException, tf.ExtrapolationException):continueangular = 4 * math.atan2(trans[1], trans[0])linear = 0.5 * math.sqrt(trans[0] ** 2 + trans[1] ** 2)cmd = geometry_msgs.msg.Twist()cmd.linear.x = linearcmd.angular.z = angularturtle_vel.publish(cmd)rate.sleep()

    運行

    sudo chmod +x ~/catkin_workspace/src/learning_tf/scripts/turtle_tf_broadcaster.py sudo chmod +x ~/catkin_workspace/src/learning_tf/scripts/turtle_tf_listener.py# 新建一個終端 source ~/catkin_workspace/devel/setup.bash roscore # 新建一個終端 source ~/catkin_workspace/devel/setup.bash rosrun turtlesim turtlesim_node# 新建一個終端 source ~/catkin_workspace/devel/setup.bash rosrun learning_tf turtle_tf_broadcaster.py __name:=turtle1_tf_broadcaster _turtle:=turtle1 # 新建一個終端 source ~/catkin_workspace/devel/setup.bash rosrun learning_tf turtle_tf_broadcaster.py __name:=turtle2_tf_broadcaster _turtle:=turtle2# 新建一個終端 source ~/catkin_workspace/devel/setup.bash rosrun learning_tf turtle_tf_listener.py# 新建一個終端 source ~/catkin_workspace/devel/setup.bash rosrun turtlesim turtle_teleop_key# 新建一個終端 source ~/catkin_workspace/devel/setup.bash rqt_graph

    總結(jié)

    以上是生活随笔為你收集整理的【RK3399Pro学习笔记】十四、ROS中tf坐标系广播与监听的编程实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 欧美久久免费 | 亚洲干| 老汉色av | 91视频首页 | 免费看黄色a级片 | 淫五月 | 亚洲一二三区在线观看 | 黄频视频在线观看 | 成人国产精品入口免费视频 | 伊人免费视频 | 性一交一黄一片 | 午夜成人免费电影 | 黄色在线免费观看视频 | 在线不卡毛片 | 黄色录像二级片 | 91手机在线观看 | 免费看片黄色 | 黄色片子免费 | 国产中文字幕一区二区 | 毛片在线观看网站 | 国产精品18久久久 | 欧美一区二区不卡视频 | 国产精品 欧美精品 | 国产日韩欧美亚洲 | 久草午夜 | 亚洲天堂av在线免费观看 | www夜色 | 欧美日韩国产二区 | 天堂男人av| 艳妇乳肉豪妇荡乳av无码福利 | 午夜裸体性播放 | 久久久久久国产视频 | 亚洲精品国产精品国自产网站 | 婷婷深爱网 | 中文字幕日韩精品亚洲一区小树林 | 国产精品久久久久久久免费大片 | 国产精品视频无码 | 国产精品成熟老女人 | 第一毛片 | 亚洲三级欧美 | 国产福利一区二区三区视频 | 日本免费a级片 | 国产ts在线视频 | aaa影院| 亚洲精品激情 | 亚洲国产日韩欧美在线观看 | 免费黄色网址在线 | 日韩网站在线观看 | 亚洲一级片在线观看 | 91片黄在线观看 | 欧美大片在线 | 国产美女久久久 | 国产精品人人妻人人爽 | 一级黄色视屏 | 国产一区二区三区日韩 | a一级黄色片 | 成人精品一区二区三区 | 天天干天天操天天碰 | 99精品无码一区二区 | 成人国产精品免费 | 亚洲丁香花色 | 中文字幕一区二区在线老色批影视 | 91久久久久久久久久久 | 日韩福利在线视频 | 97视频免费在线观看 | 视频一区国产 | 无人码人妻一区二区三区免费 | 草草在线影院 | 国产精品日日摸夜夜爽 | 欧美一区二区三区在线观看视频 | 亚洲三级黄色片 | 捅肌肌 | 色91精品久久久久久久久 | 能免费看18视频网站 | 日本在线激情 | 久久久久久成人精品 | 成人爱爱 | 中文字幕av一区二区三区人妻少妇 | 131美女爱做视频 | 狠狠干男人的天堂 | 久草观看视频 | 国产欧美又粗又猛又爽 | 男女黄色录像 | 日韩有码中文字幕在线观看 | 亚洲美女福利视频 | 日韩在线观看一区二区 | 亚洲成人午夜影院 | 男人的天堂亚洲 | 日韩五月 | 视频在线观看电影完整版高清免费 | 人妻妺妺窝人体色www聚色窝 | 日韩欧美区 | 免费精品无码AV片在线观看黄 | 国内国产精品天干天干 | 97在线免费观看视频 | 奇米一区| www.国产在线观看 | 色多多在线观看 | 中文字幕在线网 |