申明:
1、本人使用的是Ubuntu20.04+ros1+gazebo+xtdrone+px4的仿真組合
2、為了使傳感器模型和飛機模型解耦合,實現不同平臺對傳感器可直接調用,本系列博文涉及的所有傳感器均不直接添加在相應平臺的sdf當中,而是通過編寫xxx_joint.sdf的形式,將平臺和傳感器統一,可由launch文件直接拉起。
本博客會先給出創建步驟和注意事項,若希望能夠直接獲取文件并運行,可跳轉至該博客(上述仿真組合的基礎配置需已完成):Ubuntu20.04仿真 | 云臺相機可直接使用文件-CSDN博客(文件都寫好了,這兩天會整理完,hhhh,稍等,已更新!需要自取)
一、建立云臺模型文件
在自帶的模型庫中是沒有單獨的云臺模型文件的,但是typhoon_h480中掛載了云臺,所以可以從其中把單獨的模型文件抽象出來。
https://blog.csdn.net/weixin_42037083/article/details/138291543
先按照上述鏈接改sdf,完成其中的“一、單獨建立云臺模型文件”,復制過程中檢查link中的url,不要指向typhoon了,而是改為指向iris。
在此基礎上
1、添加云臺控制插件<plugin name='gimbal_controller' filename='libgazebo_gimbal_controller_plugin.so'>對應段落,使得cgo3在yaw、roll、pitch上添加的控制joint可以生效。
2、libgazebo_gimbal_controller_plugin.so插件中的這三個joint修改,把typhoon刪掉
? ? ? <joint_yaw>typhoon_h480::cgo3_vertical_arm_joint</joint_yaw><joint_roll>typhoon_h480::cgo3_horizontal_arm_joint</joint_roll><joint_pitch>typhoon_h480::cgo3_camera_joint</joint_pitch>
? ? ? 改為:
? ? ??<joint_yaw>cgo3_vertical_arm_joint</joint_yaw><joint_roll>cgo3_horizontal_arm_joint</joint_roll><joint_pitch>cgo3_camera_joint</joint_pitch>
原本的typhoon_h480::是cgo3掛載在其下的聲明。
?
3、<joint name='cgo3_mount_joint' type='revolute'>這個joint刪掉,因為這個對應的link是新創建的cgo3.sdf文件的最高級link,所以在cgo3的sdf中不需要對他做joint,而是在掛載cgo3的飛機/平臺的頂層sdf中對cgo3.sdf做引入并添加本joint。其余cgo3.sdf中的link應和joint成對出現。
在原h480文件中這個joint是寫向base_link也就是掛載到typhoon飛機上的。
二、修改iris.sdf
為了正常使用cgo3云臺相機,還需實現其各自由度旋轉對應插件的添加。以下plugin是直接添加在typhoon_h480.sdf中的,作者也嘗試將其直接添加在cgo3.sdf當中與iris.sdf共同使用,這樣避免修改原有飛機配置文件,但是發現在launch拉起后會出現報錯(我認為是拉起的sdf不能在兩個地方都出現下述插件)。
因此,我嘗試將其添加到iris.sdf中,經過測試拉起仿真環境不會報錯。因此復制iris模型文件夾,并將其命名為iris_cgo3以做區分,文件夾結構如下:
圖片是在windows下的截圖,Ubuntu中結構相同。
1、將原iris.sdf命名為iris_cgo3.sdf以作區分,并將typhoon_h480.sdf中插件mavlink_interface_gimbal_only中的以下部分復制到iris.sdf原有的同名插件中
<channel name="gimbal_roll"><input_index>8</input_index><input_offset>0</input_offset><input_scaling>-3.1415</input_scaling><zero_position_disarmed>0</zero_position_disarmed><zero_position_armed>0</zero_position_armed><joint_control_type>position_gztopic</joint_control_type><gztopic>/cgo3/gimbal_roll_cmd</gztopic><joint_name>cgo3_horizontal_arm_joint</joint_name></channel><channel name="gimbal_pitch"><input_index>9</input_index><input_offset>0</input_offset><input_scaling>-3.1415</input_scaling><zero_position_disarmed>0</zero_position_disarmed><zero_position_armed>0</zero_position_armed><joint_control_type>position_gztopic</joint_control_type><gztopic>/cgo3/gimbal_pitch_cmd</gztopic><joint_name>cgo3_camera_joint</joint_name></channel><channel name="gimbal_yaw"><input_index>10</input_index><input_offset>0</input_offset><input_scaling>-3.1415</input_scaling><zero_position_disarmed>0</zero_position_disarmed><zero_position_armed>0</zero_position_armed><joint_control_type>position_gztopic</joint_control_type><gztopic>/cgo3/gimbal_yaw_cmd</gztopic><joint_name>cgo3_vertical_arm_joint</joint_name></channel>
注意,直接復制博客中提供的部分,或者在typhoon_h480.sdf中復制時每個channel的<input_index>要改。因為iris.sdf中原本就有旋翼舵機的通信通道,且和typhoon_h480數量不同,所以直接復制過來使用會造成沖突。
2、修改model.config
<sdf version='1.6'>iris_cgo3.sdf</sdf>
一定要把這邊的文件名改成iris_cgo3.sdf,否則launch拉起時無法正確讀取。
三、聯合傳感器與飛機
1、創建iris_cgo3_joint文件夾,在其中創建iris_cgo3_joint.sdf和model.config
2、在iris_cgo3_joint.sdf中復制以下內容,路徑和文件名根據實際文件名修改。
<?xml version="1.0" ?>
<sdf version="1.5"><model name='iris_cgo3_model'><include><uri>model://iris_cgo3</uri></include><include><uri>model://cgo3</uri><pose>0.12 0 0 1.57 0 1.57</pose></include><joint name="cgo3_mount_joint" type="fixed"><!--對應上述cgo3的最高級link
在joint.sdf中引入--><child>cgo3::cgo3_mount_link</child><parent>iris_cgo3::base_link</parent><!--此處parent,child的寫法要和模型文件中的model名、link名對應好--><axis><xyz>0 0 1</xyz><limit><upper>0</upper><lower>0</lower></limit></axis></joint></model>
</sdf>
model.config則同理注意sdf文件名修改正確即可