返回列表 发布新帖
查看: 775|回复: 7

导航到分类区,获取放置物体地址

11

主题

17

回帖

231

积分

版主

积分
231
发表于 2024-7-9 21:02:38 | 查看全部 |阅读模式
这段代码的目标是控制一个机器人移动到一个特定的目标位置,并且在机器人移动的过程中执行一些任务。
首先,我们来看`runtask.py`文件中的`run_task`函数。这个函数在接收到启动自动赛的信号后开始执行。函数的主要步骤如下:
1. 初始化一些变量,比如`ret`(用于标志是否导航成功)和`item_type`。
2. 将机器人的机械臂移动到初始位置。
3. 机器人向前移动一段距离,以避免在膨胀区域中导致导航失败。
4. 重置机械臂坐标系,并准备抓取动作。
5. 机器人导航到“Classification_area”(分类区)。如果导航成功,则进行物体识别;如果导航失败,则程序结束。
在`runtask.py`文件中的`goto_local`函数负责将机器人导航到指定的目标位置。这个函数的工作流程如下:
1. 接收一个目标位置的名称(`name`)作为参数。
2. 向MoveBase服务器发布目标位置。
3. 设置一个1分钟的时间限制,等待机器人到达目标位置。
4. 如果机器人在一分钟内没有到达目标位置,则放弃当前目标。
5. 根据返回的状态判断机器人是否成功到达目标位置,并返回相应的布尔值。
这个程序使用了一些ROS的标准功能,比如`rospy.wait_for_message`来等待特定的ROS话题消息,`rospy.Duration`来设置等待时间,以及`rospy.Publisher`来发布消息。程序还使用了`MoveBaseActionResult`消息话题来获取机器人导航任务的结果。



按照识别到物体的位置信息,根据由左到右,确定放置区域。
1 # runtask.py:385⾏
2
3 # 接收到启动⾃动赛信号,开始执⾏任务
4 def run_task(self):
5 ret = False # 是否导航成功标志6 item_type = 0
7 self.arm.arm_home() # 移动机械臂到其他地⽅
8
9 # ===== 现在开始执⾏任务 =====
10 rospy.loginfo("start task now.")
11
12 # ==== 离开起始区,避免在膨胀区域中,导致导航失败 =====
13 self.robot.step_go(0.2)
14 if self.stop_flag: return
15
16 # ==== 移动机械臂 =====
17 self.arm.arm_position_reset() # 重置机械臂坐标系
18 self.arm.arm_grasp_ready() # 移动机械臂到其他地⽅
19
20 if self.robot.goto_local("Classification_area"):
21 rospy.sleep(2)
22 else :
23 rospy.logerr("Navigation to Classification_area failed,please run task
again ")
24 self.stop_flag = True
💡 解析:程序开始时,机器⼈为避免陷⼊膨胀区域,会向前⾛20厘⽶。然⽽这时机器⼈定位坐
标是错乱的,但导航⽬标点已发出, DWA 收到⽆法到达的⽬标点则会以⾃⾝旋转的⽅式等待
前进的时机。因为 DWA 这⼀特性,使得 AMCL 在机器⼈⾃转过程中得以修正机器⼈在场地
上的定位坐标。
💡 解析2:当机器⼈导航⾄分类区时会返回⼀个 True ,执⾏物体识别。
导航失败,则程序结束。
⽬标点导航
1 # runtask.py:291⾏
2
3 def goto_local(self, name):
4 '''
5 根据⽬标点名称,发布⽬标位置到MoveBase服务器,根据返回状态进⾏判断
6 @return: True 为成功到达, False 为失败
7 '''
8
9 # 发布⽬标位置10 self.goto_local_pub.publish("go "+name)
11
12 # 设定1分钟的时间限制,进⾏阻塞等待
13 try:
14 ret_status = rospy.wait_for_message(
15 'move_base/result', MoveBaseActionResult,
rospy.Duration(60)).status.status
16 except Exception:
17 rospy.logwarn("nav timeout!!!")
18 ret_status = GoalStatus.ABORTED
19
20 # 如果⼀分钟之内没有到达,放弃⽬标
21 if ret_status != GoalStatus.SUCCEEDED:
22 rospy.Publisher("move_base/cancel", GoalID, queue_size=1).publish(
23 GoalID(stamp=rospy.Time.from_sec(0.0), id=""))
24 try:
25 rospy.wait_for_message(
26 'move_base/result', MoveBaseActionResult, rospy.Duration(3))
27 except Exception:
28 rospy.logwarn("move_base result timeout. this is abnormal.")
29 rospy.loginfo("==========Timed out achieving goal==========")
30 return False
31 else:
32 rospy.loginfo("==========Goal succeeded==========")
33 return True
1. name :机器⼈要到达的⽬标地点。
2. wait_for_message :等待ROS话题上的消息,直到接收指定获取的ROS话题或超出
所设定的等待时⻓。
3. move_base/result : MoveBaseActionResult 消息话题,⽤于获取机器⼈在导
航任务执⾏的结果。
4. Duration() :设置等待时⻓。
5. GoalStatus.ABORTED :导航任务的执⾏状态,表⽰任务被取消。
6. GoalStatus.SUCCEEDED :表⽰任务已成功。
7. move_base/cancel :GoalID消息话题,⽤于发送取消导航任务的请求。



回复

举报

0

主题

10

回帖

34

积分

新手上路

积分
34
发表于 2024-7-9 21:32:36 | 查看全部
加油
回复

举报

0

主题

11

回帖

36

积分

新手上路

积分
36
发表于 2024-7-10 20:25:58 | 查看全部
不错不错
回复

举报

0

主题

10

回帖

28

积分

新手上路

积分
28
发表于 2024-7-13 15:26:15 | 查看全部
看完之后感悟颇深
回复

举报

0

主题

11

回帖

30

积分

新手上路

积分
30
发表于 2024-7-13 15:37:45 | 查看全部
哇撒,太太棒了
回复

举报

0

主题

12

回帖

40

积分

新手上路

积分
40
发表于 2024-7-13 15:52:13 | 查看全部
加油坚持吃,希望继续分享
回复

举报

0

主题

10

回帖

36

积分

新手上路

积分
36
发表于 2024-7-13 15:57:04 | 查看全部
很详细的解析和代码
回复

举报

0

主题

8

回帖

30

积分

新手上路

积分
30
发表于 2024-7-16 16:48:38 | 查看全部
很好的想法
回复

举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关灯 在本版发帖
扫一扫添加微信客服
返回顶部
快速回复 返回顶部 返回列表