ROS學習【15】-----利用Gazebo+Rviz搭建基於MoveIt系統架構的機械臂控制仿真目錄
學習嵌入式系統開發已經具備一段時間了,前面我們利用SLAM系統架構完成了基於gazevo+rviz軟件的機器人自主導航仿真,在這一階段後,我們我們需要了解的就是MoveIt下的機械臂控制仿真;在當今的生活中,機械臂可謂是無處不在,至少在人工智能沒有普及的情況下,機械臂可以代替人類做很多的事情,可能以後會被人工智能慢慢替代,但至少現在機械臂還有生存的空間!
本次博客,林君學長將帶大家瞭解,如何利用Gazebo+Rviz來搭建基於MoveIt系統架構的機械臂控制仿真及可視化!
- ubuntu環境搭建:通過windows上VM虛擬機進行搭建
- ubuntu系統版本:ubuntuKylin16.04
- ROS版本:kinetic
一、MoveIt系統架構的定義
1、什麼是MoveIt系統架構
1)、Moveit是目前針對機械臂移動操作的最先進的軟件。它綜合了運動規劃、控制、3D感知、運控學、控制和導航的最新成果,提供了開發先進機器人應用的易用平臺,爲工業、商業和研發等領域的機器人新產品的設計和集成體用評估。
目前,Moveit!廣泛應用了開源的軟件,目前已經應用在了超過65個機器人平臺上。
2、MoveIt系統架構的結構組成
1)、MoveIt系統架構的前世
2)、MoveIt的今生
3)、MoveIt的結構組成如下
3、它的用戶接口
- C++: move_group_interface package
- Python: moveit_commander package
- GUI: Motion Planning plugin to Rviz
4、MoveIt的插件機制
通過以上的基本定義,希望對小夥伴們瞭解MoveIt有一個基本的映像及瞭解,接下來,我們將通過gazebo+rviz的仿真,來進行機械臂的仿真及可視化!
二、機械臂模型的創建
對於機械臂模型創建的工具包,林君學長已經上傳到CSDN的我的資源模塊,大家可以去我的資源模塊下載項目工程包,然後通過軟件導入到ROS工作空間下的Src中進行編譯,鏈接如下所示:
https://download.csdn.net/download/qq_42451251/12313845
上面的工程包比較齊全,除了本次環境搭建所需要的功能包,還有以後學習需要的,因此,推薦使用以上鍊接的方式進行下載!
當然,大家也可以根據林君學長的步驟自行創建我們所需要的機械臂仿真工程包!
注意:如何下載了林君學長上次的工程包,就不要在進行如下步驟進行創建了,沒有下載工程包導入的,就根據林君學長一下的步驟進行創建哦!
1、機械臂Rviz仿真工程包(marm_description)及相應文件的創建
1)、在ROS工作空間創建工程包marm_description
cd ~/ros/src
catkin_create_pkg marm_description std_msgs rospy roscpp
2)、在marm_description工程包目錄下創建launch文件夾並創建launch文件
cd ~/ros/src/marm_description
mkdir launch
cd launch
touch view_arm.launch
gedit view_arm.launch
寫入如下launch文件的配置代碼:
<launch>
<arg name="model" />
<!-- 加載機器人模型參數 -->
<param name="robot_description" command="$(find xacro)/xacro --inorder $(find marm_description)/urdf/arm.xacro" />
<!-- 設置GUI參數,顯示關節控制插件 -->
<param name="use_gui" value="true"/>
<!-- 運行joint_state_publisher節點,發佈機器人的關節狀態 -->
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
<!-- 運行robot_state_publisher節點,發佈tf -->
<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
<!-- 運行rviz可視化界面 -->
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find marm_description)/urdf.rviz" required="true" />
</launch>
3)、在marm_description工程包目錄下創建urdf文件夾並創建xacro文件
cd ~/ros/src/marm_description
mkdir urdf
cd urdf
touch arm.xacro
gedit arm.xacro
寫入如下urdf文件的配置代碼:
<?xml version="1.0"?>
<robot name="arm" xmlns:xacro="http://ros.org/wiki/xacro">
<!-- Defining the colors used in this robot -->
<material name="Black">
<color rgba="0 0 0 1"/>
</material>
<material name="White">
<color rgba="1 1 1 1"/>
</material>
<material name="Blue">
<color rgba="0 0 1 1"/>
</material>
<material name="Red">
<color rgba="1 0 0 1"/>
</material>
<!-- Constants -->
<xacro:property name="M_PI" value="3.14159"/>
<!-- link1 properties -->
<xacro:property name="link1_width" value="0.03" />
<xacro:property name="link1_len" value="0.10" />
<!-- link2 properties -->
<xacro:property name="link2_width" value="0.03" />
<xacro:property name="link2_len" value="0.14" />
<!-- link3 properties -->
<xacro:property name="link3_width" value="0.03" />
<xacro:property name="link3_len" value="0.22" />
<!-- link4 properties -->
<xacro:property name="link4_width" value="0.025" />
<xacro:property name="link4_len" value="0.06" />
<!-- link5 properties -->
<xacro:property name="link5_width" value="0.03" />
<xacro:property name="link5_len" value="0.06" />
<!-- link6 properties -->
<xacro:property name="link6_width" value="0.04" />
<xacro:property name="link6_len" value="0.02" />
<!-- Left gripper -->
<xacro:property name="left_gripper_len" value="0.08" />
<xacro:property name="left_gripper_width" value="0.01" />
<xacro:property name="left_gripper_height" value="0.01" />
<!-- Right gripper -->
<xacro:property name="right_gripper_len" value="0.08" />
<xacro:property name="right_gripper_width" value="0.01" />
<xacro:property name="right_gripper_height" value="0.01" />
<!-- Gripper frame -->
<xacro:property name="grasp_frame_radius" value="0.001" />
<!-- Inertial matrix -->
<xacro:macro name="inertial_matrix" params="mass">
<inertial>
<mass value="${mass}" />
<inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="0.5" iyz="0.0" izz="1.0" />
</inertial>
</xacro:macro>
<!-- /////////////////////////////////////// bottom_joint ////////////////////////////////////////// -->
<joint name="bottom_joint" type="fixed">
<origin xyz="0 0 0" rpy="0 0 0" />
<parent link="base_link"/>
<child link="bottom_link"/>
</joint>
<link name="bottom_link">
<visual>
<origin xyz=" 0 0 -0.02" rpy="0 0 0"/>
<geometry>
<box size="1 1 0.02" />
</geometry>
<material name="Brown" />
</visual>
<collision>
<origin xyz=" 0 0 -0.02" rpy="0 0 0"/>
<geometry>
<box size="1 1 0.02" />
</geometry>
</collision>
<xacro:inertial_matrix mass="500"/>
</link>
<!-- ///////////////////////////////////// BASE LINK ////////////////////////////////////////////// -->
<link name="base_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<box size="0.1 0.1 0.04" />
</geometry>
<material name="White" />
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<box size="0.1 0.1 0.04" />
</geometry>
</collision>
</link>
<joint name="joint1" type="revolute">
<parent link="base_link"/>
<child link="link1"/>
<origin xyz="0 0 0.02" rpy="0 ${M_PI/2} 0" />
<axis xyz="-1 0 0" />
<limit effort="300" velocity="1" lower="-2.96" upper="2.96"/>
<dynamics damping="50" friction="1"/>
</joint>
<!-- ///////////////////////////////////// LINK1 ////////////////////////////////////////////// -->
<link name="link1" >
<visual>
<origin xyz="-${link1_len/2} 0 0" rpy="0 ${M_PI/2} 0" />
<geometry>
<cylinder radius="${link1_width}" length="${link1_len}"/>
</geometry>
<material name="Blue" />
</visual>
<collision>
<origin xyz="-${link1_len/2} 0 0" rpy="0 ${M_PI/2} 0" />
<geometry>
<cylinder radius="${link1_width}" length="${link1_len}"/>
</geometry>
</collision>
<xacro:inertial_matrix mass="1"/>
</link>
<joint name="joint2" type="revolute">
<parent link="link1"/>
<child link="link2"/>
<origin xyz="-${link1_len} 0 0.0" rpy="-${M_PI/2} 0 ${M_PI/2}" />
<axis xyz="1 0 0" />
<limit effort="300" velocity="1" lower="-2.35" upper="2.35" />
<dynamics damping="50" friction="1"/>
</joint>
<!-- /////////////////////////////////////// LINK2 ////////////////////////////////////////////// -->
<link name="link2" >
<visual>
<origin xyz="0 0 ${link2_len/2}" rpy="0 0 0" />
<geometry>
<cylinder radius="${link2_width}" length="${link2_len}"/>
</geometry>
<material name="White" />
</visual>
<collision>
<origin xyz="0 0 ${link2_len/2}" rpy="0 0 0" />
<geometry>
<cylinder radius="${link2_width}" length="${link2_len}"/>
</geometry>
</collision>
<xacro:inertial_matrix mass="1"/>
</link>
<joint name="joint3" type="revolute">
<parent link="link2"/>
<child link="link3"/>
<origin xyz="0 0 ${link2_len}" rpy="0 ${M_PI} 0" />
<axis xyz="-1 0 0" />
<limit effort="300" velocity="1" lower="-2.62" upper="2.62" />
<dynamics damping="50" friction="1"/>
</joint>
<!-- ///////////////////////////////// LINK3 ///////////////////////////////////////////////////// -->
<link name="link3" >
<visual>
<origin xyz="0 0 -${link3_len/2}" rpy="0 0 0" />
<geometry>
<cylinder radius="${link3_width}" length="${link3_len}"/>
</geometry>
<material name="Blue" />
</visual>
<collision>
<origin xyz="0 0 -${link3_len/2}" rpy="0 0 0" />
<geometry>
<cylinder radius="${link3_width}" length="${link3_len}"/>
</geometry>
</collision>
<xacro:inertial_matrix mass="1"/>
</link>
<joint name="joint4" type="revolute">
<parent link="link3"/>
<child link="link4"/>
<origin xyz="0.0 0.0 -${link3_len}" rpy="0 ${M_PI/2} ${M_PI}" />
<axis xyz="1 0 0" />
<limit effort="300" velocity="1" lower="-2.62" upper="2.62" />
<dynamics damping="50" friction="1"/>
</joint>
<!-- /////////////////////////////////// LINK4 //////////////////////////////////////////////// -->
<link name="link4" >
<visual>
<origin xyz="${link4_len/2} 0 0" rpy="0 ${M_PI/2} 0" />
<geometry>
<cylinder radius="${link4_width}" length="${link4_len}"/>
</geometry>
<material name="Black" />
</visual>
<collision>
<origin xyz="${link4_len/2} 0 0" rpy="0 ${M_PI/2} 0" />
<geometry>
<cylinder radius="${link4_width}" length="${link4_len}"/>
</geometry>
</collision>
<xacro:inertial_matrix mass="1"/>
</link>
<joint name="joint5" type="revolute">
<parent link="link4"/>
<child link="link5"/>
<origin xyz="${link4_len} 0.0 0.0" rpy="0 ${M_PI/2} 0" />
<axis xyz="1 0 0" />
<limit effort="300" velocity="1" lower="-2.62" upper="2.62" />
<dynamics damping="50" friction="1"/>
</joint>
<!-- ////////////////////////////////// LINK5 ///////////////////////////////////////////////// -->
<link name="link5">
<visual>
<origin xyz="0 0 ${link4_len/2}" rpy="0 0 0" />
<geometry>
<cylinder radius="${link5_width}" length="${link5_len}"/>
</geometry>
<material name="White" />
</visual>
<collision>
<origin xyz="0 0 ${link4_len/2} " rpy="0 0 0" />
<geometry>
<cylinder radius="${link5_width}" length="${link5_len}"/>
</geometry>
</collision>
<xacro:inertial_matrix mass="1"/>
</link>
<joint name="joint6" type="revolute">
<parent link="link5"/>
<child link="link6"/>
<origin xyz="0 0 ${link4_len}" rpy="${1.5*M_PI} -${M_PI/2} 0" />
<axis xyz="1 0 0" />
<limit effort="300" velocity="1" lower="-6.28" upper="6.28" />
<dynamics damping="50" friction="1"/>
</joint>
<!-- //////////////////////////////// LINK6 ///////////////////////////////////////////////// -->
<link name="link6">
<visual>
<origin xyz="${link6_len/2} 0 0 " rpy="0 ${M_PI/2} 0" />
<geometry>
<cylinder radius="${link6_width}" length="${link6_len}"/>
</geometry>
<material name="Blue" />
</visual>
<collision>
<origin xyz="${link6_len/2} 0 0" rpy="0 ${M_PI/2} 0" />
<geometry>
<cylinder radius="${link6_width}" length="${link6_len}"/>
</geometry>
</collision>
<xacro:inertial_matrix mass="1"/>
</link>
<joint name="finger_joint1" type="prismatic">
<parent link="link6"/>
<child link="gripper_finger_link1"/>
<origin xyz="0.0 0 0" />
<axis xyz="0 1 0" />
<limit effort="100" lower="0" upper="0.06" velocity="1.0"/>
<dynamics damping="50" friction="1"/>
</joint>
<!-- ////////////////////////////////////// gripper ////////////////////////////////////////////// -->
<!-- LEFT GRIPPER AFT LINK -->
<link name="gripper_finger_link1">
<visual>
<origin xyz="0.04 -0.03 0"/>
<geometry>
<box size="${left_gripper_len} ${left_gripper_width} ${left_gripper_height}" />
</geometry>
<material name="White" />
</visual>
<xacro:inertial_matrix mass="1"/>
</link>
<joint name="finger_joint2" type="fixed">
<parent link="link6"/>
<child link="gripper_finger_link2"/>
<origin xyz="0.0 0 0" />
</joint>
<!-- RIGHT GRIPPER AFT LINK -->
<link name="gripper_finger_link2">
<visual>
<origin xyz="0.04 0.03 0"/>
<geometry>
<box size="${right_gripper_len} ${right_gripper_width} ${right_gripper_height}" />
</geometry>
<material name="White" />
</visual>
<xacro:inertial_matrix mass="1"/>
</link>
<!-- Grasping frame -->
<link name="grasping_frame"/>
<joint name="grasping_frame_joint" type="fixed">
<parent link="link6"/>
<child link="grasping_frame"/>
<origin xyz="0.08 0 0" rpy="0 0 0"/>
</joint>
<!-- ///////////////////////////////// Gazebo ////////////////////////////////////// -->
<gazebo reference="bottom_link">
<material>Gazebo/White</material>
</gazebo>
<gazebo reference="base_link">
<material>Gazebo/White</material>
</gazebo>
<gazebo reference="link1">
<material>Gazebo/Blue</material>
</gazebo>
<gazebo reference="link2">
<material>Gazebo/White</material>
</gazebo>
<gazebo reference="link3">
<material>Gazebo/Blue</material>
</gazebo>
<gazebo reference="link4">
<material>Gazebo/Black</material>
</gazebo>
<gazebo reference="link5">
<material>Gazebo/White</material>
</gazebo>
<gazebo reference="link6">
<material>Gazebo/Blue</material>
</gazebo>
<gazebo reference="gripper_finger_link1">
<material>Gazebo/White</material>
</gazebo>
<gazebo reference="gripper_finger_link2">
<material>Gazebo/White</material>
</gazebo>
<!-- Transmissions for ROS Control -->
<xacro:macro name="transmission_block" params="joint_name">
<transmission name="tran1">
<type>transmission_interface/SimpleTransmission</type>
<joint name="${joint_name}">
<hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
</joint>
<actuator name="motor1">
<hardwareInterface>hardware_interface/PositionJointInterface</hardwareInterface>
<mechanicalReduction>1</mechanicalReduction>
</actuator>
</transmission>
</xacro:macro>
<xacro:transmission_block joint_name="joint1"/>
<xacro:transmission_block joint_name="joint2"/>
<xacro:transmission_block joint_name="joint3"/>
<xacro:transmission_block joint_name="joint4"/>
<xacro:transmission_block joint_name="joint5"/>
<xacro:transmission_block joint_name="joint6"/>
<xacro:transmission_block joint_name="finger_joint1"/>
<!-- ros_control plugin -->
<gazebo>
<plugin name="gazebo_ros_control" filename="libgazebo_ros_control.so">
<robotNamespace>/arm</robotNamespace>
<legacyModeNS>true</legacyModeNS>
</plugin>
</gazebo>
</robot>
4)、修改CMakeLists.txt文件
找到find_package函數,修改爲如下內容:
roscpp
tf
urdf
xacro
5)、修改package.xml配置文件內容:
首先去掉文件頭的format=“2”,如下所示:
將如上信息改爲:
不然後面編譯的時候會出錯!
在對應位置修改爲如下內容:
<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_depend>tf</build_depend>
<build_depend>urdf</build_depend>
<build_depend>xacro</build_depend>
<run_depend>roscpp</run_depend>
<run_depend>tf</run_depend>
<run_depend>urdf</run_depend>
<run_depend>xacro</run_depend>
6)、工程包總體文件如下:
2、機械臂Gazebo仿真工程包(marm_gazebo)及相應文件的創建
1)、在ROS工作空間創建工程包marm_gazebo
cd ~/ros/src
catkin_create_pkg marm_gazebo std_msgs rospy roscpp
2)、在marm_gazebo工程包目錄下創建launch文件夾並創建launch文件
cd ~/ros/src/marm_gazebo
mkdir launch
cd launch
touch arm_bringup_moveit.launch
touch arm_gazebo_states.launch
touch arm_trajectory_controller.launch
touch arm_world.launch
arm_bringup_moveit.launch文件內容如下:
<launch>
<!-- Launch Gazebo -->
<include file="$(find marm_gazebo)/launch/arm_world.launch" />
<!-- ros_control arm launch file -->
<include file="$(find marm_gazebo)/launch/arm_gazebo_states.launch" />
<!-- ros_control trajectory control dof arm launch file -->
<include file="$(find marm_gazebo)/launch/arm_trajectory_controller.launch" />
<!-- moveit launch file -->
<include file="$(find marm_moveit_config)/launch/moveit_planning_execution.launch" />
</launch>
arm_gazebo_states.launch文件內容如下:
<launch>
<!-- 將關節控制器的配置參數加載到參數服務器中 -->
<rosparam file="$(find marm_gazebo)/config/arm_gazebo_joint_states.yaml" command="load"/>
<node name="joint_controller_spawner" pkg="controller_manager" type="spawner" respawn="false"
output="screen" ns="/arm" args="joint_state_controller" />
<!-- 運行robot_state_publisher節點,發佈tf -->
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"
respawn="false" output="screen">
<remap from="/joint_states" to="/arm/joint_states" />
</node>
</launch>
arm_trajectory_controller.launch文件內容如下:
<launch>
<rosparam file="$(find marm_gazebo)/config/trajectory_control.yaml" command="load"/>
<node name="arm_controller_spawner" pkg="controller_manager" type="spawner" respawn="false"
output="screen" ns="/arm" args="arm_joint_controller gripper_controller"/>
</launch>
arm_world.launch文件內容如下:
<launch>
<!-- these are the arguments you can pass this launch file, for example paused:=true -->
<arg name="paused" default="false"/>
<arg name="use_sim_time" default="true"/>
<arg name="gui" default="true"/>
<arg name="headless" default="false"/>
<arg name="debug" default="false"/>
<!-- We resume the logic in empty_world.launch -->
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="debug" value="$(arg debug)" />
<arg name="gui" value="$(arg gui)" />
<arg name="paused" value="$(arg paused)"/>
<arg name="use_sim_time" value="$(arg use_sim_time)"/>
<arg name="headless" value="$(arg headless)"/>
</include>
<!-- Load the URDF into the ROS Parameter Server -->
<param name="robot_description" command="$(find xacro)/xacro --inorder '$(find marm_description)/urdf/arm.xacro'" />
<!-- Run a python script to the send a service call to gazebo_ros to spawn a URDF robot -->
<node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" respawn="false" output="screen"
args="-urdf -model arm -param robot_description"/>
</launch>
3)、在marm_gazebo工程包目錄下創建config文件夾並創建yaml關節和控制文件
cd ~/ros/src/marm_gazebo
mkdir config
cd config
touch arm_gazebo_joint_states.yaml
touch trajectory_control.yaml
arm_gazebo_joint_states.yaml文件內容如下:
arm:
# Publish all joint states -----------------------------------
joint_state_controller:
type: joint_state_controller/JointStateController
publish_rate: 50
trajectory_control.yaml文件內容如下:
arm:
arm_joint_controller:
type: "position_controllers/JointTrajectoryController"
joints:
- joint1
- joint2
- joint3
- joint4
- joint5
- joint6
gains:
joint1: {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
joint2: {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
joint3: {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
joint4: {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
joint5: {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
joint6: {p: 1000.0, i: 0.0, d: 0.1, i_clamp: 0.0}
gripper_controller:
type: "position_controllers/JointTrajectoryController"
joints:
- finger_joint1
gains:
finger_joint1: {p: 50.0, d: 1.0, i: 0.01, i_clamp: 1.0}
4)、修改CMakeLists.txt配置文件內容:
找到find_package函數,並修改爲如下內容:
gazebo_msgs
gazebo_plugins
gazebo_ros
gazebo_ros_control
5)、修改package.xml配置文件內容:
還是去掉文件頭的format=“2”,如下所示:
將如上信息改爲:
不然後面編譯的時候會出錯!
在對應位置修改爲如下內容:
<buildtool_depend>catkin</buildtool_depend>
<build_depend>gazebo_msgs</build_depend>
<build_depend>gazebo_plugins</build_depend>
<build_depend>gazebo_ros</build_depend>
<build_depend>gazebo_ros_control</build_depend>
<run_depend>gazebo_msgs</run_depend>
<run_depend>gazebo_plugins</run_depend>
<run_depend>gazebo_ros</run_depend>
<run_depend>gazebo_ros_control</run_depend>
6)、工程包整體文件內容如下所示:
3、相應控件的下載
1)、manipulation-msgs控件的下載
sudo aptitude install ros-kinetic-manipulation-msgs
沒有aptitude下載器的小夥伴可通過apt-get下載,當然也可下載aptitude下載器,推薦使用這個,因爲該下載器可以分析工具所需要的依賴、並且會幫助我們卸載掉舊版本哦!
2)、moveit-msgs控件的下載
sudo aptitude install ros-kinetic-moveit-msgs
3)、moveit-ros-perception控件的下載
sudo aptitude install ros-kinetic-moveit-ros-perception
4)、moveit-ros-planning-interface接口下載
sudo aptitude install ros-kinetic-moveit-ros-planning-interface
5)、moveit-simple-controller-manager控件下載
sudo aptitude install ros-kinetic-moveit-simple-controller-manager
6)、arm-navigation-msgs控件下載
sudo aptitude install ros-kinetic-arm-navigation-msgs
7)、安裝相應的控制插件
sudo aptitude install ros-kinetic-ros-control ros-kinetic-ros-controllers
8)、安裝需要的關節插件
sudo apt-get install ros-kinetic-joint-trajectory*
以上由於林君學長已經下載完成,就不截圖了,大家自行下載這些控件就好,如何是aptitude下載器,在提示後輸入yes,然後輸入shi就OK
4、ROS工作區進行編譯
1)、進入ROS工作空間
cd ~/ros
2)、進行編譯
catkin_make
編譯成功如下所示:
5、程序註冊
source devel/setup.bash
三、Gazebo+Rviz仿真結果展示
1、Rviz仿環境運行
1)、輸入如下命令,通過Rviz進行機械臂仿真運行
roslaunch marm_description view_arm.launch
2)、運行結果如下所示:
2、Gazebo+Rviz聯合仿真運行
關閉上面的終端,並終止上面的程序的運行
1)、通過以下命令,進行gazebo+rviz機械臂的聯合仿真
roslaunch marm_gazebo arm_bringup_moveit.launch
2)、運行結果如下所示:
注意:Rviz的主題Topic需要自己選擇,選擇base_link,或者其他的也行
以上就是本次博客的全部內容啦,希望對本次博客的閱讀,可以幫助小夥伴們理解機械臂的使用哦,也可以更好的瞭解MoveIt的系統架構是怎麼樣操作機械臂的!
遇到問題的小夥伴,記得評論區留言,林君學長看到了會爲大家解答,這個學長不太冷!
陳一月的又一天編程歲月^ _ ^