ROS Gazebo Ros Control 及 Controller运用.docx
- 文档编号:11932379
- 上传时间:2023-04-16
- 格式:DOCX
- 页数:26
- 大小:250.59KB
ROS Gazebo Ros Control 及 Controller运用.docx
《ROS Gazebo Ros Control 及 Controller运用.docx》由会员分享,可在线阅读,更多相关《ROS Gazebo Ros Control 及 Controller运用.docx(26页珍藏版)》请在冰豆网上搜索。
ROSGazeboRosControl及Controller运用
我们引入了UR5BH机器人,另外,对其描述文件中的transmission进行了解析,其中摘录了如下文件:
--robotNamespace>/
--robotSimType>gazebo_ros_control/DefaultRobotHWSim
......
......
在这段描述中,除了transmission之外,另一个引入的,就是gazebo_ros_control.
主要和大家分享一些关于gazebo_ros_control相关的内容。
2.GazeboROSControl
在前一篇的基础上,实际上我们已经能够开始配置MoveIt!
来进行机器人控制了。
但是,为了更进一步的让事情更加清晰,我们还是耐下心再探讨一下gazebo_ros_control。
包布局如下图所示:
打开package.xml文件,除了一些依赖包的定义外,一个比较关键的地方是在export块中,摘录如下:
......
......
了解pluginlib的同学肯定知道,这是将plugin的定义文件导入的步骤。
导入的文件在文件系统中可以看到,摘录如下:
name="gazebo_ros_control/DefaultRobotHWSim" type="gazebo_ros_control: : DefaultRobotHWSim" base_class_type="gazebo_ros_control: : RobotHWSim"> AdefaultrobotsimulationinterfacewhichconstructsjointhandlesfromanSDF/URDF.
可以看到,该文件中定义了一个plugin,就是gazebo_ros_control:
:
DefaultRobotHWSim,该plugin可以动态的被加载进来。
再查看该包的CMakeLists.txt,可以看到下述内容:
##2.1.Libraries
add_library(${PROJECT_NAME}src/gazebo_ros_control_plugin.cpp)
target_link_libraries(${PROJECT_NAME}${catkin_LIBRARIES}${GAZEBO_LIBRARIES})
add_library(default_robot_hw_simsrc/default_robot_hw_sim.cpp)
target_link_libraries(default_robot_hw_sim${catkin_LIBRARIES}${GAZEBO_LIBRARIES})
该包总共会生成两个库,第一个库是gazebo_ros_control,第二个库是default_robot_hw_sim,分别都只有一个文件。
下面我们分别来分析这两个库的源码以及所对应完成的任务。
3.DefaultRobotHWSIM
在default_robot_hw_sim.cpp中,定义了类DefaultRobotHWSim,该类继承于gazebo_ros_control:
:
RobotHWSim,父类定义摘录如下:
namespacegazebo_ros_control{
//Structforpassingloadedjointdata
structJointData
{
std:
:
stringname_;
std:
:
stringhardware_interface_;
JointData(conststd:
:
string&name,conststd:
:
string&hardware_interface):
name_(name),
hardware_interface_(hardware_interface)
{}
};
classRobotHWSim:
publichardware_interface:
:
RobotHW
{
public:
virtual~RobotHWSim(){}
virtualboolinitSim(
conststd:
:
string&robot_namespace,
ros:
:
NodeHandlemodel_nh,
gazebo:
:
physics:
:
ModelPtrparent_model,
consturdf:
:
Model*consturdf_model,//留意该指针有两个const
//TransmissionInfo的内容在前一篇博客中有介绍
std:
:
vector : TransmissionInfo>transmissions)=0; virtualvoidreadSim(ros: : Timetime,ros: : Durationperiod)=0; virtualvoidwriteSim(ros: : Timetime,ros: : Durationperiod)=0; virtualvoideStopActive(constboolactive){} }; } 该类定义了gazeboplugin版本的RobotHW,RobotHW定义于roscontrol包中,定义了与实际机器人通讯的基本接口,在编写实际机器人的roscontrol体系时,该类是用户必须实现的类。 主要重载read(),write(),preparewitch()以及doSwitch()四个接口。 在RobotHW中,这四个函数都有默认实现(默认实现是空,什么都不做),都不是纯虚函数。 一般而言,重载读写函数即可正常工作了。 这个地方,只是将接口换了个名字,并且,几个纯虚函数都必须在子类中进行实现。 类DefaultRobotHWSim的定义摘录如下: namespacegazebo_ros_control { classDefaultRobotHWSim: publicgazebo_ros_control: : RobotHWSim { public: //四个纯需函数必须在子类中进行实现。 virtualboolinitSim( conststd: : string&robot_namespace, ros: : NodeHandlemodel_nh, gazebo: : physics: : ModelPtrparent_model, consturdf: : Model*consturdf_model, std: : vector : TransmissionInfo>transmissions); virtualvoidreadSim(ros: : Timetime,ros: : Durationperiod); virtualvoidwriteSim(ros: : Timetime,ros: : Durationperiod); virtualvoideStopActive(constboolactive); protected: //Methodsusedtocontrolajoint.一个关节! ! ! enumControlMethod{EFFORT,POSITION,POSITION_PID,VELOCITY,VELOCITY_PID}; //关节限制相关的内容,不是我们关注的重点,感兴趣的朋友可以参考下述网站: //http: //wiki.ros.org/pr2_controller_manager/safety_limits voidregisterJointLimits(conststd: : string&joint_name, consthardware_interface: : JointHandle&joint_handle, constControlMethodctrl_method, constros: : NodeHandle&joint_limit_nh, consturdf: : Model*consturdf_model, int*constjoint_type,double*constlower_limit, double*constupper_limit,double*consteffort_limit); unsignedintn_dof_; //关节接口,这四个类的设计很有意思。 hardware_interface: : JointStateInterfacejs_interface_; hardware_interface: : EffortJointInterfaceej_interface_; hardware_interface: : PositionJointInterfacepj_interface_; hardware_interface: : VelocityJointInterfacevj_interface_; //关节限制相关的内容 joint_limits_interface: : EffortJointSaturationInterfaceej_sat_interface_; joint_limits_interface: : EffortJointSoftLimitsInterfaceej_limits_interface_; joint_limits_interface: : PositionJointSaturationInterfacepj_sat_interface_; joint_limits_interface: : PositionJointSoftLimitsInterfacepj_limits_interface_; joint_limits_interface: : VelocityJointSaturationInterfacevj_sat_interface_; joint_limits_interface: : VelocityJointSoftLimitsInterfacevj_limits_interface_; std: : vector std: : vector std: : vector std: : vector : string>joint_names_; std: : vector std: : vector std: : vector : Pid>pid_controllers_; std: : vector std: : vector std: : vector std: : vector std: : vector std: : vector std: : vector std: : vector : physics: : JointPtr>sim_joints_; //紧急停止时,e_stop_active=true boole_stop_active_,last_e_stop_active_; }; typedefboost: : shared_ptr } #endif//#ifndef__GAZEBO_ROS_CONTROL_PLUGIN_DEFAULT_ROBOT_HW_SIM_H_ 由于关于SaftyLimits并不是我们关注的内容。 所以在后面的解析过程中,我们也会忽略该部分内容,感兴趣的同学,可以参考上述网站,内容也不是很多。 下面我们主要关注initSim()的实现,其他几个函数无非是调用Gazebo的API完成关节数据的读写。 iniSim()函数的实现摘录如下: boolDefaultRobotHWSim: : initSim( conststd: : string&robot_namespace, ros: : NodeHandlemodel_nh, gazebo: : physics: : ModelPtrparent_model, consturdf: : Model*consturdf_model, std: : vector : TransmissionInfo>transmissions){ constros: : NodeHandlejoint_limit_nh(model_nh); //ResizevectorstoourDOF n_dof_=transmissions.size();//也就是说,该变量保存关节个数 joint_names_.resize(n_dof_); joint_types_.resize(n_dof_); joint_lower_limits_.resize(n_dof_); joint_upper_limits_.resize(n_dof_); joint_effort_limits_.resize(n_dof_); joint_control_methods_.resize(n_dof_); pid_controllers_.resize(n_dof_); joint_position_.resize(n_dof_); joint_velocity_.resize(n_dof_); joint_effort_.resize(n_dof_); joint_effort_command_.resize(n_dof_); joint_position_command_.resize(n_dof_); joint_velocity_command_.resize(n_dof_); //初始化所有变量 for(unsignedintj=0;j if(transmissions[j].joints_.size()==0){ ROS_WARN_STREAM_NAMED("default_robot_hw_sim","Transmission"< <<"hasnoassociatedjoints."); continue; }elseif(transmissions[j].joints_.size()>1){ ROS_WARN_STREAM_NAMED("default_robot_hw_sim","Transmission"< <<"hasmorethanonejoint.Currentlythedefaultrobothardwaresimulation" <<"interfaceonlysupportsone."); continue; }//判定transmission内容是否有错,DefaultRobotHWSim仅支持一个tramsmission对应一个joint std: : vector : string>joint_interfaces=transmissions[j].joints_[0].hardware_interfaces_; if(joint_interfaces.empty()&&! (transmissions[j].actuators_.empty()) &&! (transmissions[j].actuators_[0].hardware_interfaces_.empty())){ //TODO: DeprecateHWinterfacespecificationinactuatorsinROSJ joint_interfaces=transmissions[j].actuators_[0].hardware_interfaces_; ROS_WARN_STREAM_NAMED("default_robot_hw_sim","The transmissions[j].name_<<"shouldbenestedinsidethe "Thetransmissionwillbeproperlyloaded,butpleaseupdate"<< "yourrobotmodeltoremaincompatiblewithfutureversionsoftheplugin."); } if(joint_interfaces.empty()){ ROS_WARN_STREAM_NAMED("default_robot_hw_sim","Joint"< "oftransmission"< "Notaddingittotherobothardwaresimulation."); continue; }elseif(joint_interfaces.size()>1){ ROS_WARN_STREAM_NAMED("default_robot_hw_sim","Joint"< "oftransmission"< "Currentlythedefaultrobothardwaresimulationinterfaceonlysupportsone.Usingthefirstentry! "); //continue; }//至少包含一个transmission,多个的话,将会默认使用第一个,但并不算错误(没有continue)。 //初始化各变量(name,pos,vel,eff,以及cmd joint_names_[j]=transmissions[j].joints_[0].name_; joint_position_[j]=1.0; joint_velocity_[j]=0.0; joint_effort_[j]=1.0;//N/mforcontinuousjoints joint_effort_command_[j]=0.0; joint_position_command_[j]=0.0; joint_velocity_command_[j]=0.0; //常引用 conststd: : string&hardware_interface=joint_interfaces.front(); //Debug ROS_DEBUG_STREAM_NAMED("default_robot_hw_sim","Loadingjoint'"
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ROS Gazebo Control Controller运用 Controller 运用