compile turtlebot3_gazebo error

2023-11-21 02:08

本文主要是介绍compile turtlebot3_gazebo error,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

自己无意中重新安装了其他版本的protobuf,出现以下错误:

/usr/local/include/google/protobuf/arenastring.h:225:31: note:   candidate expects 0 arguments, 1 provided
In file included from /usr/include/gazebo-9/gazebo/msgs/MessageTypes.hh:132,from /usr/include/gazebo-9/gazebo/msgs/msgs.hh:35,from /usr/include/gazebo-9/gazebo/physics/Entity.hh:28,from /usr/include/gazebo-9/gazebo/physics/Model.hh:30,from /usr/include/gazebo-9/gazebo/physics/Actor.hh:26,from /usr/include/gazebo-9/gazebo/physics/physics.hh:2,from /home/bartosz/catkin_ws/src/gazebo_ros_pkgs/gazebo_plugins/include/gazebo_plugins/gazebo_ros_utils.h:40,from /home/bartosz/catkin_ws/src/gazebo_ros_pkgs/gazebo_plugins/src/gazebo_ros_utils.cpp:35:
/usr/include/gazebo-9/gazebo/msgs/world_modify.pb.h: In member function ‘const string& gazebo::msgs::WorldModify::cloned_uri() const’:
/usr/include/gazebo-9/gazebo/msgs/world_modify.pb.h:339:93: error: no matching function for call to ‘google::protobuf::internal::ArenaStringPtr::GetNoArena(const string*) const’return cloned_uri_.GetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());

解决办法就是重新安装protobuf,先删除,再重新安装。

删除:

sudo rm -rf /usr/local/bin/protoc /usr/local/include/google /usr/local/lib/libproto*

安装:

git clone https://github.com/google/protobuf.git && cd protobuf && ./configure && make && make check && sudo make install

补充:
后来又出现类似的错误,由于太长就贴在文章最后吧。以上方法行不通了,又尝试了一会才行。

解决办法是先删除现有的版本,再重新安装系统默认版本的protobuf,还有gazebo和msg:

sudo rm -rf /usr/local/bin/protoc /usr/local/include/google /usr/local/lib/libproto*
sudo apt reinstall libprotobuf-dev libignition-msgs* ros-foxy-gazebo-dev

错误如下:


In file included from /usr/include/ignition/msgs5/ignition/msgs/MessageTypes.hh:196,from /usr/include/ignition/msgs5/ignition/msgs/Utility.hh:33,from /usr/include/ignition/msgs5/ignition/msgs.hh:27,from /usr/include/ignition/transport8/ignition/transport/Node.hh:33,from /usr/include/gazebo-11/gazebo/physics/Entity.hh:25,from /usr/include/gazebo-11/gazebo/physics/Model.hh:30,from /usr/include/gazebo-11/gazebo/physics/Actor.hh:27,from /usr/include/gazebo-11/gazebo/physics/physics.hh:2,from /home/shanph/Documents/local/ros2_ws/src/turtlebot3/turtlebot3_simulations/turtlebot3_gazebo/models/turtlebot3_dqn_world/obstacle_plugin/obstacles.cc:22:
/usr/include/ignition/msgs5/ignition/msgs/wireless_nodes.pb.h: At global scope:
/usr/include/ignition/msgs5/ignition/msgs/wireless_nodes.pb.h:53:46: error: ‘AuxillaryParseTableField’ in namespace ‘google::protobuf::internal’ does not name a type; did you mean ‘AuxiliaryParseTableField’?53 |   static const ::google::protobuf::internal::AuxillaryParseTableField aux[];|                                              ^~~~~~~~~~~~~~~~~~~~~~~~|                                              AuxiliaryParseTableField
In file included from /usr/include/ignition/msgs5/ignition/msgs/MessageTypes.hh:196,from /usr/include/ignition/msgs5/ignition/msgs/Utility.hh:33,from /usr/include/ignition/msgs5/ignition/msgs.hh:27,from /usr/include/ignition/transport8/ignition/transport/Node.hh:33,from /usr/include/gazebo-11/gazebo/physics/Entity.hh:25,from /usr/include/gazebo-11/gazebo/physics/Model.hh:30,from /usr/include/gazebo-11/gazebo/physics/Actor.hh:27,from /usr/include/gazebo-11/gazebo/physics/physics.hh:2,from /home/shanph/Documents/local/ros2_ws/src/turtlebot3/turtlebot3_simulations/turtlebot3_gazebo/models/turtlebot3_dqn_world/obstacle_plugin/obstacles.cc:22:
/usr/include/ignition/msgs5/ignition/msgs/wireless_nodes.pb.h:192:33: error: ‘InternalMetadataWithArena’ in namespace ‘google::protobuf::internal’ does not name a type; did you mean ‘InternalMetadata’?192 |   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;|                                 ^~~~~~~~~~~~~~~~~~~~~~~~~|                                 InternalMetadata
/usr/include/ignition/msgs5/ignition/msgs/wireless_nodes.pb.h:137:8: error: ‘bool ignition::msgs::WirelessNodes::MergePartialFromCodedStream(google::protobuf::io::CodedInputStream*)’ marked ‘final’, but is not virtual137 |   bool MergePartialFromCodedStream(|        ^~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/ignition/msgs5/ignition/msgs/wireless_nodes.pb.h:139:8: error: ‘void ignition::msgs::WirelessNodes::SerializeWithCachedSizes(google::protobuf::io::CodedOutputStream*) const’ marked ‘final’, but is not virtual139 |   void SerializeWithCachedSizes(|        ^~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/ignition/msgs5/ignition/msgs/wireless_nodes.pb.h:141:30: error: ‘google::protobuf::uint8* ignition::msgs::WirelessNodes::InternalSerializeWithCachedSizesToArray(bool, google::protobuf::uint8*) const’ marked ‘final’, but is not virtual141 |   ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(|                              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from /usr/include/ignition/msgs5/ignition/msgs/MessageTypes.hh:198,from /usr/include/ignition/msgs5/ignition/msgs/Utility.hh:33,from /usr/include/ignition/msgs5/ignition/msgs.hh:27,from /usr/include/ignition/transport8/ignition/transport/Node.hh:33,from /usr/include/gazebo-11/gazebo/physics/Entity.hh:25,from /usr/include/gazebo-11/gazebo/physics/Model.hh:30,from /usr/include/gazebo-11/gazebo/physics/Actor.hh:27,from /usr/include/gazebo-11/gazebo/physics/physics.hh:2,from /home/shanph/Documents/local/ros2_ws/src/turtlebot3/turtlebot3_simulations/turtlebot3_gazebo/models/turtlebot3_dqn_world/obstacle_plugin/obstacles.cc:22:
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h:52:46: error: ‘AuxillaryParseTableField’ in namespace ‘google::protobuf::internal’ does not name a type; did you mean ‘AuxiliaryParseTableField’?52 |   static const ::google::protobuf::internal::AuxillaryParseTableField aux[];|                                              ^~~~~~~~~~~~~~~~~~~~~~~~|                                              AuxiliaryParseTableField
In file included from /usr/include/ignition/msgs5/ignition/msgs/MessageTypes.hh:198,from /usr/include/ignition/msgs5/ignition/msgs/Utility.hh:33,from /usr/include/ignition/msgs5/ignition/msgs.hh:27,from /usr/include/ignition/transport8/ignition/transport/Node.hh:33,from /usr/include/gazebo-11/gazebo/physics/Entity.hh:25,from /usr/include/gazebo-11/gazebo/physics/Model.hh:30,from /usr/include/gazebo-11/gazebo/physics/Actor.hh:27,from /usr/include/gazebo-11/gazebo/physics/physics.hh:2,from /home/shanph/Documents/local/ros2_ws/src/turtlebot3/turtlebot3_simulations/turtlebot3_gazebo/models/turtlebot3_dqn_world/obstacle_plugin/obstacles.cc:22:
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h:225:33: error: ‘InternalMetadataWithArena’ in namespace ‘google::protobuf::internal’ does not name a type; did you mean ‘InternalMetadata’?225 |   ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;|                                 ^~~~~~~~~~~~~~~~~~~~~~~~~|                                 InternalMetadata
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h:136:8: error: ‘bool ignition::msgs::WorldModify::MergePartialFromCodedStream(google::protobuf::io::CodedInputStream*)’ marked ‘final’, but is not virtual136 |   bool MergePartialFromCodedStream(|        ^~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h:138:8: error: ‘void ignition::msgs::WorldModify::SerializeWithCachedSizes(google::protobuf::io::CodedOutputStream*) const’ marked ‘final’, but is not virtual138 |   void SerializeWithCachedSizes(|        ^~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h:140:30: error: ‘google::protobuf::uint8* ignition::msgs::WorldModify::InternalSerializeWithCachedSizesToArray(bool, google::protobuf::uint8*) const’ marked ‘final’, but is not virtual140 |   ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(|                              ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h: In member function ‘void ignition::msgs::WorldModify::clear_world_name()’:
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h:296:15: error: ‘struct google::protobuf::internal::ArenaStringPtr’ has no member named ‘ClearToEmptyNoArena’; did you mean ‘ClearToEmpty’?296 |   world_name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());|               ^~~~~~~~~~~~~~~~~~~|               ClearToEmpty
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h: In member function ‘const string& ignition::msgs::WorldModify::world_name() const’:
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h:300:22: error: ‘const struct google::protobuf::internal::ArenaStringPtr’ has no member named ‘GetNoArena’; did you mean ‘DestroyNoArena’?300 |   return world_name_.GetNoArena();|                      ^~~~~~~~~~|                      DestroyNoArena
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h: In member function ‘void ignition::msgs::WorldModify::set_world_name(const string&)’:
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h:304:15: error: ‘struct google::protobuf::internal::ArenaStringPtr’ has no member named ‘SetNoArena’; did you mean ‘DestroyNoArena’?304 |   world_name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);|               ^~~~~~~~~~|               DestroyNoArena
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h: In member function ‘void ignition::msgs::WorldModify::set_world_name(std::string&&)’:
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h:310:15: error: ‘struct google::protobuf::internal::ArenaStringPtr’ has no member named ‘SetNoArena’; did you mean ‘DestroyNoArena’?310 |   world_name_.SetNoArena(|               ^~~~~~~~~~|               DestroyNoArena
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h: In member function ‘void ignition::msgs::WorldModify::set_world_name(const char*)’:
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h:318:15: error: ‘struct google::protobuf::internal::ArenaStringPtr’ has no member named ‘SetNoArena’; did you mean ‘DestroyNoArena’?318 |   world_name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));|               ^~~~~~~~~~|               DestroyNoArena
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h: In member function ‘void ignition::msgs::WorldModify::set_world_name(const char*, size_t)’:
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h:323:15: error: ‘struct google::protobuf::internal::ArenaStringPtr’ has no member named ‘SetNoArena’; did you mean ‘DestroyNoArena’?323 |   world_name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),|               ^~~~~~~~~~|               DestroyNoArena
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h: In member function ‘std::string* ignition::msgs::WorldModify::mutable_world_name()’:
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h:330:22: error: ‘struct google::protobuf::internal::ArenaStringPtr’ has no member named ‘MutableNoArena’330 |   return world_name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());|                      ^~~~~~~~~~~~~~
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h: In member function ‘std::string* ignition::msgs::WorldModify::release_world_name()’:
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h:335:22: error: ‘struct google::protobuf::internal::ArenaStringPtr’ has no member named ‘ReleaseNoArena’; did you mean ‘ReleaseNonDefault’?335 |   return world_name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());|                      ^~~~~~~~~~~~~~|                      ReleaseNonDefault
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h: In member function ‘void ignition::msgs::WorldModify::set_allocated_world_name(std::string*)’:
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h:343:15: error: ‘struct google::protobuf::internal::ArenaStringPtr’ has no member named ‘SetAllocatedNoArena’; did you mean ‘SetAllocated’?343 |   world_name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), world_name);|               ^~~~~~~~~~~~~~~~~~~|               SetAllocated
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h: In member function ‘void ignition::msgs::WorldModify::clear_cloned_uri()’:
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h:391:15: error: ‘struct google::protobuf::internal::ArenaStringPtr’ has no member named ‘ClearToEmptyNoArena’; did you mean ‘ClearToEmpty’?391 |   cloned_uri_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());|               ^~~~~~~~~~~~~~~~~~~|               ClearToEmpty
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h: In member function ‘const string& ignition::msgs::WorldModify::cloned_uri() const’:
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h:395:22: error: ‘const struct google::protobuf::internal::ArenaStringPtr’ has no member named ‘GetNoArena’; did you mean ‘DestroyNoArena’?395 |   return cloned_uri_.GetNoArena();|                      ^~~~~~~~~~|                      DestroyNoArena
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h: In member function ‘void ignition::msgs::WorldModify::set_cloned_uri(const string&)’:
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h:399:15: error: ‘struct google::protobuf::internal::ArenaStringPtr’ has no member named ‘SetNoArena’; did you mean ‘DestroyNoArena’?399 |   cloned_uri_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);|               ^~~~~~~~~~|               DestroyNoArena
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h: In member function ‘void ignition::msgs::WorldModify::set_cloned_uri(std::string&&)’:
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h:405:15: error: ‘struct google::protobuf::internal::ArenaStringPtr’ has no member named ‘SetNoArena’; did you mean ‘DestroyNoArena’?405 |   cloned_uri_.SetNoArena(|               ^~~~~~~~~~|               DestroyNoArena
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h: In member function ‘void ignition::msgs::WorldModify::set_cloned_uri(const char*)’:
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h:413:15: error: ‘struct google::protobuf::internal::ArenaStringPtr’ has no member named ‘SetNoArena’; did you mean ‘DestroyNoArena’?413 |   cloned_uri_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));|               ^~~~~~~~~~|               DestroyNoArena
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h: In member function ‘void ignition::msgs::WorldModify::set_cloned_uri(const char*, size_t)’:
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h:418:15: error: ‘struct google::protobuf::internal::ArenaStringPtr’ has no member named ‘SetNoArena’; did you mean ‘DestroyNoArena’?418 |   cloned_uri_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),|               ^~~~~~~~~~|               DestroyNoArena
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h: In member function ‘std::string* ignition::msgs::WorldModify::mutable_cloned_uri()’:
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h:425:22: error: ‘struct google::protobuf::internal::ArenaStringPtr’ has no member named ‘MutableNoArena’425 |   return cloned_uri_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());|                      ^~~~~~~~~~~~~~
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h: In member function ‘std::string* ignition::msgs::WorldModify::release_cloned_uri()’:
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h:430:22: error: ‘struct google::protobuf::internal::ArenaStringPtr’ has no member named ‘ReleaseNoArena’; did you mean ‘ReleaseNonDefault’?430 |   return cloned_uri_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());|                      ^~~~~~~~~~~~~~|                      ReleaseNonDefault
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h: In member function ‘void ignition::msgs::WorldModify::set_allocated_cloned_uri(std::string*)’:
/usr/include/ignition/msgs5/ignition/msgs/world_modify.pb.h:438:15: error: ‘struct google::protobuf::internal::ArenaStringPtr’ has no member named ‘SetAllocatedNoArena’; did you mean ‘SetAllocated’?438 |   cloned_uri_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), cloned_uri);|               ^~~~~~~~~~~~~~~~~~~|               SetAllocated
make[2]: *** [CMakeFiles/obstacle1.dir/build.make:63: CMakeFiles/obstacle1.dir/models/turtlebot3_dqn_world/obstacle_plugin/obstacle1.cc.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:165: CMakeFiles/obstacle1.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....
make[2]: *** [CMakeFiles/obstacles.dir/build.make:63: CMakeFiles/obstacles.dir/models/turtlebot3_dqn_world/obstacle_plugin/obstacles.cc.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:84: CMakeFiles/obstacles.dir/all] Error 2
make[2]: *** [CMakeFiles/obstacle2.dir/build.make:63: CMakeFiles/obstacle2.dir/models/turtlebot3_dqn_world/obstacle_plugin/obstacle2.cc.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:111: CMakeFiles/obstacle2.dir/all] Error 2
make: *** [Makefile:141: all] Error 2

这篇关于compile turtlebot3_gazebo error的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/399057

相关文章

编译linux内核出现 arm-eabi-gcc: error: : No such file or directory

external/e2fsprogs/lib/ext2fs/tdb.c:673:29: warning: comparison between : In function 'max2165_set_params': -。。。。。。。。。。。。。。。。。。 。。。。。。。。。。。。。 。。。。。。。。 host asm: libdvm <= dalvik/vm/mterp/out/Inte

收藏:解决 pip install 出现 error: subprocess-exited-with-error 错误的方法

在使用 pip 安装 Python 包时,有时候会遇到 error: subprocess-exited-with-error 错误。这种错误通常是由于 setuptools 版本问题引起的。本文将介绍如何解决这一问题 当你使用 pip install 安装某个 Python 包时,如果 setuptools 版本过高或过低,可能会导致安装过程出错,并出现类似以下错误信息:error: subpr

Nn criterions don’t compute the gradient w.r.t. targets error「pytorch」 (debug笔记)

Nn criterions don’t compute the gradient w.r.t. targets error「pytorch」 ##一、 缘由及解决方法 把这个pytorch-ddpg|github搬到jupyter notebook上运行时,出现错误Nn criterions don’t compute the gradient w.r.t. targets error。注:我用

gazebo 已加载模型但无法显示

目录 写在前面的话问题一:robot_state_publisher 发布机器人信息失败报错一 Error: Error document empty.报错二 .xcaro 文件中有多行注释成功启动 问题二:通过 ros2 启动 gazebo 失败成功启动 问题三:gazebo 崩溃和无法显示模型问题四: 缺少 robot_description 等话题正确的输出 写在前面的话

src/pyaudio/device_api.c:9:10: fatal error: portaudio.h: 没有那个文件或目录

(venv) shgbitai@shgbitai-C9X299-PGF:~/pythonworkspace/ai-accompany$ pip install pyaudio sounddeviceCollecting pyaudioDownloading PyAudio-0.2.14.tar.gz (47 kB)━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

ERROR 2003 (HY000): Can't connect to MySQL server on (10061)

在linux系统上装了一个mysql-5.5,启动后本机都是可以访问的,操作都正常,同时建了一个%的用户(支持远程访问), root@debian:/# mysql -u loongson -pEnter password: Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id

pip install pyaudio sounddevice error: externally-managed-environment

shgbitai@shgbitai-C9X299-PGF:~/pythonworkspace/ai-accompany$ pip install pyaudio sounddeviceerror: externally-managed-environment× This environment is externally managed╰─> To install Python package

C++常见异常汇总(三): fatal error: google/protobuf/port_def.inc

文章目录 1、fatal error : sw/redis++/redis.h2、fatal error: dwarf.h: No such file or directory3、fatal error: elfutils/libdw.h: No such file or directory4、fatal error: libunwind.h: No such file or directo

error while loading shared libraries: libnuma.so.1: cannot open shared object file:

腾讯云CentOS,安装Mysql时: 1.yum remove libnuma.so.1 2.yum install numactl.x86_64

【NodeJS】Error: Cannot find module 'ms'

转载自:http://blog.csdn.net/echo_ae/article/details/75097004 问题: Error: Cannot find module 'ms'at Function.Module._resolveFilename (module.js:469:15)at Function.Module._load (module.js:417:25)at Module