python - ROS TurtleBot 2 激光扫描仪似乎可以扫描侧面
问题描述
我是 ROS 新手,我的任务是开发一种算法,只要他面前没有障碍物,它就可以让机器人向前移动,但它一直卡在我设置的障碍物中在他面前的凉亭模拟中。当我深入检查时,我发现我的机器人似乎扫描到侧面而不是前面。当我检查扫描仪激光的规格时,它说扫描的角度应该最大在 -90 度到 90 度之间,最好比那个小得多。因此,由于“硬件”问题,我似乎无法完成任务,但这对我来说似乎很奇怪。有人可以帮忙吗?
这是我的代码:
#!/usr/bin/python
#
# stopper.py
#
# Created on:
# Author:
#
import rospy
import math
from geometry_msgs.msg import Twist
from sensor_msgs.msg import LaserScan
class Stopper(object):
def __init__(self, forward_speed):
self.forward_speed = forward_speed
self.min_scan_angle = -10/180*math.pi
self.max_scan_angle = 10 / 180 * math.pi
self.min_dist_from_obstacle = 0.5
self.keep_moving = True
self.command_pub = rospy.Publisher("/cmd_vel_mux/input/teleop", Twist, queue_size=10)
self.laser_subscriber = rospy.Subscriber("scan",LaserScan, self.scan_callback, queue_size=1)
def start_moving(self):
rate = rospy.Rate(10)
rospy.loginfo("Starting to move")
while not rospy.is_shutdown() and self.keep_moving:
self.move_forward()
rate.sleep()
def move_forward(self):
move_msg = Twist()
move_msg.linear.x = self.forward_speed
self.command_pub.publish(move_msg)
def scan_callback(self, scan_msg):
for dist in scan_msg.ranges:
if dist < self.min_dist_from_obstacle:
self.keep_moving = False
break
解决方案
您应该能够选择自己感兴趣的角度。-90 度和 +90 度只是激光扫描仪测量的端点。所以你得到一个数据集,在不同的角度有很多距离。要检测机器人前方的障碍物,您需要在数据集中间选择一个(或多个)测量值(我的知识很生疏,我假设范围从 -90° 到 90° 排序,所以 0° 在中间的数组)。因此,您可能不想遍历所有距离,msg.ranges
而只想遍历一个子集。
我发现本教程展示了如何读取数据并从不同角度访问值。
推荐阅读
- javascript - 本地数据不是 ajax 的 DataTable 刷新按钮
- html - 左侧的徽标,而文本居中并与徽标平行
- key - iptables规则和zabbix Item key
- azure - Azure App Service 应用程序设置 - 看不到密钥保管库参考详细信息
- python - 类和输入作为值
- django - 在 django-rest-framework 中是否有用于验证的灵丹妙药?
- python - 根据另一列拆分 DataFrame 中的行(每小时)
- azure-devops - Azure DevOps:将文件复制到任务失败,并显示“未找到 SourceFolder:D:\a\1\s\$(Build.SourceDirectory)”
- javascript - 如何将 div 放在粘性导航栏下?
- javascript - 你会如何推荐我自动化网站数据输入?