摘要:經歷了五六天的摸索,終于搞出了使用機器人來實現多個位置目標的順序導航,對于自己來說也是一個小小的成功,接下來我給大家進行分享如何實現這個功能如有疑問可以給我發我郵箱對于如何啟動的那些指令我就不再一一敘述,這個是最最基本的。
經歷了五六天的摸索,終于搞出了使用turtlebot機器人來實現多個位置目標的順序導航,對于自己來說也是一個小小的成功,接下來我給大家進行分享如何實現這個功能:如有疑問可以給我發我郵箱:liushengkai008@163.com
對于如何啟動tutlebot的那些指令我就不再一一敘述,這個是最最基本的。roscore別忘了,因為有的時候不打上這個指令會有程序出現問題
第一,我們需要構建好一個地圖,將我們室內的地圖構建好了之后保存下來,這里我要提醒大家一下,構建的地圖默認保存的路徑是在計算機下的tmp文件里,這個文件下的自己保存的地圖map,在關機后系統會默認的把它給刪除,所以我們最好把保存的地圖更換一個路徑保存下來,這樣就方便我們去讀取地圖數據,防止誤刪除辛苦構建的地圖
第二,地圖構建完畢,1、正常啟動turtlebot 2、載入要讀取的地圖,然后將turtlebot_navgation的包放在catkin_ws空間下,這個時候我們需要有一些小的對于安裝包的調整,這個自己捉摸一下很快就會搞定哈哈,不會的可以問我哦,因為是一些小細節,根據出現的問題或百度或其他的資源絕對能夠解決
3、在網上我找到有個隨機導航的算法程序,這個是隨機的路徑的導航不能滿足我們最短時間內的解決我們的問題,所以我對該程序進行了修改,修改后的程序如下:
#-*- coding: UTF-8 -*- #!/usr/bin/env python import roslib; roslib.load_manifest("rbx1_nav") import rospy import actionlib from actionlib_msgs.msg import * from geometry_msgs.msg import Pose, PoseWithCovarianceStamped, Point, Quaternion, Twist from move_base_msgs.msg import MoveBaseAction, MoveBaseGoal from random import sample from math import pow, sqrt m = 1 class NavTest(): def __init__(self): rospy.init_node("nav_test", anonymous=True) rospy.on_shutdown(self.shutdown) self.rest_time = rospy.get_param("~rest_time", 10) self.fake_test = rospy.get_param("~fake_test", False) locations = dict() #locations["hall_foyer"] = Pose(Point(0.643, 4.720, 0.000), Quaternion(0.000, 0.000, 0.223, 0.975)) locations["hall_foyer"] = Pose(Point( 8.168, -2.767, 2.669), Quaternion(0.000, 0.000, 0.223, 0.975)) locations["hall_kitchen"] = Pose(Point(2.531, 0.189, 1.118), Quaternion(0.000, 0.000, -0.670, 0.743)) locations["hall_bedroom"] = Pose(Point(5.629, 7.590, -0.388), Quaternion(0.000, 0.000, 0.733, 0.680)) locations["living_room_1"] = Pose(Point(4.720, 9.551, 2.704), Quaternion(0.000, 0.000, 0.786, 0.618)) locations["living_room_2"] = Pose(Point(3.343, -0.859, -0.864), Quaternion(0.000, 0.000, 0.480, 0.877)) # locations["dining_room_1"] = Pose(Point(25.687,36.060, 2.990), Quaternion(0.000, 0.000, 0.899, -0.451)) #locations["dining_room_2"] = Pose(Point(2.341,37.278, 3.309), Quaternion(0.000, 0.000, 0.892, -0.451)) #locations["dining_room_3"] = Pose(Point(-3.237,30.083, -1.531), Quaternion(0.000, 0.000, 0.896, -0.451)) #locations["dining_room_4"] = Pose(Point(-2.747,11.047, -1.803), Quaternion(0.000, 0.000, 0.895, -0.451)) self.cmd_vel_pub = rospy.Publisher("cmd_vel", Twist) self.move_base = actionlib.SimpleActionClient("move_base", MoveBaseAction) rospy.loginfo("Waiting for move_base action server...") self.move_base.wait_for_server(rospy.Duration(60)) rospy.loginfo("Connected to move base server") initial_pose = PoseWithCovarianceStamped() n_locations = len(locations) start_time = rospy.Time.now() rospy.loginfo("*** Click the 2D Pose Estimate button in RViz to set the robot"s initial pose...") rospy.wait_for_message("initialpose", PoseWithCovarianceStamped) self.last_location = Pose() rospy.Subscriber("initialpose", PoseWithCovarianceStamped, self.update_initial_pose) while initial_pose.header.stamp == "": rospy.sleep(1) rospy.loginfo("Starting navigation test") m="true" while m: if i == n_locations: i = 0 m=0 mm=locations if initial_pose.header.stamp == "": distance = sqrt(pow(locations[location].position.x - locations[last_location].position.x, 2) + pow(locations[location].position.y - locations[last_location].position.y, 2)) else: rospy.loginfo("Updating current pose.") distance = sqrt(pow(locations[location].position.x - initial_pose.pose.pose.position.x, 2) + pow(locations[location].position.y - initial_pose.pose.pose.position.y, 2)) initial_pose.header.stamp = "" i += 1 n_goals += 1 for k in mm: self.goal = MoveBaseGoal() self.goal.target_pose.pose = mm[k] self.goal.target_pose.header.frame_id = "map" self.goal.target_pose.header.stamp = rospy.Time.now() self.move_base.send_goal(self.goal) finished_within_time = self.move_base.wait_for_result(rospy.Duration(300)) rospy.sleep(self.rest_time) def update_initial_pose(self, initial_pose): self.initial_pose = initial_pose def shutdown(self): rospy.loginfo("Stopping the robot...") self.move_base.cancel_goal() rospy.sleep(2) self.cmd_vel_pub.publish(Twist()) rospy.sleep(1) def trunc(f, n): # Truncates/pads a float f to n decimal places without rounding slen = len("%.*f" % (n, f)) return float(str(f)[:slen]) if __name__ == "__main__": try: NavTest() rospy.spin() except rospy.ROSInterruptException: rospy.loginfo("AMCL navigation test finished.")
程序就是這些,需要我們建立一個.py的文件,放入turtlebot_navigation的安裝包下,到時候把地圖載進去之后,運行 python XX.py文件就可以了,最后調出rviz的screen 確定當前的位置就可以自己進行導航了
注意:我們需要通過事先構建好的地圖,來獲取我們想要機器人到達的地方,用rqt_console就可以獲取節點的坐標信息。如有任何問題可以來找我哦
以上的實現了多點導航的問題,但是也有一些的不足之處,比如坐標需要我們事先的輸入進去,不能直接使用鼠標,這個很費力很耗時間,我后期會把這個做一個界面出來,能夠方面操作,大家有任何想法可以跟我交流哦
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/38120.html
摘要:當打開一個新的終端時,環境變量會自動生效。安裝如果你采用我這種方式安裝,那么會在安裝時自動安裝了。需要轉換一個規則,以致于能夠可靠的檢測到工廠快速芯片。規則安裝問題答疑 注意這里只給出我實驗的安裝方式,具體所有的安裝方式請查看:http://wiki.ros.org/turtlebot... 1、安裝 sudo apt-get install ros-indigo-turtlebot ...
摘要:分享的先到這里,下一次我會繼續分享關于的相關學習經驗,這個想法也要感謝公司老大的提示。 對于turtlebot的初學者來說關于它的下載載入指令的繁瑣可能都會比較頭疼,有些指令真的是一遍又一邊的載入,耗費我們大量的時間,那么今天在這里我會分享一個讓指令變簡易的方法,首先,我是在Ubuntu14.04 下的indigo環境,如果你們實現不了請查看編譯環境是否一致: 第一步,在自己的目錄環境...
摘要:開啟你的機器人參考查看底盤是否啟動輸出結果如下說明啟動檢測如果你是第一次運行你的機器人,你需要檢測他的傳感器和執行器能夠工作參考開啟你的機器人檢測保險桿傳感器有三個傳感器前邊中間左前右前。 1、開啟你的turtlebot機器人 參考:http://wiki.ros.org/turtlebot... roslaunch turtlebot_bringup minimal.launch -...
閱讀 1655·2023-04-25 16:29
閱讀 961·2021-11-15 11:38
閱讀 2300·2021-09-23 11:45
閱讀 1428·2021-09-22 16:03
閱讀 2545·2019-08-30 15:54
閱讀 1207·2019-08-30 10:53
閱讀 2606·2019-08-29 15:24
閱讀 1107·2019-08-26 12:25