最近呢,我們收到用戶的反饋,雖然我們每期的微信公衆號都有很不錯的內容,但是好多文章都是隻能看一看、學一學,很少可以上手實操體驗。希望我們可以推出不僅可以學習,而且還能上手操作的一些內容文章,我們也是非常關心用戶的需求,由此阿木推出一個新的文章系列——ROS小實驗。“ROS小實驗”系列針對ROS的初學者,整體內容偏簡單,內容爲講解一個ROS下的小功能DEMO開發流程,每期我們都會推出一個不一樣的小功能DEMO,涵蓋ROS絕大部分知識點,大家能從中學習到ROS相關知識點,也能簡單熟悉ROS的開發流程和一些技巧。
本期內容的主題爲“圓龜”,大家都知道圓規是可以畫圓的,但此圓龜非彼圓規,ROS下的小烏龜大家應該都比較熟悉,作爲ROS官方教程御用教官,帶領大部分學習從事於ROS的人員進入ROS的世界中,今天我們也將用這隻小烏龜來畫一個圓。
爲了有一個良好的學習效果,建議大家有能力可以自己先試着開發如何用ROS下的小烏龜畫圓,在遇到問題或者實現不了的情況下再看下面的內容。
從現在開始我們將進入“圓龜”的開發流程。
首先,可以先看一下官方的例程demo(http://wiki.ros.org/ROS/Tutorials/UnderstandingTopics)
該教程是讓用戶控制小烏龜移動,從而去理解ROS的一些概念,從這個教程中,我們可以看出小烏龜移動後是會留下一條白色軌跡,那麼畫圓就是讓烏龜的運動軌跡是一個圓。
首先,我們依次啓動下面三條命令,將控制小烏龜移動的功能demo啓動。
$ roscore $ rosrun turtlesim turtlesim_node $ rosrun turtlesim turtle_teleop_key 使用方向鍵便可以控制小烏龜移動,接下來,我們就需要去剖析小烏龜移動背後的邏輯。 我們需要了解控制小烏龜移動的功能demo的節點信息,使用rqt_graph可視化工具查看。 如上圖所示,可以知道teleop_turtle節點通過/turtle1/cmd_vel話題向turtlesim節點發布了速度控制數據。 通過 rostopic info /turtle1/cmd_vel命令可以發現該話題傳輸的消息類型爲geometry_msgs/Twist類型。 再使用rosmsg show geometry_msgs/Twisit命令可以發現該消息的具體信息。 最後使用rostopic echo /turtle1/cmd_vel命令監聽該話題的輸出,再結合小烏龜的表現形式,不難發現,geometry_msgs/Twsit 消息類型的數據中,linear.x控制小烏龜前進或後退,angular.z控制小烏龜旋轉。 到此爲止,我們已經完全清楚小烏龜的節點信息,話題信息,消息信息以及控制接口等內容,接下來就只剩下如何去控制小烏龜運動了。 通過 v=rw 該公式我們可以清楚地認識到,當小烏龜具有一個固定的線速度和角速度時,就會有一個圓的運動軌跡,那麼現在我們只需要編寫一個ROS程序,向/turtle1/cmd_vel發佈一個固定的線速度和角速度就可以實現“圓龜”了。
現在同學們可以根據上面的信息自行編寫程序代碼實現該功能,也可以參考下面的內容實現(例程以C++代碼實現)。
-
創建工作空間 $ mkdir –p ~/amov_ws/src $ cd amov_ws/src $ catkin_init_workspace
-
創建功能包 $ cd ~/amov_ws/src $ catkin_create_pkg amov roscpp rospy
-
創建CPP文件 $ cd ~/amov_ws/src/amov/src $ gedit circle_turtle.cpp 將以下內容複製粘貼到該文件中,並保存退出 #include "ros/ros.h" #include "geometry_msgs/Twist.h"
int main(int argc, char** argv) { ros::init(argc, argv, "circle_turtle"); ros::NodeHandle n; ros::Publisher pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10); geometry_msgs::Twist twist; twist.linear.x = 2.0; twist.angular.z = 1.0; ros::Rate r(10); while(ros::ok()) { pub.publish(twist); r.sleep(); } return 0; }
1. 修改CMakeLists.txt文件
在CMakeLists.txt文件中加入以下內容
add_executable(circle_turtle src/circle_turtle.cpp)
target_link_libraries(circle_turtle
${catkin_LIBRARIES} )
2. 編譯 $ cd ~/amov_ws $ catkin_make 編譯成功後進入下一步驟
3. 運行程序
打開三個終端,運行下面的指令
第一個終端 $ roscore
第二個終端 $ rosrun turtlesim turtlesim_node
第三個終端 $ source ~/amov_ws/devel/setup.bash $ rosrun amov circle_turtle 運行成功便會看到“圓龜”了
至此,“圓龜”小實驗的內容就全部結束了,希望能對大家的ROS學習能有一定幫助,完成“圓龜”這個功能demo不是目的,通過“圓龜”讓大家簡單瞭解到ROS的開發流程、功能開發思路以及相關工具的使用纔是最重要的。也希望大家能夠舉一反三,能夠在“圓龜”的基礎上玩出更多的花樣。下一期我們將推出用服務的形式來實現不同半徑和時間的“圓龜”,有興趣的朋友們先嚐試完成這樣一個功能demo。 作者:阿木實驗室-木十
- End -
技術發展的日新月異,阿木實驗室將緊跟技術的腳步,不斷把機器人行業最新的技術和硬件推薦給大家。看到經過我們培訓的學員在技術上突飛猛進,是我們培訓最大的價值。如果你在機器人行業,就請關注我們的公衆號,我們將持續發佈機器人行業最有價值的信息和技術。 阿木實驗室致力於前沿IT科技的教育和智能裝備,讓機器人研發更高效!