基于ROS+Moveit搭建机器人控制系统(仿真+实体)
项目介绍: 该项目是本人参与开发的一个六自由度机械臂(目前仍在开发中),这个系列都是关于该机械臂ROS部分的控制框架搭建,轨迹解算,下位机通信,外设控制(遥控器/键盘)等部分知识。底层的下位机控制也会涉及位控部分,力控目前能力不足(若后期资金充足,使用如海泰这种具有扭矩反馈的电机,也会考虑做,届时会更新相关的知识),关于更上层的视觉处理部分则不会涉及。
有问题欢迎私信我,或者邮箱联系我2250017028@qq.com
第一部分:修改moveit配置文件
-
说明:文件框架的搭建需要以moveit_setup_assistant生成的配置文件为基础,因为需要用到move_group进行轨迹规划。具体的配置参考本人的另外一篇博客机械臂项目实战
以下的配置均在已经完成了上述配置的基础下进行展开。 -
修改思路:
- 修改demo中的配置,使其从仿真控制转为控制实体。(demo文件指的是上述博客中的文件,直接复制替换即可,自动生成的demo会有bug)
- 其余的配置在上述的博客中已经修改完成,不作赘述。
-
参考:我上述的博客参考了古月居的机械臂教程,实现了将机械臂模型放在gazebo仿真环境中运行,其实已经涉及到了以上的修改。这也就是说,在gazebo中运行与实体运行的控制是类似的,都是与move_group进行通信,并使用轨迹控制器和关节控制器,处理轨迹点,控制关节运行。所以该控制框架的搭建参考了gazeobo的控制模型。同时,我也参考了网上其他博主分享的相关博客,站在巨人的肩膀上,搭建出了一套自己的控制框架。
- 修改fake_execution参数
<!-- Run the main MoveIt executable without trajectory execution (we do not have controllers configured by default) -->
<include file="$(find aubo_i5_moveit_config)/launch/move_group.launch">
<arg name="allow_trajectory_execution" value="true"/>
<arg name="fake_execution" value="false"/> //这个参数改成false,表示将控制信号发出去
<arg name="info" value="true"/>
<arg name="debug" value="$(arg debug)"/>
</include>
- 修改joint_state_publisher的参数列表
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher">
<param name="/use_gui" value="false"/>
<rosparam param="/source_list">[/robot_name/joint_states]</rosparam>
</node>
- 这里的修改表示move_group订阅话题 /robot_name/joint_states ,使用其中的数据更新move_group的关节状态。这个话题就是我们之后要创建的关节状态发布者发布的话题。
第二部分:搭建文件框架
- 说明:因为不想摈弃掉gazebo的仿真环境,但是move_group的客户端只能配对一个服务端,所以
无法一边运行实体,一边在gazebo中运行,所以我使用一个参数选择运行哪种模式。
1.创建功能包robot_name_kinematics
cd ~/catkin_ws/src
catkin_create_pkg robot_name_kinematics roscpp std_msgs sensor_msgs serial actionlib moveit_ros_planning_interface moveit_msgs
2.定义消息
- joint_states.msg
float32 p_joint1
float32 p_joint2
float32 p_joint3
float32 p_joint4
float32 p_joint5
float32 p_joint6
float32 p_joint7
# float32 p_joint8
# float32 p_joint9
uint8 JOINTS_NUM = 7
这里的消息定义是为了方便之后的下位机通信,具体的内容因人而异,或者直接使用标准的消息类型也可以。
3. 添加头文件和源文件
include | src |
---|---|
robot_name_joints_states_controller.h | robot_name_joints_states_controller. cpp |
robot_name_trajectory_controller.h | robot_name_trajectory_controller. cpp |
CMakeLists.txt
- 添加链接库
add_executable(trajectory_controller src/robot_name_trajectory_controller.cpp)
target_link_libraries(trajectory_controller ${catkin_LIBRARIES})
add_executable(joints_states_controller src/robot_name_joints_states_controller.cpp)
target_link_libraries(joints_states_controller ${catkin_LIBRARIES})
- 添加依赖库
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES trobot_kinematics
CATKIN_DEPENDS actionlib moveit_msgs roscpp
# DEPENDS system_lib
)
- 添加消息(若有定义)
## Generate messages in the 'msg' folder
add_message_files(
FILES
joint_states.msg
)
......
## Generate added messages and services with any dependencies listed here
generate_messages(
DEPENDENCIES
moveit_msgs
)
4.添加launch文件
trobot_real.launch
<launch>
<!-- 加载机器人关节控制器-->
<node name="joints_states_controller" pkg="robot_name_kinematics" type="joints_states_controller" />
<!-- 加载机器人轨迹控制器-->
<node name="trajetory_controller" pkg="robot_name_kinematics" type="trajectory_controller" />
</launch>
trobot_sim.launch
<launch>
<!-- 加载gazebo环境 -->
<include file="$(find robot_name_gazebo)/launch/robot_name_gazebo_world.launch" />
<!-- 加载关节状态控制器,接收虚拟的关节状态 -->
<include file="$(find robot_name_gazebo)/launch/robot_name_gazebo_states.launch" />
<!-- 加载机器人轨迹控制器的服务端,用于接收和处理轨迹点数据 -->
<include file="$(find robot_name_gazebo)/launch/robot_name_trajectory_controller.launch" />
</launch>
trobot_start.launch
<launch>
<!-- *选择是否控制实体 -->
<arg name = "real_module" value = "true"/>
<!--加载gazeobo仿真环境-->
<include unless ="$(arg real_module)" file="$(find trobot_kinematics)/launch/trobot_sim.launch" />
<!--加载实体控制环境-->
<include if ="$(arg real_module)" file="$(find trobot_kinematics)/launch/trobot_real.launch" />
<!-- 加载moveit相关文件 -->
<include file="$(find trobot_moveit_config)/launch/demo.launch" />
</launch>
- real_module:true表示控制实体,false表示在gazebo中运行(哪种情况下rviz都会启动),通过修改改参数方便地切换两种工作环境。
下一章将具体展开讲述控制框架的搭建以及源码实现
有兴趣的小伙伴记得关注哦!