如何在TigerArm中添加新的动作¶
在TigerArm中,一个按键对应于一个动作。当我们想要创建一个新动作的时候,需要先设定好他要经过的轨迹点,然后在MoveIt!中将其添加到动作组中,并与键盘上的一个按键对应起来
设置动作经过的轨迹点¶
我们是通过xyzrpy六个参数来表示一个点的位置,坐标原点位于机器人底盘中心
src/arm_moveit_kinematics/config/poses.yaml
Total: 2 #总共读入的轨迹点数
#EffectorLength: 0.05
Points: #轨迹点序列
-
tag: pre_place #准备放入矿仓
id: 0
xyz:
- -0.14
- -0.01
- 0.67
rpy:
- 2.0601
- -0.000
- 1.6252
action: 1
-
tag: pre_pick_island #准备抓取矿石(原姿态,现已废弃)
id: 1
xyz:
- 0.52
- -0.00
- 0.38
rpy:
- 2.0089
- -0.0044
- -1.5773
action: 1
...
注册新的键盘按键¶
打开src/arm_moveit_kinematics/include/arm_moveit_kinematics/keyboards.h,在enum中添加新的键盘对应数值进行按键注册
namespace arm_keys{
enum kv{
_w = 119,
...
_o = 111
};
}
将动作加入Moveit!动作组中¶
打开src/arm_moveit_kinematics/src/arm_moveit_kinematics_node.cpp,找到如下函数
void ArmJointsControllerNode::key_recv_callback(const std_msgs::Int32& msg) {
ROS_INFO_NAMED("arm_log", "recieved keyboard msgs: %d", msg.data);
tf::TransformListener listener;
geometry_msgs::PoseStamped g_pose_target_stamp;
...
std::vector<std::string>().swap(target_pose_name);
}
然后仿照如下格式加入到分支中,需要修改kv::后面的值与target_pose_name
case kv::_space: //拿出矿仓中的矿石进入准备兑换模式
target_pose_name = {"pre_place", "pick_mineral", "pre_place", "pre_exchange"};
set_target_pose(target_pose_name);
break;
注解
里面的target_pose_name即是在yaml中设定的轨迹点的tag,Moveit!将会规划出一条按给定顺序经过相应点的路径出来
然后重新编译,即可完成添加一个新的动作