【知識教學文】一起走進ROS的世界吧!-Part3

【知識教學文】一起走進ROS的世界吧!-Part3

好啦!終於要進入為什麼最後會挑ROS把Simple Care往下胡搞的原因了

這次要說的是SLAM與導航的部分

首先,要安裝小烏龜

sudo apt-get install ros-kinetic-turtlesim

然後再下這個指令rosrun turtlesim turtlesim_node

最後再開一個Terminal,下rosrun turtlesim turtle_teleop_key

就可以用Keyboard的上下左右去控制烏龜移動啦!

這裡其實就用到我們第二篇寫的Publisher與Subscriber的概念

此時我們再開一個Terminal輸入 rostopic list

這樣就會看到目前是有哪些topic是正在使用的,然後我們需要用到/turtle1/pose

再來輸入rostopic echo /turtle1/pose,代表我在其中的Terminal控制小烏龜移動後,另一個Terminal可以顯示出目前小烏龜的x y及theta

而當小烏龜移動到畫面的左下角時(如下圖紅框),x y是 0 (原點)

這樣有沒有一點FU了!?在KNN室內定位那2篇文章,我們用了64個點去判斷定位,所以不再是三角定位或多點定位,而是Machine Learning定位,基本是一種硬體愈快,定位速度愈快的暴力定位法 XD

這樣還不足夠選ROS讓我們把頭洗下去的理由,接下來我們來讓小烏龜亂跑,畢竟掃地機器人也是自動跑的,哪有手動控制這麼笨的!?

這個時候要介紹大家另一本書 A Gentle Introduction to ROS” by Jason M. O’Kane

3.3的A publisher program會讓小烏龜亂跑

 

#include<ros/ros.h>

#include<geometry_msgs/Twist.h>

#include<stdlib.h>

 

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

 

ros::init(argc,argv,”turtle_publlisher_node”);

ros::NodeHandle nh;

 

 

ros::Publisher pub=nh.advertise<geometry_msgs::Twist>(“turtle1/cmd_vel”,1000);

 

srand(time(0));

 

ros::Rate rate(2);

while(ros::ok){

geometry_msgs::Twist msg;

msg.linear.x=2*double(rand())/double(RAND_MAX);

msg.angular.z=4*double(rand())/double(RAND_MAX)-2;

 

pub.publish(msg);

 

ROS_INFO_STREAM(“Sending random velocity command:”

<<“linear=”<<msg.linear.x

<<“angular=”<<msg.angular.z);

 

rate.sleep();

}

}

 

 

而3.4 A subscriber program的程式是去Subscribe turtle1/pose,與前面我們用的rostopic echo /turtle1/pose有異曲同工之妙

 

#include<ros/ros.h>

#include<turtlesim/Pose.h>

#include<iomanip>

 

void poseMessageReceived(const turtlesim::Pose& msg){

ROS_INFO_STREAM(std::setprecision(2)<<std::fixed

<<“position=(“<< msg.x <<“,”<<msg.y<<“)”

<<“direction=”<< msg.theta);

 

}

 

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

ros::init(argc, argv, “turtlesim_subscriber_node”);

ros::NodeHandle nh;

 

ros::Subscriber sub=nh.subscribe(“turtle1/pose”,1000,&poseMessageReceived);

 

ros::spin();

 

}

 

如果您不想寫Code,就直接download吧! Github在這兒

記得下載之後要放到catkin_ws/src內,然後再catkin_make哦~

catkin_make 100%就代表沒問題了!

這裡再寫一次步驟

  1. 新的Terminal -> roscore
  2. 開新的Terminal -> rosrun turtlesim turtlesim_node
  3. 再開新的Terminal -> rosrun turtlesim_publisher turtlesim_publisher_exe
  4. 再再開新的Terminal -> rosrun turtlesim_subscriber turtlesim_subscriber_exe

然後就會看到小烏龜在亂跑,而且Subscribe有吐出資料來

這代表我在Subscribe這裡寫成把資料丟到我們的Back_end,不就跟之前的課程,用Linkint7697把資料往後端丟一模模一樣樣!?

更威猛的是,ROS官方這裡有Android版本的Source code啊!!!

實在是太令人感動了!

但上面的Source Code APP要用真實的硬體才容易了解它在做些什麼事

小弟在操作的時候,是手機控制Turtlebot3的硬體,然後在手機顯示出SLAM後的地圖

而Turtlebot3是一個小型機器人,如下圖

這裡有e-Manual,提供給有興趣的夥伴研究,寫得真的很詳細

但我們目前是在Ubuntu上模擬,沒有硬體怎麼辦?

別擔心!ROS都幫我們想好了,而且接下來的模擬SLAM就是小弟下定決心要玩ROS的主因了

如果您跟第一篇一樣 sudo apt-get install ros-kinetic-desktop-full,那麼ROS裡應該有Rviz與Gazebo這兩套模擬器了,如果沒有就麻煩Google一下囉~

先來了解一下何謂gmapping與AMCL

gmapping是沒有圖的時候,我們可以透過SLAM即時建圖,也是可以順便定位存圖的居家好夥伴

而AMCL是已經用gmapping做好圖,或是別人幫我們做好的圖,讓機器人或APP拿來定位用

想要更了解什麼是gmapping與AMCL嗎?→那就一定要提古月居的網誌了

大神寫的可清楚了!!

導航與定位框架  move_base(路徑規劃) amcl(導航與定位)

開個Terminal

export TURTLEBOT3_MODEL=waffle_pi

roslaunch turtlebot3_gazebo turtlebot3_world.launch

 

看不起人啊!居然出現Error!

沒關係,我們在Terminal輸入export SVGA_VGPU10=0再roslaunch一次

或是把它加入.bashrc內

$ echo “export SVGA_VGPU10=0” >> ~/.bashrc

註:大家有興趣可以參考

再一次roslaunch turtlebot3_gazebo turtlebot3_world.launch

終於開啟了烏龜世界

再開個Terminal

export TURTLEBOT3_MODEL=waffle_pi

roslaunch turtlebot3_gazebo turtlebot3_gazebo_rviz.launch

將Gazebo與RViz的視窗放在一起如下圖

上圖右邊會看到Rviz的Turtlebot3有一點點的紅線

沒錯!那個就是模擬的Lidar,SLAM出來的夢中的紅線啊!

再再開個Terminal

export TURTLEBOT3_MODEL=waffle_pi

roslaunch turtlebot3_slam turtlebot3_slam.launch slam_methods:=gmapping

然後就會看到它一直跑

回到RViz按下ADD

選擇Map按下OK

選擇Map裡的Topic -> By topic,再選Map按下ok

再再再開個

Terminal用方向鍵去控制turtlebot3

roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch

Turtlebot3跑完SLAM後會長這樣

 

最後 rosrun map_server map_saver -f ~/map

然後把SLAM相關的東西全部都關掉,然後

export TURTLEBOT3_MODEL=waffle_pi

roslaunch turtlebot3_gazebo turtlebot3_world.launch

 

export TURTLEBOT3_MODEL=waffle

roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:=$HOME/map1.yaml

 

rosrun rviz rviz -d `rospack find turtlebot3_navigation`/rviz/turtlebot3_nav.rviz

 

會發現左邊RViz的圖怪怪的,因為Turtlebot3的位置不對了,所以這樣玩導航就不會正確

在RViz使用2D Pose Estimate把Turtlebot3放在小紅框的位置(如下圖)

註:記得如果Turtlebot的方向是朝上,在RViz就要朝上哦!上圖就是在RViz的方向是朝下,所以看起來怪怪的,跑起來也不對

再來用2D Nav Goal選個方向,會發現綠色箭頭會愈來愈少(收斂中),而且Gazebo的Turtlebot也會跟著跑,終於玩到導航囉~

再再再再開個Terminal -> rostopic list 發現/amcl_pose就是我們要的位置資訊

再再再再再開個Terminal -> rostopic echo /amcl_pose 會一直回傳目前Turtlebot的位置

好啦!寫到這裡,應該知道為什麼要挑選ROS繼續玩下去了吧?

但是我們還是不會推出產品,畢竟我們是開放社群,做產品很燒錢的。

再來就是待在家中,其實連我都不喜歡戴東西在身上,之前在玩Deep Learning與WiFi Finger Print的時候就有一個Idea,如果把WiFi打出去的訊號再回收,用大量數據判斷這個人是誰,就解決了不戴任何裝置在身上的問題,只是那個時候想利用像這三篇文章一樣做實驗去證明我的論點可以做,肯定會有一堆網友打臉說不行,所以沒提出這個Idea,現在不用寫文章證明啦!看這裡

未來的長照方向肯定是機器人加新技術領域的天下,不用再做功德了!

感謝MakerPRO在小弟持續富堅的情況下,催稿生出這三篇(11月還有ROS系列教學文最後一篇,然後就要暫時跟大家說掰掰啦),想要感受如何被催稿嗎?試試MakerPRO吧!

 

另外,ROS在台灣也有2個很活躍的FB社團,一個是ROS Taipei,另一個是ROS Taiwan 2個版主都是神人等級,也感謝幫忙解惑的Steven,不然這一篇寫不出來啊!!!

最後再介紹一本中文釋本,是CAVEDU的曾老大翻釋的,看這本就知道ROS能玩的確實不少

您也有Idea找不到人分享嗎?加入我們吧!絕對不會有打臉狀況,更讚的是我們不收費 XD

 

 

歡迎加入智慧醫療主題論壇:https://goo.gl/aNBkuN

(作者:智慧醫療主題論壇版主Sco;責任編輯:葉佳錚)

 

ROS系列教學文:

【知識教學文】一起走進ROS的世界吧!-Part1

【知識教學文】一起走進ROS的世界吧!- Part2

 

No Comments

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料