ROS編程(ETH)2018更新版習(xí)題說明(三)

      網(wǎng)友投稿 765 2025-04-01

      習(xí)題3


      課程要點(diǎn):

      - ROS發(fā)布器

      -rqt用戶界面

      - TF轉(zhuǎn)換系統(tǒng)(可選)

      - 機(jī)器人模型(URDF)(可選)

      - 仿真描述(SDF)(可選)

      --練習(xí)--

      本課練習(xí)的目標(biāo)是實(shí)現(xiàn)Husky機(jī)器人閉環(huán)控制。 首先,從激光掃描中獲取支柱(singlepillar)的位置,然后控制機(jī)器人,使其行駛到支柱附近。

      1. 修改上次練習(xí)中的啟動(dòng)文件,以便:

      a.? 鍵盤遙控節(jié)點(diǎn)刪除(keyboard twist node)。

      b.? $(find husky_highlevel_controller)/worlds/singlePillar.world作為世界環(huán)境加載,將singlePillar.world文件從RSL主頁上下載Zip文件并復(fù)制到該文件夾

      A:? 提示與結(jié)果

      launch

      output="screen" launch-prefix="gnome-terminal --command">

      world

      model://sun

      model://ground_plane

      20 5 0.5 0 -0 0

      1

      0.145833

      0

      0

      ROS編程(ETH)2018更新版習(xí)題說明(三)

      0.145833

      0

      0.125

      0.2

      2

      10

      0.2

      2

      0

      0

      2.?從激光掃描中提取支柱相對(duì)于機(jī)器人的位置信息。

      A: 這里只有一個(gè)支柱 ( 類似實(shí)驗(yàn)2 )

      HuskyHighlevelController.hpp

      //------Pillar info----

      pillar position

      float x_pillar;

      float y_pillar;

      // the orientation of the pillar with respect to the x_axis

      float alpha_pillar;

      HuskyHighlevelController.cpp

      int arr_size = floor((scan_msg.angle_max-scan_msg.angle_min)/scan_msg.angle_increment);

      for (int i=0 ; i< arr_size ;i++)

      {

      if (scan_msg.ranges[i] < smallest_distance)

      {

      smallest_distance = scan_msg.ranges[i];

      alpha_pillar = (scan_msg.angle_min + i*scan_msg.angle_increment);

      }

      }

      //Pillar Husky offset pose

      x_pillar = smallest_distance*cos(alpha_pillar);

      y_pillar = smallest_distance*sin(alpha_pillar);

      //cout<<"cout Minimum laser distance(m): "<

      //ROS_INFO_STREAM("ROS_INFO_STREAM Minimum laser distance(m): "<

      //ROS_INFO("Pillar laser distance(m):%lf", smallest_distance);

      ROS_INFO("Pillar offset angle(rad):%lf", alpha_pillar);

      ROS_INFO("pillar x distance(m):%lf", x_pillar);

      ROS_INFO("pillar y distance(m):%lf", y_pillar);

      3.?在創(chuàng)建一個(gè)發(fā)布者到主題 /cmd_vel 上,以便能夠向Husky發(fā)送速度指令(twist),需要將geometry_msgs作為依賴項(xiàng)添加到CMakeLists.txt和package.xml(與sensor_msgs的結(jié)構(gòu)相同)。 (參考講座2,第18幻燈片)

      A:

      CMakeLists

      ## Find catkin macros and libraries

      find_package(catkin REQUIRED COMPONENTS

      roscpp

      sensor_msgs

      geometry_msgs

      )

      ## DEPENDS: system dependencies of this project that dependent projects also need

      catkin_package(

      INCLUDE_DIRS

      include

      # LIBRARIES

      CATKIN_DEPENDS

      roscpp

      sensor_msgs

      geometry_msgs

      # DEPENDS

      )

      package

      husky_highlevel_controller

      0.1.0

      The husky_highlevel_controller package

      Dominic Jud

      BSD

      Dominic Jud

      catkin

      roscpp

      sensor_msgs

      geometry_msgs

      4. 編寫一個(gè)簡(jiǎn)單的P控制器,使Husky行駛到支柱附件。 注意,使用ROS參數(shù)修改控制器增益(參考講座2,第21幻燈片), 將代碼寫入到激光掃描主題的回調(diào)函數(shù)中。

      A:

      hpp

      //----Subscribers----// // subscriber to /scan topic

      ros::Subscriber scan_sub_;

      std::string subscriberTopic_;

      //------Pillar info----pillar position

      float x_pillar;

      float y_pillar;

      // the orientation of the pillar with respect to the x_axis

      float alpha_pillar;

      //-----Publishers-----publisher to /cmd_vel

      ros::Publisher cmd_pub_;

      //------msgs-------twist

      msggeometry_msgs::Twist vel_msg_;

      cpp

      //P-Controller to drive husky towards the pillar

      //propotinal gain

      float p_gain_vel = 0.1;

      float p_gain_ang = 0.4;

      if(x_pillar>0.2)

      {

      if (x_pillar <= 0.4 )

      {

      vel_msg_.linear.x = 0;

      vel_msg_.angular.z = 0;

      }

      else

      {

      vel_msg_.linear.x = x_pillar * p_gain_vel ;

      vel_msg_.angular.z = -(y_pillar * p_gain_ang) ;

      }

      }

      else

      {

      vel_msg_.linear.x = 0;

      vel_msg_.angular.z = 0;

      }

      cmd_pub_.publish(vel_msg_);

      5.?將一個(gè)RobotModel插件添加到RViz,可視化Husky機(jī)器人。 (參考講座3,第17幻燈片)

      A:

      6.?將一個(gè)TF顯示插件添加到RViz。 (參考講座3,第7幻燈片)

      A:

      7.?發(fā)布RViz的可視化標(biāo)記,顯示支柱的估計(jì)位置。 兩種方式如下:

      (簡(jiǎn)易)將激光幀中的點(diǎn)作為RViz標(biāo)記發(fā)布。 RViz會(huì)自動(dòng)將標(biāo)記轉(zhuǎn)換為odom坐標(biāo)。

      參考:http://wiki.ros.org/rviz/DisplayTypes/Marker

      (困難)實(shí)現(xiàn)一個(gè)TF-,將提取的點(diǎn)從激光幀變換到odom幀。

      參考:http://wiki.ros.org/tf/Tutorials/Writing%20a%20tf%20listener%20%28C%2B%2 B%29

      在odom坐標(biāo)中將該點(diǎn)作為RViz標(biāo)記發(fā)布。參考:http://wiki.ros.org/rviz/DisplayTypes/Marker

      A:

      cpp

      //RViz Marker

      marker.header.frame_id = "base_laser"; //base no

      marker.header.stamp = ros::Time();

      marker.ns = "pillar";

      marker.id = 0;

      marker.type = visualization_msgs::Marker::SPHERE;

      marker.action = visualization_msgs::Marker::ADD;

      marker.pose.position.x = x_pillar;

      marker.pose.position.y = y_pillar;

      marker.scale.x = 0.2;

      marker.scale.y = 0.2;

      marker.scale.z = 2.0;

      marker.color.a = 1.0; // Don't forget to set the alpha!

      marker.color.r = 0.1;

      marker.color.g = 0.1;

      marker.color.b = 0.1;

      vis_pub_.publish(marker);

      對(duì)比如下兩圖差異:

      原圖(選自原文檔中):

      --評(píng)分標(biāo)準(zhǔn)--

      啟動(dòng)launch文件。 Husky應(yīng)該向支柱駛?cè)ァ?/p>

      1. Husky正常行駛[20%]

      2. Husky到達(dá)支柱附近[30%]

      查看RViz配置(TF、機(jī)器人模型和激光掃描均正常顯示)。[20%]

      可視化標(biāo)記正確顯示在RViz中。[30%]

      --End--

      機(jī)器人

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:怎樣設(shè)置WPS表格的頁面方向和高寬(wps怎么設(shè)置表格高度和寬度)
      下一篇:如何選定多個(gè)間隔的單元格
      相關(guān)文章
      亚洲精品高清无码视频| 亚洲国产成人精品无码区在线观看| 亚洲高清在线播放| 亚洲精品乱码久久久久久按摩| 亚洲国产黄在线观看| 亚洲AV中文无码乱人伦| 国产精品亚洲专区无码WEB| 日韩国产欧美亚洲v片| 亚洲国产精品成人午夜在线观看 | 亚洲啪啪AV无码片| 亚洲伊人久久大香线蕉综合图片| 亚洲中文字幕成人在线| 亚洲一区二区视频在线观看| 亚洲综合色视频在线观看| 亚洲一级片内射网站在线观看| 亚洲福利精品电影在线观看| 亚洲免费一区二区| 久久久久国产亚洲AV麻豆 | 国产亚洲精品久久久久秋霞| 亚洲真人无码永久在线| 国产精品亚洲A∨天堂不卡| 精品亚洲永久免费精品| 亚洲Av无码精品色午夜| 久久综合亚洲色HEZYO社区 | 亚洲最大中文字幕| 亚洲精品福利你懂| 亚洲精品国产av成拍色拍| 蜜臀亚洲AV无码精品国产午夜.| 国产亚洲精品免费| 久久亚洲欧洲国产综合| 亚洲欧洲精品无码AV| 亚洲国产精品国自产拍电影| 亚洲综合激情另类小说区| 亚洲一区二区三区免费视频| 亚洲色精品三区二区一区| 另类图片亚洲校园小说区| 国产亚洲午夜高清国产拍精品| 亚洲精品国产精品乱码不卡√| 中文字幕亚洲精品资源网| 亚洲入口无毒网址你懂的| 久久精品国产亚洲AV天海翼|