Ros 2 gazebo plugin
Jufeng Wu, 25 September 2019
ROS2 的Gazebo plugin 跟 ROS1很像,然而有幾個地方還是不一樣
gazebo_ros_control 不能使用:
與其說不能使用,到不如說這會使得gazebo卡住,原因是因為ros1的roscore沒有啟動,所以就卡在這裡
此外,可以用<plugin filename="libgazebo_ros_joint_state_publisher.so" name="joint_state">
在ros2中傳送joint_state
自己寫plugin :
目前看到大部分的作法還是自己寫plugin,gazebo plugin的寫法大概如下:
1.在模型檔案中加入
<plugin filename="libXXX.so" name="AAA">
<ros/>
<axis1>shoulder_1_joint</axis1>
<axis2>shoulder_2_joint</axis2>
....
</plugin>
2.新增一個package ,在Cmakelist.txt加入
find_package(gazebo_dev REQUIRED)
find_package(gazebo_ros REQUIRED)
...
add_library(xxx SHARED
plugin檔案位置
)
...
ament_target_dependencies(XXX
"gazebo_dev"
"gazebo_ros"
"rclcpp"
"rclcpp_action"
"ament_index_cpp"
)
...
ament_export_libraries(XXX)
然後在package.xml中加入
<build_depend>gazebo_dev</build_depend>
<build_depend>gazebo_ros</build_depend>
...
<exec_depend>gazebo_dev</exec_depend>
<exec_depend>gazebo_ros</exec_depend>
3.gazebo plugin的c++寫法有幾個注意地方
a. namespace 為gazebo_plugins
b. 去複寫 XXX::Load
c. 在load的時候,加入this->updateConnection = gazebo::event::Events::ConnectWorldUpdateBegin(std::bind(&XXX::OnUpdate, this));
d. 創立OnUpdate,這是每次畫面更新的時候的動作
e. 記得要加入 GZ_REGISTER_MODEL_PLUGIN(TMGazeboPluginRos)
4.gazebo plugin 有幾個像是bug的東西最好避開
a. printf() 要避開,最好使用std::cout,如果誤用的話,會發現當按下crt+c的時候,要print的東西才會出現,並且後面的程式碼就無法執行了 b. ros的 RCLCPP_INFO 也要避開,最好也使用std::cout,如果誤用的話會跟上述一樣 c. 不同的 cpp 都 include gazebo plugin的部份.h,因為疑似有golbal variable,所以會link error!
大概就是這樣,詳細的話可以看這裡