ROS实践(一)虚拟仿真平台Stage/Gazebo(虚实结合)

目录

一、两者区别

二、Stage仿真

1. 安装stage仿真软件 

2. 编写控制代码

(1)功能1:控制机器人走圆形路线。 

(2)功能2:小车前进1m,后退1m。

(3)功能3:在rviz中显示机器人运动轨迹。

三、Cazebo仿真 

1. 打开Gazebo

2. 创建自己的物体模型models

3. 保存世界文件world

4. 使用launch文件启动gazebo,加载世界文件。

5. 建立简单机器人模型

6. 将简单机器人模型导入我们的world中

7. 给简单机器人添加传感器

8. SLAM建图

9. navigation导航

四、疑难解答


一、两者区别

StageGazebo 都是 ROS 生态系统中的仿真工具,但它们的功能侧重点不同。

Stage:轻量级的 2D 仿真工具,适用于大规模机器人群体仿真。

Gazebo:功能更强大的 3D 物理仿真环境,支持复杂物理交互、传感器建模和机器人动力学仿真。

二、Stage仿真

1. 安装stage仿真软件 

        使用命令:sudo apt-get install ros-noetic-stage-ros来安装。这个平台中有一些自带的.world地图文件,我们可以加载它自带的地图,也可以自己来编写地图文件。

2. 编写控制代码

        我们通过编写的代码,可以控制小车在 Stage 仿真平台或真实小车上的运动。代码通过发布速度指令(Twist 消息)到 /cmd_vel 话题,来驱动小车的运动。小车的地盘运动节点会订阅这个话题,并解析收到的速度数据,然后控制电机转动,从而使小车按照指令移动。

        在 ROS 中,机器人控制的基本原理是:通过发布速度指令到 /cmd_vel 话题,机器人控制器(如 Stage 仿真平台或真实的小车)接收并解析这些指令,进而控制小车的运动。这使得我们既可以在仿真环境中测试小车,也可以在实际的小车上执行相同的操作,达到预期的控制效果。

(1)功能1:控制机器人走圆形路线。 

#!/usr/bin/python
import rospy
from geometry_msgs.msg import Twist

def cmd_velmodule():
    # 初始化ROS节点,节点名称为 'circle_drawer',anonymous=False 使其名称唯一
    rospy.init_node('circle_drawer', anonymous=False)  
    # 创建一个Publisher,发布消息到 /cmd_vel 话题,消息类型为 Twist,队列大小为10
    cmd_pub = rospy.Publisher('/cmd_vel', Twist, queue_size=10)  
    # 设置发布频率为 10Hz
    rate = rospy.Rate(10)  
    # 创建一个 Twist 消息对象,用于存储速度指令
    twist = Twist()
    rospy.loginfo("Start controlling robot to draw a circle")  # 记录日志信息
    # 进入主循环,持续发布速度指令,直到节点被终止
    while not rospy.is_shutdown():
        twist.linear.x = 0.2  # 设置线速度,单位:m/s
        twist.angular.z = 0.4  # 设置角速度,单位:rad/s(正值表示逆时针旋转)
        cmd_pub.publish(twist)  # 发布速度指令到 /cmd_vel 话题
        rate.sleep()  # 休眠以保持 10Hz 的循环频率
if __name__ == "__main__":
    try:
        cmd_velmodule()  # 运行控制函数
    except rospy.ROSInterruptException:
        pass  # 异常处理,当节点被中断时,安全退出

     启动主节点,使用命令运行虚拟地图:rosrun stage_ros stageros $(rospack find stage_ros)/world/willow-erratic.world ,地图文件可以自己来写。

        地图运行完毕后,运行上面我们自己编写的代码文件,就可以看到小车在按照我们编程程序的轨迹在虚拟地图上运行(按照圆形轨迹运动)。

(2)功能2:小车前进1m,后退1m。

#!/usr/bin/env python3
import rospy
from geometry_msgs.msg import Twist
from nav_msgs.msg import Odometry
import math

# 全局变量
current_position = None  # 机器人当前位置信息
target_distance = 1.0  # 目标前进距离(单位:米)
min_velocity = 0.1  # 机器人最小速度
max_velocity = 0.5  # 机器人最大速度
forward_flag = True  # 控制前进/后退方向

def get_odom(data):
    """
    订阅里程计数据回调函数
    获取机器人当前位置并更新全局变量 current_position
    """
    global current_position
    current_position = data.pose.pose.position

def cmd_vel_pub():
    """
    机器人沿直线路径前进一定距离,然后反向移动,实现往返运动
    """
    global target_distance, forward_flag, current_position
    rospy.init_node('line_loop', anonymous=False)    # 初始化 ROS 节点
    cmd_pub = rospy.Publisher('cmd_vel', Twist, queue_size=10)    # 创建 cmd_vel 话题的发布者,控制机器人速度
    rospy.Subscriber('/odom', Odometry, get_odom)    # 订阅 odom 话题,获取里程计数据
    rate = rospy.Rate(10)    # 设定循环频率 10Hz
    twist = Twist()    # 速度控制消息
    rospy.loginfo('Start controlling the robot to move in a line loop')
    while not rospy.is_shutdown():
        # 等待里程计数据更新
        if current_position is None:
            rospy.logwarn("Waiting for odometry data...")
            rate.sleep()
            continue
        start_position = current_position   # 记录初始位置
        while True:
            gap= target_distance - math.sqrt(     # 计算当前距离误差
                (current_position.x - start_position.x) ** 2 + 
                (current_position.y - start_position.y) ** 2
            )
            if gap > 0:
                twist.linear.x = math.sin(gap * math.pi)  # 计算前进速度(使用正弦函数调整平滑加速)
                # 限制速度范围,确保在 min_velocity ~ ma
<think>嗯,用户遇到了Gazebo ROS包的命名冲突问题,需要处理多个包如gazebo_dev、gazebo_msgs等之间的名称冲突。首先,我得回忆ROS包管理机制,特别是关于命名空间和包版本的内容。记得ROS2中可以使用命名空间来隔离不同包的同名节点或话题,但包本身的名称冲突可能需要其他方法解决。 用户提到的这些包都是gazebo_ros_pkgs的部分,可能他们在不同版本或安装方式下被重复安装。例如,用户可能同时通过源码和二进制安装了这些包,导致冲突。这时候需要检查安装来源,统安装方式,比如全部使用apt或者全部从源码编译。 另外,工作空间覆盖(overlay)也可能导致问题。如果用户的工作空间中有多个版本的相同包,ROS会优先使用最新编译的版本,这可能会引发冲突。需要检查工作空间的构建顺序,并清理重复的包。使用命令如`rospack list`或`ros2 pkg list`来确认已安装的包及其路径。 环境变量如ROS_PACKAGE_PATH是否正确设置?如果有多个路径指向不同版本的同包,需要调整环境变量,确保正确的包被优先找到。此外,用户可能安装了不同ROS版本的包,比如同时安装了melodic和noetic的包,这时候需要确认ROS版本的致性,并使用对应的安装命令,如`sudo apt-get install ros-<distro>-gazebo-ros-pkgs`。 还有,用户可能需要手动移除冲突的包。例如,使用`sudo apt remove`来删除不需要的二进制安装包,或者清理源码构建的安装目录。在源码编译时,确保工作空间中没有重复的包,并在编译后正确source setup文件。 最后,如果问题依然存在,可以尝试在隔离环境中测试,比如使用Docker容器,避免系统范围内的包干扰。或者查阅GazeboROS的官方文档,确认各个包的正确安装步骤和依赖关系。</think>针对Gazebo ROS包命名冲突问题,以下是系统化的解决方案: ### 、冲突根源分析 1. **多源安装冲突**:同时存在二进制安装(apt)和源码编译安装时,可能产生重复的$GAZEBO_MODEL_PATH$路径覆盖[^3] 2. **工作空间覆盖**:多个catkin/meta工作空间中存在同名包,ROS会优先使用最后编译的版本 3. **依赖链断裂**:如gazebo_ros_control依赖的$DART$库版本不匹配时,可能触发包管理器错误关联 ### 二、解决方案 #### 方法1:统安装源 ```bash # 清理所有相关包 sudo apt remove ros-<distro>-gazebo-* # 完整安装官方推荐组合(以melodic为例) sudo apt install ros-melodic-gazebo-ros-pkgs \ ros-melodic-gazebo-ros-control \ ros-melodic-gazebo-plugins ``` 安装后验证路径: $$ \text{rospack find gazebo_ros} \equiv /opt/ros/melodic/share/gazebo\_ros $$ #### 方法2:工作空间隔离 ```bash # 创建独立工作空间 mkdir -p ~/custom_gazebo_ws/src cd ~/custom_gazebo_ws/src # 显式克隆指定版本(示例为noetic分支) git clone -b noetic-devel https://github.com/ros-simulation/gazebo_ros_pkgs.git # 使用--override显式声明覆盖 catkin build --override gazebo_ros_pkgs ``` #### 方法3:环境变量控制 在.bashrc中添加优先级控制: ```bash export GAZEBO_MODEL_PATH="/usr/share/gazebo-11/models:${HOME}/.gazebo/models" export LD_LIBRARY_PATH="/opt/ros/<distro>/lib:$LD_LIBRARY_PATH" ``` ### 三、验证流程 1. 通过$catkin list$检查重复包 2. 使用$rospack plugins --attrib=plugin gazebo_ros$验证插件加载顺序 3. 执行$rosdep check gazebo_ros_control$确认依赖完整性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值