170111-機械臂gazebo基礎


前言

  • 依然是基礎

參考

Mastering ROS for Robotics Programming.2015

學習記錄

概述

  • 需要安裝以下包
sudo apt-get install ros-jade-gazebo-ros-pkgs ros-jade-gazeboros ros-jade-gazebo-msgs ros-jade-gazebo-plugins
  • gazebo_ros_msgs: ROS包,為Gazebo提供ros方面的接口
  • gazebo-msgs: 為ros提供gazebo方面的接口
  • gazebo-plugins: gazebo plugins for sensors and actuators
  • gazebo-ros-control: 包含標准的控制器

制作xacro文件

添加顏色和紋理

<gazebo reference="bottom_link">
<material>Gazebo/White</material>
</gazebo>
<gazebo reference="base_link">
<material>Gazebo/White</material>
</gazebo>
<gazebo reference="shoulder_pan_link">
<material>Gazebo/Red</material>
</gazebo>

添加換能信息

  • 定義這種信息是為了將關節和馬達(激勵)聯系起來,下面是定義transmission的宏
<xacro:macro name="transmission_block" params="joint_name">
<transmission name="tran1">
<type>transmission_interface/SimpleTransmission</type>
<joint name="${joint_name}">
<hardwareInterface>PositionJointInterface</
hardwareInterface>
</joint>
<actuator name="motor1">
<mechanicalReduction>1</mechanicalReduction>
</actuator>
</transmission>
</xacro:macro>
  • Here, the is the joint in which we link the actuators. The element is the type of transmission. Currently, transmission_interface/SimpleTransmission is only supported. The element is the type of hardware interface to load (position, velocity, or effort interfaces). The hardware interface is loaded by the gazebo_ros_control plugin; we can see more about this plugin in the next section.

添加gazebo_ros_control插件

  • 在xacro文件下添加這些文件
<!-- ros_control plugin -->
<gazebo>
<plugin name="gazebo_ros_control" filename="libgazebo_ros_control.
so">
<robotNamespace>/seven_dof_arm</robotNamespace>
</plugin>
</gazebo>
  • The default hardware interfaces are JointStateInterface, EffortJointInterface, and VelocityJointInterface.

添加一個3D傳感器

制作環境啟動文件

roslaunch seven_dof_arm_gazebo seven_dof_arm_world.launch

在RViz中查看圖像

rosrun rviz rviz -f /rgbd_camera_optical_frame

使用ROS Controllers來移動機械臂各個關節

概述

  • 對於每一個關節,我們都必須定義一個ROS Controller,這個控制器必須兼容硬件平台,這個硬件平台在xacro的 中已經定義好。
  • 一個控制器往往擁有一個PID控制律,這個控制律根據給定的點位置來輸出一定的反饋輸出給電機,來實現閉環控制。
  • ros controller不會直接與硬件聯系,而是與硬件接口聯系(很好理解),硬件接口的作用是解釋ROS控制器發送過來的數據信息,解決一些沖突問題。
  • 在典型的機械臂中,需要定義好位置控制器,速度控制器,力矩控制器等等。這些控制器都在ros_control包中。
  • 接下來我們學習如何配置這些控制器。

理解ros_control包

  • 這一個大包實現了機器人控制器robot controllers, controller managers控制器管理器, hardware interface硬件接口,不同的換能接口transmission interface和控制工具箱control toolboxes.
  • 主要包括以下包:
    • control_toolbox: 包含PID控制器和sine控制器
    • controller_interface: 包含控制機接口的基類
    • controller_manager: 這個包能夠加載,卸載,啟動和停止控制器
    • controller_manager_msgs: 為控制器管理器提供消息和服務的實現
    • hardware_interface: 硬件接口的基類
    • transmission_interface: 換能接口類,(差速,四桿機構,關節狀態,位置,速度)

不同種類的ros控制器和硬件接口

  • 標准的ROS控制器有:
    • joint_pisition_controller: 簡單的關節位置控制器
    • joint_state_controller: 控制器,發送joint state消息
    • joint_effort_controller: 關節力矩控制器
  • 一般使用的硬件接口是:
    • Joint Command Interface: 發送關節信息給硬件
    • Effort Joint Interface:
    • Velocity Joint Interface:
    • Position Joint Interface:
    • Joint State Interface: 這個接口會從激勵器的編碼器處獲得傳感信息

ROS控制器與Gazebo連接

設置joint state controllers and joint position controllers

為兩個控制器寫配置文件,名字為xxx_control.yaml
  • 這是一個總的配置文件,規定每一個控制器分別發送和接收何種消息
cyton_gamma_1500_arm:
  # Publish all joint states -----------------------------------
  joint_state_controller:
    type: joint_state_controller/JointStateController
    publish_rate: 50 

  # Position Controllers ---------------------------------------
  joint1_position_controller:
    type: position_controllers/JointPositionController
    joint: shoulder_roll_joint
    pid: {p: 100.0, i: 0.01, d: 10.0}
  joint2_position_controller:
    type: position_controllers/JointPositionController
    joint: shoulder_pitch_joint
    pid: {p: 100.0, i: 0.01, d: 10.0}
  joint3_position_controller:
    type: position_controllers/JointPositionController
    joint: shoulder_yaw_joint
    pid: {p: 100.0, i: 0.01, d: 10.0}
  joint4_position_controller:
    type: position_controllers/JointPositionController
    joint: elbow_pitch_joint
    pid: {p: 100.0, i: 0.01, d: 10.0}
  joint5_position_controller:
    type: position_controllers/JointPositionController
    joint: elbow_yaw_joint
    pid: {p: 100.0, i: 0.01, d: 10.0}
  joint6_position_controller:
    type: position_controllers/JointPositionController
    joint: wrist_pitch_joint
    pid: {p: 100.0, i: 0.01, d: 10.0}
  joint7_position_controller:
    type: position_controllers/JointPositionController
    joint: wrist_roll_joint
    pid: {p: 100.0, i: 0.01, d: 10.0}
寫啟動控制器的啟動文件
  • xxx_gazebo_control.launch
<launch>
  <!-- Launch Gazebo  -->
  <include file="$(find gamma_1500_gazebo)/launch/cyton_gamma_1500_world.launch" />  


  <!-- Load joint controller configurations from YAML file to parameter server -->
  <rosparam file="$(find gamma_1500_gazebo)/config/cyton_gamma_1500_gazebo_control.yaml" command="load"/>


  <!-- load the controllers -->
  <node name="controller_spawner" pkg="controller_manager" type="spawner" respawn="false"
    output="screen" ns="/cyton_gamma_1500_arm" args="joint_state_controller
                      joint1_position_controller
                      joint2_position_controller
                      joint3_position_controller
                      joint4_position_controller
                      joint5_position_controller
                      joint6_position_controller
                      joint7_position_controller"/>


  <!-- convert joint states to TF transforms for rviz, etc -->
  <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"
    respawn="false" output="screen">
    <remap from="/joint_states" to="/cyton_gamma_1500_arm/joint_states" />
  </node>

</launch>
移動關節
  • 啟動控制器,然后發送消息即可
roslaunch seven_dof_arm_gazebo seven_dof_arm_gazebo_control.launch
rostopic list
rostopic pub /seven_dof_arm/joint4_position_controller/command std_msgs/Float64 1.0
rostopic echo /seven_dof_arm/joint_states


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM