接前几篇:
ROS MoveIT1(Noetic)安装总结
Solidworks导出为URDF用于MoveIT总结(带prismatic)
MoveIT1 Assistant 总结
MoveIT Rviz和Gazebo联合仿真
环境
- Ubuntu20.04;
- ROS1 Noetic;
- VMware
概述
目的:将原来/move_group发送给Gazebo的/control/follow_joint_trajectory(Action)发送给真实机械臂,Gazebo发送给/move_group和/robot_state_publisher的/joint_states(Topic)用真实机械臂发送。
指令:可以看到机械臂关节空间随时间变化的轨迹点,包含时间、速度、加速度。
我们的目的就是拿到这个数据给真实机械臂。
rostopic echo /move_group/display_planned_path
- MoveIT的Time Parameterization提供了三种规划器:
Time-optimal Trajectory Parameterization(TOTG)—— AddTimeOptimalParameterization(>=Melodic)
Iterative Spline Parameterization(ISP)—— AddIterativeSplineParameterization
Iterative Parabolic Time Parameterization(IPTP)—— AddTimeParameterization
https://blog.csdn.net/Kalenee/article/details/95889898
- ROS三种关节轨迹控制器插补运算:
线性样条:位置连续,速度、加速度不连续
三次样条:位置和速度连续,加速度不连续
五次样条:位置、速度、加速度都连续(ROS默认使用的)
-
MoveIT Assistant 生成的文件的调用关系图:
红色为默认调用的选项。 -
路径规划算法:
OMPL: OMPL(Open Motion Planning Library)是一个广泛使用的开源库,用于运动规划。它实现了多种算法,包括基于采样的路径规划,基于梯度的优化算法等。OMPL旨在为不同类型的机器人和环境提供通用的解决方案。
CHOMP: CHOMP(Covariant Hamiltonian Optimization for Motion Planning)是一种基于优化的方法,可以对机器人进行全身运动规划。CHOMP通过在时间和空间上对代价函数进行优化来规划路径。代价函数包括机器人的碰撞,平滑度和速度等因素。
OMPL-CHOMP:结合了OMPL和CHOMP的优点。它使用OMPL来解决采样问题,并使用CHOMP进行路径优化。OMPL-CHOMP提供了一种灵活的方法,可以在不同类型的机器人和环境中实现高质量的运动规划。
STOMP: STOMP(Stochastic Trajectory Optimization for Motion Planning)是一种基于优化的随机方法,用于高维空间中的路径规划。与CHOMP不同,STOMP使用随机梯度下降来解决优化问题。STOMP通过在代价函数中添加噪声,从而避免了陷入局部最优解的风险。
https://ros-planning.github.io/moveit_tutorials/doc/planning_adapters/planning_adapters_tutorial.html
https://blog.csdn.net/qq_34935373/article/details/105042352
配置修改
demo.launch中需要修改的地方:
......
<arg name="moveit_controller_manager" default="simple" />
......
<group if="$(eval arg('moveit_controller_manager') == 'simple')">
......
<rosparam param="source_list">[move_group/ros_controller_joint_states]</rosparam>
......
move_group.launch修改:
......
<arg name="moveit_controller_manager" default="simple" />
......
编写Action Server
之前在 Gazebo 中虚拟仿真的时候,是 Gazebo 的 ros_control 插件充当了 action server 的角色,让 MoveIt 端的 client 和 Gazebo 端的 server 建立了 action 通信连接。
因此,moveit扮演的是客户端,服务端需要编写。(move_group此时是follow_joint_trajectory的client端,动作消息是client端的move_group发布的。)
https://blog.csdn.net/qq_34935373/article/details/95916111
https://blog.csdn.net/huangjunsheng123/article/details/125958436
在assis_1下新建scripts文件夹,添加action_server.py,并设置属性和权限为可执行。编译:
catkin build -DCATKIN_WHITELIST_PACKAGES="assis_1"
action_server.py:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import rospy
import roslib
import actionlib
import sensor_msgs.msg
import control_msgs.msg
class FollowJointTrajectoryActionServer:
def __init__(self):
self.FollowJointTrajectory = control_msgs.msg.FollowJointTrajectoryAction()
self.RecSucceeded = False
self.server = actionlib.SimpleActionServer('/robot_control/follow_joint_trajectory',control_msgs.msg.FollowJointTrajectoryAction,self.execute,False)
self.server.start()
print("FollowJointTrajectoryActionServer start succeeded\n")
def execute(self,Trajectory ):
#