传统模型在RVIZ内添加模型
传统模式下在rviz里添加模型,需要在Scene Objects下手动的选择,这样做也可以达成想要的目的。比如导入立方体,圆柱体,圆锥,也可以导入自己设计的模型,以dae文件的方式。如下图所示。
代码形式在RVIZ内添加模型
参考moveit官网给的代码,在moveit_tutorials文件夹—doc文件夹–pick_place文件夹里,官方给了一个例子如何在rviz内添加模型,但模型的种类仅限于正方体,圆柱体,圆锥之类,无法利用该例子直接添加自定义的dae文件到rviz内。于是,在整合了各方资源后打算记录一下这个过程。
废话不多说,直接进入主题
强调下,程序依照moveit官方的pick_place_tutorial.cpp进行改动。
1.添加头文件
#include <moveit_msgs/DisplayRobotState.h> #include <moveit_msgs/DisplayTrajectory.h> #include <moveit_msgs/AttachedCollisionObject.h> #include <moveit_msgs/CollisionObject.h> #include <moveit_msgs/PlanningScene.h> #include <geometric_shapes/shapes.h> #include <geometric_shapes/shape_messages.h> #include <geometric_shapes/shape_operations.h> #include <geometric_shapes/mesh_operations.h>
别问我 添加这些头文件干嘛的,问我也不知道。
2. 选择添加想要的dae或者STL文件
比如 我选择了Link_1.STL这个文件,我就想在rviz里添加我自定义的一个桌子。
为什么要把这个文件放在这个位置,因为下面程序需要找到这个STL文件的路径,才能将文件导入rviz里。
那路径如何确定呢
打开这个文件下,原来机械臂的urdf文件,它已经帮你配置好了,你只需要cv一下就好了。
如下图所示,就是urdf下Link_1.STL
的位置。
3. 编写程序
void addShelf(){ moveit_msgs::CollisionObject collision_object; ros::NodeHandle nh; collision_object.header.frame_id = "Link_0"; ros::Publisher planning_scene_diff_publisher; planning_scene_diff_publisher = nh.advertise<moveit_msgs::PlanningScene>("planning_scene", 1); while(planning_scene_diff_publisher.getNumSubscribers() < 1) { ros::WallDuration sleep_t(0.5); sleep_t.sleep(); } /* The id of the object is used to identify it. */ collision_object.id = "shelf"; // /home/tza/jaka_ws/src/jaka_robot_v2.2/src/jaka_description/meshes/jaka_zu5_meshes/Link_1.STL shapes::Mesh* m = shapes::createMeshFromResource("package://jaka_description/meshes/jaka_zu5_meshes/Link_1.STL"); shape_msgs::Mesh shelf_mesh; shapes::ShapeMsg shelf_mesh_msg; shapes::constructMsgFromShape(m,shelf_mesh_msg); shelf_mesh = boost::get<shape_msgs::Mesh>(shelf_mesh_msg); /* A pose for the box (specified relative to frame_id) */ geometry_msgs::Pose shelf_pose; shelf_pose.orientation.w = 0.5; // shelf_pose.orientation.x = 0; // shelf_pose.orientation.y = 0; // shelf_pose.orientation.z = 0; shelf_pose.position.x = 1.0; shelf_pose.position.y = 0.0; shelf_pose.position.z = 0; collision_object.meshes.push_back(shelf_mesh); collision_object.mesh_poses.push_back(shelf_pose); collision_object.operation = collision_object.ADD; ROS_INFO("Add an shelf into the world"); moveit_msgs::PlanningScene planning_scene; planning_scene.world.collision_objects.push_back(collision_object); planning_scene.is_diff = true; planning_scene_diff_publisher.publish(planning_scene); }
在main()函数里执行这个api函数。!!!
4.结果演示
rviz里显示了我们的机械臂的关节1。