一、Gazebo仿真中激光雷达避障实战
安装Gazebo仿真软件
获取开源项目
cd ~/catkin_ws/src
git clone https://github.com/6-robot/wpr_simulation.git
安装所需依赖项
~/catkin_ws/src/wpr_simulation/scripts/install_for_noetic.sh
进行编译
cd ~/catkin_ws
catkin_make
启动Gazebo仿真软件
roslaunch wpr_simulation wpb_simple.launch
安装Rviz三维可视化软件
获取开源项目
cd ~/catkin_ws/src
git clone https://github.com/6-robot/wpr_home.git
安装所需依赖项
~/catkin_ws/src/wpb_home/wpb_home_bringup/scripts/install_for_noetic.sh
进行编译
cd ~/catkin_ws
catkin_make
启动Rviz三维可视化软件
首先在终端内启动Gazebo仿真软件
roslaunch wpr_simulation wpb_simple.launch
然后打开一个新终端运行如下指令启动Rviz
roslaunch wpr_simulation wpb_rviz.launch
仿真环境中利用激光雷达实现简单避障
进入ros环境空间
cd catkin_ws/src/
创建ROS源码包
catkin_create_pkg behavior_pkg rospy std_msgs sensor_msgs geometry_msgs
点开vscode,导入catkin_ws文件夹
创建scripts文件夹,新建节点文件behavior_node.py
#!/usr/bin/env python3
# coding=utf-8
import rospy
from sensor_msgs.msg import LaserScan
from geometry_msgs.msg import Twist
count = 0
# 激光雷达回调函数
def cbScan(msg):
global vel_pub
global count
vel_msg = Twist()
dist = msg.ranges[180]
rospy.logwarn("正前方测距数值 = %.2f", dist)
if count > 0:
count = count -1
rospy.loginfo("持续转向 count = %d", count)
return
if dist > 1.5:
vel_msg.linear.x = 0.05
else:
vel_msg.angular.z = 0.3
count = 50
vel_pub.publish(vel_msg)
# 主函数
if __name__ == "__main__":
rospy.init_node("behavior_node")
# 发布机器人运动控制话题
vel_pub = rospy.Publisher("cmd_vel", Twist, queue_size=10)
# 订阅激光雷达的数据话题
lidar_sub = rospy.Subscriber("scan", LaserScan, cbScan, queue_size=10)
rospy.spin()
代码逐行解释
from sensor_msgs.msg import LaserScan
从 sensor_msgs 消息类型中导入 LaserScan 消息,用于接收激光雷达数据
from geometry_msgs.msg import Twist
从 geometry_msgs 消息类型中导入 Twist 消息,用于发布机器人运动控制指令
count = 0
定义一个全局变量 count,用于控制转向持续的次数
def cbScan(msg):
定义激光雷达数据的回调函数,当接收到激光雷达消息时会自动调用此函数,参数 msg 是接收到的 LaserScan 消息
global vel_pub
global count
声明在函数内部使用这两个全局变量
vel_msg = Twist()
创建一个 Twist 类型的消息对象,用于存储运动控制指令
dist = msg.ranges[180]
获取激光雷达正前方(180 度方向)的距离值。ranges 是一个列表,存储了各个角度的距离测量值
rospy.logwarn("正前方测距数值 = %.2f", dist)
用警告级别日志打印正前方的距离值,保留两位小数
if count > 0:
count = count -1
rospy.loginfo("持续转向 count = %d", count)
return
如果 count 大于 0,说明还需要继续转向:
- 将 count 减 1
- 打印当前 count 值
- 退出函数,不执行后续的速度设置
if dist > 1.5:
vel_msg.linear.x = 0.05
如果正前方距离大于 1.5 米,设置机器人以 0.05m/s 的速度向前移动
else:
vel_msg.angular.z = 0.3
count = 50
否则(距离小于等于 1.5 米):
- 设置机器人以 0.3rad/s 的角速度旋转(转向)
- 将 count 设置为 50,意味着接下来会持续转向 50 次(约 1 秒,取决于激光雷达数据的更新频率)
vel_pub.publish(vel_msg)
发布运动控制指令消息
if __name__ == "__main__":
主函数入口,当脚本被直接执行时运行以下代码
rospy.init_node("behavior_node")
初始化 ROS 节点,节点名称为 "behavior_node"
vel_pub = rospy.Publisher("cmd_vel", Twist, queue_size=10)
创建一个发布者对象,用于向 "cmd_vel" 话题发布 Twist 类型的消息,消息队列大小为 10
lidar_sub = rospy.Subscriber("scan", LaserScan, cbScan, queue_size=10)
创建一个订阅者对象,订阅 "scan" 话题的 LaserScan 类型消息,当收到消息时调用 cbScan 回调函数,消息队列大小为 10
rospy.spin()
进入 ROS 事件循环,保持节点运行,等待接收消息并调用相应的回调函数
这段代码实现了一个简单的避障行为:当机器人正前方有障碍物(距离≤1.5 米)时,会旋转一段时间避开障碍物;否则向前移动。
保存代码ctrl+s
进入这个代码文件所存放的目录
cd ~/catkin_ws/src/behavior_pkg/scripts/
添加可执行权限
chmod +x behavior_node.py
进入ros工作空间
cd ~/catkin_ws/
对软件包进行编译
catkin_make
启动仿真环境Gazebo
roslaunch wpr_simulation wpb_simple.launch
打开一个新的终端,输入如下指令,启动仿真环境Rviz
roslaunch wpr_simulation wpb_rviz.launch
再打开一个新的终端,输入如下指令,运行节点程序
rosrun behavior_pkg behavior_node.py
更多推荐
所有评论(0)