ROS的功能是强大的,当然对机械臂也有相应的支持 —— MoveIt!
MoveIt官方网站
1. MoveIt简介
- 一个 集成化的 开发平台
- 由 一系列的功能包 组成
- 运动规划
- 控制与导航算法
- 操作控制
- …
- 提供窗口化操作
- 用户接口(User Interface)
- C++:使用move_group_interface包提供的API
- Python:使用moveit_commander包提供的API
- GUI:使用MoveIt!的rviz插件
- ROS参数服务器
- URDF:robot_description参数,获取机器人URDF模型的描述信息
- SRDF:robot_description_semantic参数,获取机器人模型的配置信息
- config:机器人的其他配置信息,例如关节限位、运动学插件、运动规划插件等
- 机器人
2. MoveIt! Setup Assistant配置机械臂
安装MoveIt wiki官网
完成后执行如下指令:
$ roslaunch moveit_setup_assistant setup_assistant.launch
C800机械臂
首先进行C800机械臂的配置:
- Start:点击Create New Moveit Configuration Package,浏览并选中机械臂的urdf文件,点击load加载你的机械臂。
- Self Collisions:设置自碰撞检测,为减少之后的计算量,检查机械臂中不可能相互碰撞的link。
- Virtual Joints:虚拟关节。给机械臂整体在外界设置一个参考系。如果机械臂含有底盘,就可以通过虚拟关节和外界参考系的相对运动,确定机械臂的状态。这里把世界坐标系和设置的虚拟关节建立了联系。由于机械臂是不可动的,使用所以设置了fixed(还有planar和floating两种选择)。
- Planning Groups:规划组。Kinematic Solver是运动学正逆解,这里选择了kdl,Kin.Search Timeout是结算时间,如果超出这个时间就会报错,这取决于电脑的性能。OMPL(Open Motion Planning Library)运动规划算法,这里选择常用的RRTConnect。随后添加运动规划的关节,可以使用add joint添加,也可以使用添加Kinematic Chain,添加Base Link和Tip Link形成一个完整的运动学链。
- Robot Poses:预定义机器人位姿。将0位置定义成home,类似于无人机返航一样,可以随时通过home返回0点,也可以设定其他若干个点。
- End Effectors:定义一个终端,用做夹爪的控制。
- Passive Joints:固定一个自由度。放入右边Passive Joint的关节将被锁定,不能运动。
- ROS Control:作用是将MoveIt发出的数据封装好发布出去。点击Auto Add就可以自动加入一个Planning Group内的所有FollowjointTrajectory控制器。还需要点击add controller添加一个控制端用来接收MoveIt的信息并传给gazebo仿真器,使得机械臂运动。也是通过这个controller和真机传输信息的。
- Simulation:生成或修改URDF使得可以在Gazebo内进行仿真,只需点击Generate。将自动产生的文件复制到传入的.urdf文件中,并将EffortJointInterface改成PositionJointInterface,因为前面我们使用的是路径规划,生成的是力驱。
- 3D Perception:机械臂上的相机设置。
- Autho Information:作者信息。
- Configuration Files:产生一个配置包,命名最好为“机械臂名_moveit_config”。点击Generate。
含有相机和夹爪的机械臂
首先补充知识.urdf设定旋转轴时,TF坐标x轴(红)始终指向旋转轴方向。
这里呈现与上述步骤未包含的步骤:
- 对于有夹爪的机械臂还需设置夹爪的Planning Group,因为夹爪和机械臂本体通常是两套控制器,这里只需把夹爪添加到Joints就可以了。
- End Effectors:设置对夹爪的控制。
- 需要设置机械臂和夹爪的控制器,在assitant内不能使用相同的controller名,但是如果命名不同,机械臂控制器信息的接受者arm_controller_gazebo便不能接受arm_controller发送的MoveIt信息,需要在后续进行更改。
- 设置相机采集点云信息。/camera/depth/points是在urdf文件中事先设定好的目录。
3. MoveIt+Gazebo仿真配置
ros_control 可参考https://blog.csdn.net/weixin_41045354/article/details/104413355
MoveIt发送轨迹(Trajectory)信息(包括运动学 Kinematics、路径规划 Path Planning、碰撞检测 Collision Checking);通过FollowJointTrajectory将信息封装成Action(ROS中的一种通信形式,即传输信息并能得到反馈);然后插补,对轨迹上的轨迹点进行插补,比如1ms,运用Trajectory Interpolation插补算法;随后把信息发送给伺服,通过电频信号转换成电流、电压信号,使得电机进行旋转,并通过Joint State Controller反馈信息。
- 控制器管理器
- 提供一种通用的接口来管理不同的控制器。controller manager包含了各种各样的控制器,典型的包括机械臂本身和夹爪。真实机械臂会通过编码器,进行位姿的反馈;joint_state实现了Gazebo中类似编码器的功能。
- 控制器
- 读取硬件状态,发布控制命令,完成每个joint的控制。
- 硬件资源
- 为上下两层提供硬件资源的接口。
- 机器人硬件抽象
- 机器人硬件抽象和硬件资源直接打交道,通过write和read方法完成硬件操作。
- 真实机器人
- 执行接收到的命令。
- 修改刚才创建的c800_moveit_config/config/ros_controllers.yaml。controller_list下是在assistant中设置的机械臂的控制器,用来控制6个joint,需要把下面controller_gazebo(在assistant中设置的用来接收MoveIt封装信息的控制器名)改成arm_controller,两个名字需要相同,由于assistant内不能出现相同名称,需要自己在文件中修改。
- 修改/launch/ros_controllers.launch。将controller_azebo(同样是assistant内设置的)改成刚才提到的arm_controller和joint_state_controller,joint_state_controller用来反馈位姿信息。