先完成上一篇任务。
至此,已经完成了一个节点的编写。但在我们进入运动学和下一个手臂项目之前,我们有以下内容需学习:
为了获得对上述的理解,您将会编写另一个名为arm_mover的节点。
arm_mover的描述
在许多方面,arm_mover与simple_mover相似。像simple_mover一样,它负责指挥手臂移动。然而,arm_mover节点不是简单地命令arm遵循预定的轨迹,而是提供服务move_arm,其允许系统中的其他节点发送movement_commands。除了允许通过服务接口移动外,arm_mover还允许通过使用参数来配置最小和最大关节角度。
创建一个新的服务定义
传递给服务的请求以及从服务接收到的响应。请求和响应消息类型的定义包含在位于软件包根目录下的srv目录中的.srv文件中。
为simple_arm定义一个新服务。我们就称之为GoToPosition:
cd ~/catkin_ws/src/simple_arm/
mkdir srv
cd srv
gedit GoToPosition.srv
然后你需要编辑GoToPosition.srv文件,大致包含以下内容:
float64 joint_1
float64 joint_2
---
duration time_elapsed
服务总是包含两部分,用—分隔。第一部分定义请求信息。这里,请求包含两个float64字段,每个simple_arm的关节都有一个字段。第二部分包含服务响应。该响应仅包含一个字段time_elapsed。time_elapsed字段的类型是持续时间,并负责指示手臂执行移动所用的时间。
注意:定义自定义消息类型非常相似,唯一的区别是消息定义位于程序包根目录的msg目录中,具有“.msg”扩展名而不是.srv,并且不包含“—” 分隔。
修改文件CMakeLists.txt
为了让catkin生成允许您在代码中使用消息的python模块或C ++库,您必须首先修改simple_arm的CMakeLists.txt(~/catkin_ws/src/simple_arm/CMakeLists.txt)。
CMake是catkin的基础构建工具,而CMakeLists.txt不过是catkin使用的CMake脚本。如果您熟悉GNU make和makefiles的概念,这是一个类似的概念。
第一步:确保find_package()宏将std_msgs和message_generation列为必需的包。
find_package()宏如下:
find_package(catkin REQUIRED COMPONENTS
std_msgs
message_generation
)
正如名称可能暗示的那样,std_msgs包中包含所有基本的消息类型,message_generation为所有支持的语言(cpp,lisp,python,javascript)生成消息库。
注意:在您的CMakeLists.txt中,您也可以将controller_manager列为必需的软件包。实际上这个包不是必需的。它只是作为在上一课中展示构建失败的手段而添加的。如果您愿意,您可以从必需组件列表中删除它。
第二步:取消注释掉的add_service_files()宏,使其看起来像这样:
## Generate services in the 'srv' folder
add_service_files(
FILES
GoToPosition.srv
)
这告诉catkin要生成代码的文件。
最后:请确保generate_messages()宏未被注释,如下所示:
generate_messages(
DEPENDENCIES
std_msgs # Or other packages containing msgs
)
正是这个宏实际负责生成代码。
更多关于CMakeLists.txt内容在这里。
修改package.xml
现在已经涵盖了CMakeLists.txt文件,您应该可以在技术上构建项目。 但是,还有一个需要修改的文件package.xml。package.xml负责定义包的许多属性,如包的名称,版本号,作者,维护者和依赖关系。
现在,我们担心依赖关系。 在上一课中,您了解了构建时依赖性和运行时包依赖性。 当rosdep正在搜索这些依赖关系时,它就是正在被解析的package.xml文件。 我们添加message_generation和message_runtime依赖关系。
<buildtool_depend>catkin</buildtool_depend>
<build_depend>message_generation</build_depend>
<run_depend>controller_manager</run_depend>
<run_depend>effort_controllers</run_depend>
<run_depend>gazebo_plugins</run_depend>
<run_depend>gazebo_ros</run_depend>
<run_depend>gazebo_ros_control</run_depend>
<run_depend>joint_state_controller</run_depend>
<run_depend>joint_state_publisher</run_depend>
<run_depend>robot_state_publisher</run_depend>
<run_depend>message_runtime</run_depend>
<run_depend>xacro</run_depend>
您现在已准备好构建包装! 有关package.xml的更多信息,请查看ROS Wiki。
构建包
如果您成功构建工作区,现在应该会发现包含用于新服务GoToPosition的模块的python包已经在devel目录下创建。
cd ~/catkin_ws
catkin_make
cd devel/lib/python2.7/dist-packages
ls
在找到新创建的setup.bash之后,新的simple_arm软件包现在已经成为您的PYTHONPATH环境变量的一部分,并且可以使用!
env | grep PYTHONPATH
创建空的arm_mover节点脚本
创建arm_mover节点所用的步骤与创建simple_mover脚本所用的步骤完全相同,但脚本本身的实际名称除外。
cd ~/catkin_ws
cd src/simple_arm/scripts
touch arm_mover
chmod u+x arm_mover
您现在可以使用您最喜爱的文本编辑器编辑空的arm_mover脚本。