安装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

 

 

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐