【仿真环境】Gazebo添加动态障碍物并定义运动轨迹

前言

打算研究一下激光雷达自动跟随功能的算法,研究算法之前需要搭建仿真环境,需求是一辆小车跟一个动态障碍物。

搭建

在Gazebo中放置一个立方体,然后右键编辑模型大小成自己的觉得合适的尺寸大小,保存。
重新打开Gazebo,放置保存模型,然后查看模型名字用于c++程序编写。

#include <ros/ros.h>
#include <gazebo_msgs/ModelState.h>
#include <geometry_msgs/Pose.h>
#include <gazebo_msgs/SetModelState.h>
#include <math.h>
#include <iostream>
#include <string>
using namespace std;


int main(int argc, char **argv) {
    ros::init(argc, argv, "move_gazebo_model");
    ros::NodeHandle n;
    ros::ServiceClient client = n.serviceClient<gazebo_msgs::SetModelState>("/gazebo/set_model_state");
    gazebo_msgs::SetModelState set_model_state_srv;
    gazebo_msgs::ModelState des_model_state;
    geometry_msgs::Twist twist;
    int ans;
    bool do_skew=false;
    int n_line = 0;
    twist.linear.x = 0.0;
    twist.linear.y = 0.0;
    twist.linear.z = 0.0;
    twist.angular.x = 0.0;
    twist.angular.y = 0.0;
    twist.angular.z = 0.0;

    geometry_msgs::Pose pose;
    geometry_msgs::Quaternion quat;
    double x_bias = -0.2;
    double y_bias = -0.03;
    double z_bias = 0.1;
    double x,y,z;
    double dx = 0.15;
    double dy = 0.1;
    double dz = 0.1;
    pose.position.x = x;
    pose.position.y = y;
    pose.position.z = z;
    quat.x = 0.5;
    quat.y = 0.5;
    quat.z = 0.5;
    quat.w = 0.5;
    pose.orientation= quat;
    des_model_state.model_name = "box";
    des_model_state.pose = pose;
    des_model_state.twist = twist;
    des_model_state.reference_frame = "world";
    double qx,qy,qz,qw;
    //do random displacements and skews
    //cout<<"do skews? (0,1): ";
    //cin>>ans;
    //if (ans) do_skew=true;
    do_skew=true;
    while(ros::ok()) {
        qx = 0.0;
        qy = 0.0;
        qz = 0.0;
        qw = 1.0;
        if(n_line == 0){
            x = x + 0.1;
            y = 0.0;
            z = 0.25;
            if(x >= 10){
                n_line = 1;
            }
        }
        else if( n_line == 1){
            x = x ;
            y = y + 0.1;
            z = 0.25;
            if(y >= 10){
                n_line = 2;
            }
        }
        else if(n_line == 2){
            x = x - 0.1;
            y = y ;
            z = 0.25;
            if(x <= -10){
                n_line = 3;
            }
        }
        else if(n_line == 3){
            x = x;
            y = y - 0.1;
            z = 0.25;
            if(y <= -10){
                n_line = 4;
            }
        }
        else if(n_line == 4){
            x = x + 0.1;
            y = y;
            z = 0.25;
            if(x >= 10){
                n_line = 5;
            }
        }
        else if(n_line == 5){
            x = x;
            y = y + 0.1;
            z = 0.25;
            if(y >= 0){
                n_line = 1;
            }
        }
        double norm = sqrt(qx*qx+qy*qy+qz*qz+qw*qw);
        quat.x = qx/norm;
        quat.y = qy/norm;
        quat.z = qz/norm;
        quat.w = qw/norm;

        cout<<"qx, qy, qz, qw= "<<quat.x<<", "<<quat.y<<", "<<quat.z<<", "<<quat.w<<endl;
        cout<<"x,y,z = "<<x<<", "<<y<<", "<<z<<endl;
        pose.orientation= quat;
        pose.position.x = x;
        pose.position.y = y;
        pose.position.z = z;
        des_model_state.pose = pose;
        set_model_state_srv.request.model_state = des_model_state;
        client.call(set_model_state_srv);
        ros::spinOnce();
        ros::Duration(0.1).sleep();
    }
    return 0;
}

在这里插入图片描述我的模型名字为box。

在这里插入图片描述效果视频

  • 10
    点赞
  • 76
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
### 回答1: gazebo 是一种开源的多机器人模拟器,可用于仿真和测试机器人系统。它对于机器人导航和路径规划等应用至关重要。在 gazebo 中,我们可以通过管理障碍物的生存时间来模拟不同的场景和条件。 在 gazebo 中,我们可以使用模型插件来管理障碍物的生存时间。模型插件是一种用于扩展 gazebo 功能的机制,可以向模拟中的模型添加额外的功能。通过编写自定义的模型插件,我们可以控制障碍物的出现和消失时间。 为了管理障碍物的生存时间,我们需要在模型插件中使用定时器。定时器可以在指定的时间间隔内执行特定的函数。我们可以在这个函数中设置障碍物的出现和消失时间,通过在 gazebo添加和移除相应的模型。 当我们想要障碍物持续存在一段时间后消失时,我们可以在模型插件中启动一个定时器,设置特定的时间间隔后,调用一个函数来移除障碍物模型。同样地,当我们想要障碍物在一定时间后出现时,可以编写另一个函数来添加障碍物模型,并设置定时器在一段时间后调用该函数。 通过这样的方式,我们可以在 gazebo 中管理障碍物的生存时间,从而模拟不同的情况和场景。这对于机器人系统的仿真和测试非常有帮助,能够帮助我们评估机器人在不同环境下的导航能力和路径规划效果。 ### 回答2: Gazebo是一种开源的机器人仿真平台,它可以用于模拟机器人在不同环境中的行为。在使用Gazebo进行仿真时,可以通过多种方式来管理障碍物的生存时间。 首先,可以通过在仿真中设置障碍物的属性来控制其生存时间。在Gazebo中,可以为障碍物设置一个持续时间参数。这个参数可以控制障碍物仿真存在的时间长度。当超过指定的时间后,障碍物可以被自动删除或禁用,从而停止其对机器人行为的影响。 其次,可以通过编写脚本或程序来管理障碍物的生存时间。在Gazebo中,可以使用ROS(机器人操作系统)或其他编程语言来编写脚本或程序,通过对障碍物的控制来实现其生存时间的管理。例如,可以编写一个定时器来控制障碍物在指定的时间后被删除或禁用。 此外,还可以根据机器人的行为来动态管理障碍物的生存时间。在Gazebo中,可以使用传感器(如激光雷达或摄像头)来检测机器人与障碍物的距离或碰撞情况。当机器人与障碍物发生碰撞或距离过近时,可以立即删除或禁用障碍物,以模拟真实环境中对障碍物动态管理。 总之,通过设置属性、编写脚本或程序以及根据机器人行为来管理障碍物的生存时间,可以在使用Gazebo进行仿真时有效地控制和模拟障碍物存在和影响。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RockWang.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值