国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

ROS:古月居第一次作業(yè)(話題與服務編程、動作編程、TF編程)

這篇具有很好參考價值的文章主要介紹了ROS:古月居第一次作業(yè)(話題與服務編程、動作編程、TF編程)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一.話題與服務編程

話題與服務編程:通過代碼新生一只海龜,放置在(5,5)點,命名為“turtle2”;通過代碼訂閱turtle2的實時位置并打印在終端;控制turtle2實現(xiàn)旋轉(zhuǎn)運動;

demo_turtle.launch

<launch>
<!--海龜仿真器-->
    <node pkg="turtlesim" type="turtlesim_node" name="sim"/>

    <!--鍵盤控制-->
    <node pkg="turtlesim" type="turtle_teleop_key" name="teleop" output="screen"/>
</launch>

demo_turtle.cpp

#include <ros/ros.h>
#include <turtlesim/Spawn.h>//創(chuàng)建turtle2
#include <turtlesim/Pose.h>//訂閱turtle的位姿信息
#include <geometry_msgs/Twist.h>//發(fā)布速度信息

ros::Publisher pub;

//回調(diào)函數(shù)打印turtle2的position
void poseCallback(const turtlesim::PoseConstPtr &msg){
     ROS_INFO("turtle2: X=[%.2f], Y=[%.5f]",msg->x,msg->y);
}

int main(int argc,char** argv){
     ros::init(argc,argv,"create_turtle2");
     ros::NodeHandle node;
     //通過服務調(diào)用,產(chǎn)生第二只烏龜turtle2
     ros::service::waitForService("spawn");
     ros::ServiceClient add_turtle=node.serviceClient<turtlesim::Spawn>("spawn");
     turtlesim::Spawn srv;
     srv.request.x=5;//初始化機器人位置
     srv.request.y=5;
     srv.request.name="turtle2";
     add_turtle.call(srv);
     ROS_INFO("turtle2 already!");

     //訂閱烏龜位姿信息
     ros::Subscriber sub=node.subscribe("/turtle2/pose",10,&poseCallback);

     ROS_INFO("publish vel_cmd!");
     //發(fā)布速度信息
     pub=node.advertise<geometry_msgs::Twist>("/turtle2/cmd_vel",10);
     ros::Rate r(10.0);
     while(ros::ok()){
          //發(fā)布速度信息
          geometry_msgs::Twist twist;
          twist.angular.z=0.5;
          twist.linear.x=0.5;
          pub.publish(twist);
          ros::spinOnce();
          r.sleep();
     }
     return 0;
}

CMakeList.txt

add_executable(demo_turtle src/demo_turtle.cpp)
target_link_libraries(demo_turtle ${catkin_LIBRARIES})

運行:

roslaunch demo_tf demo_turtle.launch
rosrun demo_tf demo_turtle

結(jié)果:

ROS:古月居第一次作業(yè)(話題與服務編程、動作編程、TF編程)

二.動作編程

動作編程:客戶端發(fā)送一個運動目標,模擬機器人運動到目標位置的過程,包含服務端和客戶端的代碼實現(xiàn),要求帶有實時位置反饋。

demo_Client_move.cpp

#include <ros/ros.h>
#include <actionlib/client/simple_action_client.h>
#include "demo_tf/moveAction.h"

typedef actionlib::SimpleActionClient<demo_tf::moveAction> Client;

//當action完成后會調(diào)用該回調(diào)函數(shù)一次
void doneCb(const actionlib::SimpleClientGoalState& state,const demo_tf::moveResultConstPtr& result){
     ROS_INFO("Yay! start moving!");
     ros::shutdown();
}
//當action激活后會調(diào)用該回調(diào)函數(shù)一次
void activeCb(){
     ROS_INFO("Goal just went active");
}
//收到feedback后調(diào)用該回調(diào)函數(shù)
void feedbackCb(const demo_tf::moveFeedbackConstPtr& feedback){
     ROS_INFO("percent_complete: X=[%f], Y=[%f], theta=[%f]",feedback->present_turtle_x,feedback->present_turtle_y,feedback->present_turtle_theta);
}
int main(int argc,char** argv){
     ros::init(argc, argv, "Client");
     //定義一個客戶端
     Client client("move_client",true);
     //等待服務器端
     ROS_INFO("waitint for action server to start.");
     client.waitForServer();
     ROS_INFO("action server started, sending goal");
     //創(chuàng)建一個action的goal
     demo_tf::moveGoal goal;
     goal.turtle_target_x=6.5;
     goal.turtle_target_y=0;
     goal.turtle_target_theta=0;
     //發(fā)送action的goal給服務器,并且設(shè)置回調(diào)函數(shù)
     client.sendGoal(goal,&doneCb,&activeCb,&feedbackCb);
     ros::spin();
     return 0;
}

demo_Service_move.cpp

#include <ros/ros.h>
#include <actionlib/server/simple_action_server.h>
#include "demo_tf/moveAction.h"
#include <turtlesim/Pose.h>
#include <geometry_msgs/Twist.h>

typedef actionlib::SimpleActionServer<demo_tf::moveAction> Server;
//創(chuàng)建發(fā)布者
ros::Publisher pub;
//記錄機器人位置
struct pos{
     float x;
     float y;
     float theta;
}origin_pos,target_pos;
//訂閱小烏龜pose
void poseCallBack(const turtlesim::PoseConstPtr& msg){
     //打印每一次turtle的位姿
     ROS_INFO("Turtle origin position: [%f], [%f], [%f]",msg->x,msg->y,msg->theta);
     origin_pos.x=msg->x;
     origin_pos.y=msg->y;
     origin_pos.theta=msg->theta;
}
//收到action的goal后調(diào)用該回調(diào)函數(shù)
void execute(const demo_tf::moveGoalConstPtr& goal,Server* as){
     ros::Rate r(10);
     demo_tf::moveFeedback feedback;
     ROS_INFO("Turtle goal position: X=[%f], Y=[%f], theta=[%f]",goal->turtle_target_x,goal->turtle_target_y,goal->turtle_target_theta);
     target_pos.x=goal->turtle_target_x;
     target_pos.y=goal->turtle_target_y;
     target_pos.theta=goal->turtle_target_theta;
     geometry_msgs::Twist vel_msgs;
     while(ros::ok()){
          //發(fā)布速度指令
          vel_msgs.linear.x = 0.1; 
          vel_msgs.angular.z = 0.; 
 		pub.publish(vel_msgs);
          //發(fā)布反饋信息(當前機器人位置)
          feedback.present_turtle_x=origin_pos.x;
          feedback.present_turtle_y=origin_pos.y;
          feedback.present_turtle_theta=origin_pos.theta;
          as->publishFeedback(feedback);
          //判斷是否到達目標點
          if(target_pos.x<=origin_pos.x&&target_pos.y<=origin_pos.y&&target_pos.theta<=origin_pos.theta){
               //發(fā)布速度指令
               vel_msgs.linear.x = 0.; 
               vel_msgs.angular.z = 0.; 
 		     pub.publish(vel_msgs);
               break;
          } 
          else
               r.sleep();
     }
     as->setSucceeded();
}
int main(int argc,char** argv){
     ros::init(argc,argv,"Server");
     ros::NodeHandle n,node_server;
     //訂閱小烏龜?shù)奈恢眯畔?     ros::Subscriber sub=node_server.subscribe("turtle1/pose",10,&poseCallBack);
     //申請發(fā)布速度
     pub=node_server.advertise<geometry_msgs::Twist>("turtle1/cmd_vel",10);
     //定義一個服務器 "move_client"為客戶端名稱(要注意對應)
     Server server(n,"move_client",boost::bind(&execute,_1,&server),false);
     ROS_INFO("waiting_Server");
     //服務器開始運行
     server.start();
     ROS_INFO("start_Server");
     ros::spin();
     return 0;
}

debug.launch?

<launch>
     <!--海龜仿真器-->
    <node pkg="turtlesim" type="turtlesim_node" name="sim"/>
    <!--Server-->
     <node pkg="demo_tf" type="demo_Service_move" name="Server" output="screen"/>
</launch>

CMakeList.txt

add_executable(demo_Client_move src/demo_Client_move.cpp)
target_link_libraries(demo_Client_move ${catkin_LIBRARIES})
add_dependencies(demo_Client_move ${${PROJECT_NAME}_EXPORTED_TARGETS})

add_executable(demo_Service_move src/demo_Service_move.cpp)
target_link_libraries(demo_Service_move ${catkin_LIBRARIES})
add_dependencies(demo_Service_move ${${PROJECT_NAME}_EXPORTED_TARGETS})

運行:

roslaunch demo_tf demo_turtle.launch
rosrun demo_tf demo_Client_move

三.TF編程

廣播并監(jiān)聽機器人你的坐標變換,已知激光雷達和機器人底盤的坐標關(guān)系,求解激光雷達數(shù)據(jù)在底盤坐標系下的坐標值。

ROS:古月居第一次作業(yè)(話題與服務編程、動作編程、TF編程)

tf_broadcaster.cpp

/*
     發(fā)布tf變換
*/
#include <ros/ros.h>
#include <tf/transform_broadcaster.h>

int main(int argc,char** argv){
     ros::init(argc,argv,"tf_nroadcaster");
     ros::NodeHandle node;
     static tf::TransformBroadcaster br;
     while(ros::ok()){
          //初始化tf數(shù)據(jù),設(shè)定變換矩陣,也就是激光雷達在底盤坐標系下轉(zhuǎn)換
          //laser_word*word_base=laser_base=transform
          tf::Transform transform;
          transform.setOrigin(tf::Vector3(0.1,0.1,0.2));
          transform.setRotation(tf::Quaternion(0,0,0,2));
          //廣播base_link和base_laser坐標系之間的tf數(shù)據(jù)
          br.sendTransform(tf::StampedTransform(transform,ros::Time::now(),"base_link","base_laser"));
     }
     return 0;
}

tf_listener.cpp

/*
*/
#include <ros/ros.h>
#include <tf/transform_listener.h>
#include <geometry_msgs/PointStamped.h>

int main(int argc, char *argv[])
{
    ros::init(argc, argv, "tf_listener");
    ros::NodeHandle n;
    //創(chuàng)建監(jiān)聽者
    tf::TransformListener listener;
    ros::Rate rate(10.0);
    while (ros::ok())
    {
        geometry_msgs::PointStamped laser_point;
        laser_point.header.frame_id="base_laser";
        laser_point.header.stamp=ros::Time();//此處不能設(shè)置為ros::Time::now(),兩者是不同的,可以看下面參考網(wǎng)址
        laser_point.point.x=0.3;
        laser_point.point.y=0.0;
        laser_point.point.z=0.0;
        try{
            listener.waitForTransform("base_link","base_laser",ros::Time(0),ros::Duration(3.0));
            geometry_msgs::PointStamped base_point;
            listener.transformPoint("base_link",laser_point,base_point);
            ROS_INFO("base_laser: (%.2f, %.2f. %.2f) -----> base_link: (%.2f, %.2f, %.2f) at time %.2f",
                laser_point.point.x, laser_point.point.y, laser_point.point.z,
                base_point.point.x, base_point.point.y, base_point.point.z, base_point.header.stamp.toSec());
        }catch(tf::TransformException& ex){
            ROS_ERROR("Received an exception trying to transform a point from \"base_laser\" to \"base_link\": %s", ex.what());
        }
        rate.sleep();
    }
    
    return 0;
}

CMakeLists.txt

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  tf
)

add_executable(tf_broadcaster src/tf_broadcaster.cpp)
target_link_libraries(tf_broadcaster ${catkin_LIBRARIES})

add_executable(tf_listener src/tf_listener.cpp)
target_link_libraries(tf_listener ${catkin_LIBRARIES})

運行:文章來源地址http://www.zghlxwxcb.cn/news/detail-472150.html

roscore

rosrun demo_tf tf_listener

rosrun demo_tf tf_broadcaster

到了這里,關(guān)于ROS:古月居第一次作業(yè)(話題與服務編程、動作編程、TF編程)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

  • docker第一次作業(yè)

    docker第一次作業(yè) 1.安裝docker服務,配置鏡像加速器 ?yum install -y yum-utils device-mapper-persistent-data lvm2 y um-config-manager --add-repo https: //mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sed -i \\\'s+download.docker.com+mirrors.aliyun.com/docker-ce+\\\' ?/etc/yum.repos.d/docker-ce.repo yum makecache fast yum -y install docke

    2024年02月12日
    瀏覽(26)
  • Python第一次作業(yè)練習

    Python第一次作業(yè)練習

    ?輸入:101?-成績不及格/輸入錯誤(超過100)? 輸入:87?-成績良好 ? ? ?

    2024年02月09日
    瀏覽(26)
  • java第一次作業(yè)(一)

    知識點: 考查java的輸入格式以及for循環(huán) java格式 注意Main與main 代碼: 知識點: for循環(huán) 數(shù)組 /輸入數(shù)組 /數(shù)組比大小 代碼: 知識點: println與print區(qū)別:println是輸完之后轉(zhuǎn)行 重點: 多重for循環(huán) 代碼: 知識點: 調(diào)用函數(shù) booean函數(shù) 重點: Scanner輸入 代碼: 知識點: 最后又有

    2024年03月25日
    瀏覽(33)
  • web集群第一次作業(yè)

    web集群第一次作業(yè)

    ?目錄 一. 簡述靜態(tài)網(wǎng)頁和動態(tài)網(wǎng)頁的區(qū)別 二. 簡述 Web1.0 和 Web2.0 的區(qū)別 三. 安裝tomcat8,配置服務啟動腳本,部署jpress應用。 1. 首先,兩者的 頁面資源特征 不同: 靜態(tài)網(wǎng)頁處理文件類型有.html、.jpg、.gif、.mp4、.swf、.avi、.wmv、.flv等,而動態(tài)網(wǎng)頁后綴常見為.asp、.aspx、.php、

    2024年02月04日
    瀏覽(18)
  • java第一次作業(yè)(二)

    java第一次作業(yè)(二)

    ?思路: 運用expression的字符串輸出 重點: expression輸出 代碼: 知識點: expression輸出 思路: 充分運用兩個for循環(huán),一個掌控行數(shù),一個掌控輸出的數(shù)字 代碼: 知識點: 輸入 數(shù)字所占空格 換行 思路: 這種復雜的配湊問題,不要去想枚舉去解,充分利用for循環(huán)語句 像這題

    2024年04月11日
    瀏覽(18)
  • oop第一次博客作業(yè)

    oop第一次博客作業(yè)

    前言 這學期剛剛接觸面向?qū)ο蟪绦蛟O(shè)計,使用的是java語言。在此之前只接觸過c語言。以我目前的學習進程來看二者的差別更多體現(xiàn)在面向?qū)ο蟮钠渲幸粋€基本特性上,即封裝性。在c語言中幾乎所有內(nèi)容都是公開的,java可以有效得規(guī)避這點。 學習的知識點 1.知道了類間關(guān)系

    2024年04月22日
    瀏覽(27)
  • 數(shù)據(jù)庫第一次作業(yè)

    數(shù)據(jù)庫第一次作業(yè)

    1.創(chuàng)建一個英雄表 create table t_hero ( ? ? ?id int primary key auto_increment, ? ? ?name varchar(10) unique not null, ? ? ?gender char(5) check (gender in (\\\'男\(zhòng)\\',\\\'女\\\')), ? ? ?grade char(5) default \\\'5星\\\', ? ? ?`groups` char(5) check (`groups` in (\\\'毀滅\\\',\\\'巡獵\\\',\\\'智識\\\',\\\'存護\\\',\\\'虛無\\\',\\\'豐饒\\\')), ? ? ?tel char(11) ? default \\\'

    2024年01月18日
    瀏覽(66)
  • 網(wǎng)絡安全第一次作業(yè)

    網(wǎng)絡安全第一次作業(yè)

    1、什么是防火墻 防火墻是一種網(wǎng)絡安全系統(tǒng),它根據(jù)預先確定的安全規(guī)則監(jiān)視和控制傳入和傳出的網(wǎng)絡流量。其主要目的是阻止對計算機或網(wǎng)絡的未經(jīng)授權(quán)的訪問,同時允許合法通信通過。 防火墻可以在硬件、軟件或兩者的組合中實現(xiàn),并且可以配置為根據(jù)各種條件(如

    2024年02月07日
    瀏覽(38)
  • 記第一次大作業(yè):校園導航系統(tǒng)

    記第一次大作業(yè):校園導航系統(tǒng)

    大二迎來了人生中的第一次大作業(yè),因為上個學期轉(zhuǎn)專業(yè)過來,學C的基礎(chǔ)不扎實,湊巧這學期又初識了Java,可以算是我第一門系統(tǒng)學習的語言,本來是想用Java進行設(shè)計的,沒想到我們的數(shù)據(jù)結(jié)構(gòu)老師十分的堅持,一定要用C語言進行實現(xiàn),那就沒辦法啦,就借著這個機會對

    2024年02月09日
    瀏覽(20)
  • 【網(wǎng)絡應用與安全】第一次作業(yè)

    【網(wǎng)絡應用與安全】第一次作業(yè)

    登錄賬號 登錄個人賬號,可以通過圖形界面和命令兩種方式。 圖形界面:當前用戶 logout ,切換用戶,如果備選用戶中沒有自己的用戶名,點擊 not listed ,之后輸入用戶名和密碼登錄即可。 命令:使用 su your_username 方式,回車輸入密碼即可切換。 修改密碼 操作步驟 輸入

    2024年02月07日
    瀏覽(20)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包