创建 `.action` 文件的步骤如下:
### 1. 在ROS包中创建 `action` 目录
首先,确保你在你的ROS包中有一个目录来存放 `.action` 文件。如果没有,可以创建一个。
```sh
cd ~/catkin_ws/src/your_package_name
mkdir action
```
### 2. 创建 `.action` 文件
在 `action` 目录中创建一个新的 `.action` 文件。例如,我们创建一个 `MoveArm.action` 文件:
```sh
cd action
touch MoveArm.action
```
### 3. 定义 `.action` 文件的内容
使用你喜欢的文本编辑器(如 `nano`, `gedit`, `vim` 等)编辑 `MoveArm.action` 文件。该文件包含三个部分:目标(goal)、反馈(feedback)和结果(result),每个部分之间用 `---` 分隔。
```plaintext
# MoveArm.action
# 目标(goal)
geometry_msgs/PoseStamped target_pose
---
# 反馈(feedback)
float32 progress
---
# 结果(result)
bool success
```
保存文件并退出编辑器。
### 4. 修改 `CMakeLists.txt`
在你的ROS包的 `CMakeLists.txt` 文件中,添加生成 `.action` 文件所需的配置。
1. 确保包含以下内容:
```plaintext
find_package(catkin REQUIRED COMPONENTS
actionlib_msgs
actionlib
geometry_msgs
message_generation
rospy
std_msgs
)
```
2. 添加生成 `.action` 文件的指令:
```plaintext
add_action_files(
FILES
MoveArm.action
)
```
3. 指定生成消息:
```plaintext
generate_messages(
DEPENDENCIES
actionlib_msgs
geometry_msgs
)
```
4. 确保 `catkin_package` 指令包含对 `message_runtime` 的依赖:
```plaintext
catkin_package(
CATKIN_DEPENDS actionlib_msgs geometry_msgs message_runtime
)
```
### 5. 修改 `package.xml`
在你的包的 `package.xml` 文件中,添加对 `actionlib_msgs` 和 `geometry_msgs` 的依赖:
```xml
<build_depend>actionlib_msgs</build_depend>
<exec_depend>actionlib_msgs</exec_depend>
<build_depend>geometry_msgs</build_depend>
<exec_depend>geometry_msgs</exec_depend>
<build_depend>actionlib</build_depend>
<exec_depend>actionlib</exec_depend>
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
```
### 6. 编译你的包
在完成上述修改后,编译你的ROS包:
```sh
cd ~/catkin_ws
catkin_make
source devel/setup.bash
```
### 7. 使用生成的消息类型
现在你可以在你的代码中使用生成的消息类型。例如,在Python代码中:
```python
import rospy
import actionlib
from your_package_name.msg import MoveArmAction, MoveArmGoal, MoveArmFeedback, MoveArmResult
def feedback_cb(feedback):
rospy.loginfo('Progress: %f' % feedback.progress)
def move_arm_client():
client = actionlib.SimpleActionClient('move_arm', MoveArmAction)
client.wait_for_server()
goal = MoveArmGoal()
goal.target_pose.header.frame_id = "base_link"
goal.target_pose.pose.position.x = 0.5
goal.target_pose.pose.position.y = 0.0
goal.target_pose.pose.position.z = 0.5
goal.target_pose.pose.orientation.w = 1.0
client.send_goal(goal, feedback_cb=feedback_cb)
client.wait_for_result()
result = client.get_result()
rospy.loginfo('Success: %s' % result.success)
if __name__ == '__main__':
rospy.init_node('move_arm_action_client')
move_arm_client()
```
通过这些步骤,你可以成功创建并使用 `.action` 文件来定义动作通信接口并控制你的机械臂。