gaze如何压缩目录linux,Gazebo添加模型并控制模型运动作为动态障碍物(Ubuntu16.04, Gaze...

Gazebo添加模型并控制模型运动作为动态障碍物(Ubuntu16.04, Gaze

Gazebo添加模型并控制模型运动作为动态障碍物(Ubuntu16.04, Gazebo7.16),附录动态链接库和静态链接库区别

Gazebo作为一个运动仿真环境,可以直接加载编写好的机器人模型(如TIAGo和Yumi等),也可以自己构建多个运动模型,不过稍有难度。在构建复杂运动模型前,我们需要熟悉gazebo模型设置以及插件编写、生成。Gazebo官网有介绍如何搭建小车运行模型以及加载传感器,或者网上也有一些中文教程。

1. 编写生成插件的源文件

Gazebo都是加载world文件,然后world文件中会加载各种模型,所以为了最后可以在world中设置模型的运动,一种方式就是在world文件中加载模型时导入插件,所以我们需要编写一个源程序(命名为animated_box.cc),以此来得到插件。先新建一个目录animal_box,里面存放该源文件。

#include

#include

#include

#include

#include

#include

namespace gazebo

{

class AnimatedBox : public ModelPlugin

{

public: void Load(physics::ModelPtr _parent, sdf::ElementPtr /*_sdf*/)

{

this->model = _parent;

//使用PoseAnimation类实例化一个对象,然后通过三个参数可设置运动模型名称,运动持续时间以及是否循环执行

gazebo::common::PoseAnimationPtr anim(new gazebo::common::PoseAnimation("test", 46.0, false));

//声明一个控制模型位姿的对象

gazebo::common::PoseKeyFrame *key;

//设置模型到达某位姿的时刻

key = anim->CreateKeyFrame(0);

key->Translation(ignition::math::Vector3d(2.5, 0, 0));

key->Rotation(ignition::math::Quaterniond(0, 0, 0));

key = anim->CreateKeyFrame(21.0);

key->Translation(ignition::math::Vector3d(2.5, 0, 0));

key->Rotation(ignition::math::Quaterniond(0, 0, 0));

key = anim->CreateKeyFrame(26.0);

key->Translation(ignition::math::Vector3d(2.0, 0, 0));

key->Rotation(ignition::math::Quaterniond(0, 0, 0));

key = anim->CreateKeyFrame(31.0);

key->Translation(ignition::math::Vector3d(1.5, 0, 0));

key->Rotation(ignition::math::Quaterniond(0, 0, 0));

key = anim->CreateKeyFrame(36.0);

key->Translation(ignition::math::Vector3d(1.0, 0, 0));

key->Rotation(ignition::math::Quaterniond(0, 0, 0));

key = anim->CreateKeyFrame(41.0);

key->Translation(ignition::math::Vector3d(0.5, 0, 0));

key->Rotation(ignition::math::Quaterniond(0, 0, 0));

key = anim->CreateKeyFrame(46);

key->Translation(ignition::math::Vector3d(0, 0, 0));

key->Rotation(ignition::math::Quaterniond(0, 0, 0));

_parent->SetAnimation(anim);

}

private: physics::ModelPtr model;

//通过事件响应来更新触发程序

private: event::ConnectionPtr updateConnection;

};

//在Gazebo仿真器中注册该插件

GZ_REGISTER_MODEL_PLUGIN(AnimatedBox)

}

2. 编写CMakeLists.txt文档

为了对上述源文件进行编译,我们使用cmake编译,也是在animal_box目录,新建一个CMakeLists.txt文档,内容如下图,具体参数代表什么意思,可以参考该Cmake文档。

cmake_minimum_required(VERSION 2.8 FATAL_ERROR)

find_package(Boost REQUIRED COMPONENTS system)

include_directories(${Boost_INCLUDE_DIRS})

link_directories(${Boost_LIBRARY_DIRS})

find_package(Protobuf REQUIRED)

find_package(gazebo REQUIRED)

set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${GAZEBO_CXX_FLAGS}")

include_directories(${GAZEBO_INCLUDE_DIRS})

link_directories(${GAZEBO_LIBRARY_DIRS})

//使用animated_box.cc源文件生成插件,libanimated_box.so库文件

add_library(animated_box SHARED animated_box.cc)

//在生成插件过程中需要使用到的gazebo库文件

target_link_libraries(animated_box ${GAZEBO_LIBRARIES} ${Boost_LIBRARIES})

3. 编译

此时我们还是在animal_box目录下,新建一个build目录,然后进入buid目录右键打开终端,输入【cmake ..】命令,然后再输入【make】命令就会在build目录生成一个libanimated_box.so库文件,如下图

799fa9086cbd2136ff18de41eb3d7b2d.png  

ede8aa8cc3884c0652da7497b564ad77.png

4. 使用插件

在得到插件后,我们需要将该插件在一个world文件中使用,仍旧是在animal_box目录下新建一个animated_box.world文件,然后加入如下代码。

model://ground_plane

model://sun

2.5 0 0 0 0 0

0.3 0.3 1.5

0.3 0.3 1.5

此时在animal_box目录打开终端,输入命令【gazebo --verbose animated_box.world】,此时会报错找不到libanimated_box.so文件,当然了,因为我们的libanimated_box.so文件不在gazebo默认查找的库目录中,所以我们要将生成的库文件放入gazebo默认的库目录(/usr/lib/x86_64-linux-gnu/gazebo-7/plugins)中。由于权限问题,我们使用sudo命令复制,在animal_box目录下打开终端,输入如下指令,此时gazebo默认库目录下会出现libanimated_box.so文件。

sudo cp build/libanimated_box.so /usr/lib/x86_64-linux-gnu/gazebo-7/plugins/libanimated_box.so

a83ceac34fe4854c716116fcb249913c.png

5. 运行效果

86be723a97b739b784a44e80523856e7.gif

附录

1. windows动态链接库后缀名为.dll,静态链接库后缀名为.lib;Linux动态链接库为.so文件,静态链接库为.a

静态链接库会在程序链接阶段和其他.o目标文件(汇编阶段生成)一起生成可执行文件,因此在可执行文件运行时,不再需要静态库文件。而动态链接库文件只在程序运行时才被调用。因此可得静态库文件和动态库文件的特点如下:

a. 因为所有相关静态库文件被链接合成一个可执行文件,所以占用空间

b. 静态库文件更新,那么使用该文件的程序得重新编译生成再发布给用户,导致用户需要整个应用重新下载,全量更新。

c. 动态库文件更新,使用该文件的程序不用重新下载,只需要更换动态库文件即可,增量更新。

d. 不同程序调用相同的库,可以只有一份动态链接库文件,资源共享(所以也叫共享库),而且节省空间。

Gazebo添加模型并控制模型运动作为动态障碍物(Ubuntu16.04, Gaze相关教程

OpenLDAP、什么是目录服务、OpenLDAP简介、LDAP的基本模型、目录

OpenLDAP、什么是目录服务、OpenLDAP简介、LDAP的基本模型、目录树概念、(DC、UID、OU、CN、SN、DN、RDN、c、o)、LDAP的使用 2.OpenLDAP 2.1.什么是目录服务 2.2.OpenLDAP简介 2.3.LDAP的基本模型 2.3.1.目录树概念 2.3.2.DC、UID、OU、CN、SN、DN、RDN、c

Jupyter Notebook 添加代码自动补全功能

Jupyter Notebook 添加代码自动补全功能 Jupyter Notebook 添加代码自动补全功能 安装 如果之前安装过显示目录功能的话,这一步骤可以跳过。 pip install jupyter_contrib_nbextensions 配置 安装完之后需要配置 nbextension,注意配置的时候要确保已关闭 Jup

Android Studio添加android.support.v4包的依赖(解决V4的Fragme

Android Studio添加android.support.v4包的依赖(解决V4的FragmentManager的错误) 添加之前: 一、在项目上单击此按钮 二、Dependencies-app-Library Dependency 三、搜索选择合适的包后OK 若gradle后还是灰色 选择project视图 将gradle.properties的两个值

阿?预训练?成语?模型PALM刷新SOTA

阿?预训练?成语?模型PALM刷新SOTA 公众号关注 “ML_NLP” 设为 “星标”,重磅干货,第一时间送达! 本文分享来自今年阿里达摩院在EMNLP2020上的工作 作者 | 阿里达摩院 1. 前言 阿?巴巴达摩院在提出的StructBERT在GLUE登顶之后,?挑战?然语??成任务。提出的

linux监控平台搭建(2)主动和被动模式添加监控主机添加自定义模板

linux监控平台搭建(2)主动和被动模式、添加监控主机、添加自定义模板、处理图形乱码、自动发现... 主动和被动模式 添加主机 添加主机: 1.添加主机群组: 2.添加主机: 点击主机--创建主机 (1)应用集:是监控项的集合(如:cpu的集合,内存的集合) (2)监控

linux监控平台搭建(3)添加自定义监控项目配置邮件告警测试警报不

linux监控平台搭建(3)添加自定义监控项目、配置邮件告警、测试警报、不发邮件的问题处理... linux监控平台搭建(3)添加自定义监控项目、配置邮件告警、测试警报、不发邮件的问题处理 原创qq5a6d861adfe89 2018-04-15 17:31:28 评论(0)314人阅读 添加自定义监

给自己写的shell脚本添加 --help帮助选项

给自己写的shell脚本添加 --help帮助选项 经常会写一些小的shell脚本工具,给别人使用的时候别人不知道如何使用,怎么添加参数,这个时候你可以给你自己的shell脚本添加一个 --help 参数来提示使用者如何使用(就像外部的Linux命令都有- -help提示一样)。 代

NLP 模型压缩方法综述

NLP 模型压缩方法综述 2020-09-21 10:58 导语:近年来,基于Transformer的语言模型在神经机器翻译,自然语言推理,and 其他一揽子自然语言理解任务中取得了实质性进展。 英语原文:A Survey of Methods for Model Compression in NLP 翻译:wiige 近年来,基

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值