日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Ubuntu >内容正文

Ubuntu

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

發(fā)布時間:2025/3/19 Ubuntu 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Gazebo添加模型并控制模型运动作为动态障碍物(Ubuntu16.04, Gazebo7.16),附录动态链接库和静态链接库区别 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Gazebo作為一個運動仿真環(huán)境,可以直接加載編寫好的機器人模型(如TIAGo和Yumi等),也可以自己構(gòu)建多個運動模型,不過稍有難度。在構(gòu)建復(fù)雜運動模型前,我們需要熟悉gazebo模型設(shè)置以及插件編寫、生成。Gazebo官網(wǎng)有介紹如何搭建小車運行模型以及加載傳感器,或者網(wǎng)上也有一些中文教程。

1. 編寫生成插件的源文件

Gazebo都是加載world文件,然后world文件中會加載各種模型,所以為了最后可以在world中設(shè)置模型的運動,一種方式就是在world文件中加載模型時導(dǎo)入插件,所以我們需要編寫一個源程序(命名為animated_box.cc),以此來得到插件。先新建一個目錄animal_box,里面存放該源文件。

#include <boost/bind.hpp> #include <gazebo/gazebo.hh> #include <ignition/math.hh> #include <gazebo/physics/physics.hh> #include <gazebo/common/common.hh> #include <stdio.h>namespace gazebo {class AnimatedBox : public ModelPlugin{public: void Load(physics::ModelPtr _parent, sdf::ElementPtr /*_sdf*/){this->model = _parent;//使用PoseAnimation類實例化一個對象,然后通過三個參數(shù)可設(shè)置運動模型名稱,運動持續(xù)時間以及是否循環(huán)執(zhí)行g(shù)azebo::common::PoseAnimationPtr anim(new gazebo::common::PoseAnimation("test", 46.0, false)); //聲明一個控制模型位姿的對象gazebo::common::PoseKeyFrame *key; //設(shè)置模型到達某位姿的時刻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;//通過事件響應(yīng)來更新觸發(fā)程序private: event::ConnectionPtr updateConnection;};//在Gazebo仿真器中注冊該插件GZ_REGISTER_MODEL_PLUGIN(AnimatedBox) }

2. 編寫CMakeLists.txt文檔

為了對上述源文件進行編譯,我們使用cmake編譯,也是在animal_box目錄,新建一個CMakeLists.txt文檔,內(nèi)容如下圖,具體參數(shù)代表什么意思,可以參考該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庫文件,如下圖

??

4. 使用插件?

在得到插件后,我們需要將該插件在一個world文件中使用,仍舊是在animal_box目錄下新建一個animated_box.world文件,然后加入如下代碼。

<?xml version="1.0"?> <sdf version="1.4"><world name="animated_box_world"><!-- Ground Plane --><include><uri>model://ground_plane</uri></include><include><uri>model://sun</uri></include><model name="box"><pose>2.5 0 0 0 0 0</pose><link name="link"><collision name="collision"><geometry><box><size>0.3 0.3 1.5</size></box></geometry></collision><visual name="visual"><geometry><box><size>0.3 0.3 1.5</size></box></geometry></visual></link><plugin name="push_animate" filename="libanimated_box.so"/></model> </world> </sdf>

此時在animal_box目錄打開終端,輸入命令【gazebo --verbose animated_box.world】,此時會報錯找不到libanimated_box.so文件,當(dāng)然了,因為我們的libanimated_box.so文件不在gazebo默認查找的庫目錄中,所以我們要將生成的庫文件放入gazebo默認的庫目錄(/usr/lib/x86_64-linux-gnu/gazebo-7/plugins)中。由于權(quán)限問題,我們使用sudo命令復(fù)制,在animal_box目錄下打開終端,輸入如下指令,此時gazebo默認庫目錄下會出現(xiàn)libanimated_box.so文件。

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

5. 運行效果?

?

附錄?

1. windows動態(tài)鏈接庫后綴名為.dll,靜態(tài)鏈接庫后綴名為.lib;Linux動態(tài)鏈接庫為.so文件,靜態(tài)鏈接庫為.a

靜態(tài)鏈接庫會在程序鏈接階段和其他.o目標文件(匯編階段生成)一起生成可執(zhí)行文件,因此在可執(zhí)行文件運行時,不再需要靜態(tài)庫文件。而動態(tài)鏈接庫文件只在程序運行時才被調(diào)用。因此可得靜態(tài)庫文件和動態(tài)庫文件的特點如下:

a. 因為所有相關(guān)靜態(tài)庫文件被鏈接合成一個可執(zhí)行文件,所以占用空間

b. 靜態(tài)庫文件更新,那么使用該文件的程序得重新編譯生成再發(fā)布給用戶,導(dǎo)致用戶需要整個應(yīng)用重新下載,全量更新。

?

c. 動態(tài)庫文件更新,使用該文件的程序不用重新下載,只需要更換動態(tài)庫文件即可,增量更新。

d. 不同程序調(diào)用相同的庫,可以只有一份動態(tài)鏈接庫文件,資源共享(所以也叫共享庫),而且節(jié)省空間。

總結(jié)

以上是生活随笔為你收集整理的Gazebo添加模型并控制模型运动作为动态障碍物(Ubuntu16.04, Gazebo7.16),附录动态链接库和静态链接库区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。