ROS-moveit!探索(5)webots和moveit!move_group c++接口

本文介绍了如何在Webots环境中使用ROS的move_group C++接口,通过配置package.xml和CMakeLists.txt解决依赖问题。然后,通过官方例程展示了如何初始化MoveGroupInterface、PlanningSceneInterface,以及如何进行路径规划、避障和添加/移除碰撞物体。文章还提供了错误解决方法和源代码链接。

ROS-moveit!探索(5)webots和moveit!move_group c++接口

开源代码:volcano_moveit
webots版本:2021a
ros版本:noetic
为了能和读者进一步讨论问题,建立了一个微信群,方便给大家解答问题,也可以一起讨论问题。
加群链接

前言

在探索4中讲到了如何在webots中用ROS控制器控制机械臂.接下来将会以官网教程的顺序进行Webots教程的编写。

1.配置

由于使用move_group c++接口时需要使用到planning_interfacevisual_tools两大功能包。所以臂需要配置package.xmlCMakeLists.txt。确保能找到头文件路径。

  1. package.xml
<build_depend>moveit_core</build_depend>
<build_depend>moveit_ros_planning_interface</build_depend>
<build_depend>moveit_visual_tools</build_depend>

<exec_depend>moveit_core</exec_depend> 
<exec_depend>moveit_ros_planning_interface</exec_depend> 
<exec_depend>moveit_visual_tools</exec_depend>   
  1. CMakeLists.txt
find_package(catkin REQUIRED COMPONENTS
  ...
  moveit_ros_planning_interface
  moveit_visual_tools
)
catkin_package(
 CATKIN_DEPENDS 
 ...
 moveit_ros_planning_interface
 moveit_visual_tools
)

笔者配置完后编译遇到的问题:

  • /opt/ros/noetic/include/moveit/robot_model/joint_model.h:46:10: fatal error: Eigen/Geometry: 没有那个文件或目录
    解决:
$ cd /usr/include
$ ln -sf /eigen3/Eigen Eigen

2. 使用官方例程运行

  • 引入头文件

                
<think>我们需要在ROS 2 MoveIt仿真中读取move_group节点的时间。在ROS 2中,时间管理通过rclcpp的时间机制实现。move_group节点作为MoveIt的核心组件,其时间信息可以通过ROS 2的时间源来获取。 根据用户的问题,我们需要知道如何读取move_group节点的时间。在ROS 2中,节点的时间可以通过以下方式获取: 1. 使用节点内部的时钟(node clock)来获取当前时间。 2. 通过订阅/clock话题(当使用模拟时间时)获取时间,但通常我们直接使用节点自己的时钟。 然而,用户可能是在仿真环境中,并且可能使用模拟时间或真实时间。因此,我们需要考虑节点是否设置了`use_sim_time`参数。 读取move_group节点的时间,实际上是在问如何从move_group节点内部获取时间,或者如何从外部获取move_group节点正在使用的时间。 但通常,我们无法直接从外部读取另一个节点的内部时钟。不过,我们可以通过以下方式间接获取: - 如果我们需要在move_group节点内部获取时间,可以在move_group的代码中使用`this->get_clock()->now()`(C++)或`node.get_clock().now()`(Python)。 - 如果我们需要在外部知道move_group节点的时间,实际上我们关心的是该节点所使用的时间参考(模拟时间或系统时间),我们可以通过查询节点的参数`use_sim_time`来知道它使用的是哪种时间,以及通过订阅`/clock`话题(如果是模拟时间)来获取当前时间。 但是,请注意,每个节点都有自己的时钟,而时钟的类型由`use_sim_time`参数决定。当`use_sim_time`为true时,节点会订阅`/clock`话题来获取时间;当为false时,使用系统时钟。 因此,如果我们想获取move_group节点当前的时间,我们必须在该节点内部输出,或者通过一个服务或话题发布出来。但默认情况下,move_group节点不会发布其当前时间。 如果我们只是想获取当前时间(假设我们的节点move_group节点使用相同的时间源),那么在我们的节点中获取当前时间即可,前提是设置相同的`use_sim_time`参数。 所以,针对问题,我们可以这样做: 1. **在move_group节点内部获取时间(修改move_group代码)**: 在move_group的源代码中,我们可以使用`rclcpp::Clock`来获取当前时间,并将其打印或发布出来。 2. **在外部节点获取与move_group相同的时间**: 创建一个节点,设置与move_group相同的`use_sim_time`参数,然后使用该节点的时钟获取当前时间。 3. **通过ROS 2服务获取节点信息**: 目前没有直接的服务可以获取另一个节点的当前时间。 因此,最实用的方法是在外部节点中,通过设置相同的`use_sim_time`参数,然后使用自己的时钟,这样得到的时间与move_group节点使用的时间参考是一致的(假设两个节点在同一ROS域中,并且使用同一个时间源)。 示例(外部节点,Python): ```python import rclpy from rclpy.node import Node class TimeReader(Node): def __init__(self): super().__init__('time_reader', use_sim_time=True) # 设置与move_group相同的use_sim_time # 注意:这里需要确保move_group也设置了相同的use_sim_time(true或false) # 如果move_group使用模拟时间,这里也要设置为true;如果使用系统时间,则设为false。 self.timer = self.create_timer(1.0, self.timer_callback) def timer_callback(self): current_time = self.get_clock().now() self.get_logger().info(f'Current time: {current_time}') def main(): rclpy.init() node = TimeReader() rclpy.spin(node) rclpy.shutdown() if __name__ == '__main__': main() ``` 但是,请注意,如果move_group节点使用的`use_sim_time`为false(使用系统时间),那么我们在外部节点中设置`use_sim_time=false`(或者不设置,因为默认是false),这样获取的时间就是系统时间。 如果我们需要在仿真中保持与move_group一致的时间,那么我们的节点move_group节点必须设置相同的`use_sim_time`。 总结:在ROS 2中,读取move_group节点的时间,实际上需要根据move_group节点的`use_sim_time`参数设置,在外部节点中设置相同的参数,然后使用外部节点的时钟即可得到相同的时间参考。 因此,回答用户的问题:在ROS 2 MoveIt仿真中读取move_group的时间,可以通过在与move_group节点相同时间配置(即相同的`use_sim_time`值)的节点中,使用该节点的时钟来获取当前时间。 注意:不能直接读取move_group节点的内部时间,只能通过这种方式间接同步。 另外,如果需要知道move_group节点内部某个操作的时间戳,通常MoveIt的消息(如运动规划结果)会带有时间戳,可以订阅相关话题来获取。 例如,`/move_group/result`中的结果消息会包含时间戳(header.stamp)。 所以,另一种方式是通过订阅move_group发布的消息来获取其时间戳。 根据上述内容,整理回答。 </think>### ROS 2 MoveIt 仿真中读取 move_group 时间的方法 在 ROS 2 MoveIt 仿真中获取 `move_group` 节点的时间信息,主要通过以下方式实现: #### 1. **通过节点日志直接读取** 在终端启动 `move_group` 时添加时间戳选项: ```bash ros2 run moveit_ros_move_group move_group --ros-args -p log_level:=info \ --log-level rcl:=info \ --log-level moveit_ros_move_group:=info ``` 日志中将显示时间戳信息: ``` [INFO] [1682413527.482635] [move_group]: Received new planning scene ``` #### 2. **使用 ROS 2 时钟接口** 在 C++ 节点中直接获取 `move_group` 的时间: ```cpp #include "rclcpp/rclcpp.hpp" class TimeMonitor : public rclcpp::Node { public: TimeMonitor() : Node("time_monitor") { // 获取当前时间(自动同步move_group时间源) rclcpp::Time current_time = this->now(); RCLCPP_INFO(this->get_logger(), "Current time: %.6f", current_time.seconds()); // 获取move_group启动时间 rclcpp::Clock system_clock(RCL_SYSTEM_TIME); RCLCPP_INFO(this->get_logger(), "System time: %.6f", system_clock.now().seconds()); } }; ``` #### 3. **通过服务调用查询** 通过 `move_group` 提供的服务接口获取时间信息: ```bash # 查询move_group节点信息(包含启动时间) ros2 service call /move_group/get_loggers rcl_interfaces/srv/GetLoggers # 监控节点状态(实时时间) ros2 node info /move_group | grep -i "time" ``` #### 4. **Python 客户端获取** 在 Python 脚本中同步时间: ```python import rclpy from rclpy.time import Time rclpy.init() node = rclpy.create_node('time_listener') # 获取与move_group同步的时间 current_time = node.get_clock().now() node.get_logger().info(f"MoveGroup time: {current_time.nanoseconds/1e9}") ``` #### 关键注意事项: 1. **时间同步**:确保所有节点使用相同的 `use_sim_time` 参数设置 2. **时间源选择**: - 模拟时间:`rclcpp::Clock(RCL_ROS_TIME)` - 系统时间:`rclcpp::Clock(RCL_SYSTEM_TIME)` 3. **延迟补偿**:仿真中需考虑通信延迟,建议使用 `now()` 而非固定时间戳
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

锡城筱凯

你的鼓励是我创造的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值