G在ROS2中实现类似“/gazebo/set_model_state”的功能

ROS2采用launch.py文件来加载gazebo环境

model文件里是引入环境模型和机器人模型,他们都是sdf文件

实现:步骤一

<plugin filename="libgazebo_ros_state.so" name="gazebo_ros_state">
   <!-- Set the ROS node name for the plugin -->
   <ros>
   <namespace>/gazebo</namespace>
   </ros>
</plugin>

把代码放在world标签下面,然后用服务操作模型的坐标

操作方式如下(注意标签reference_frame选择world)

ros2 service call /gazebo/set_entity_state gazebo_msgs/srv/SetEntityState "state: {name: turtlebot3_burger, pose: {position:{x: 0.0, y: 0.0, z: 0.1}}, reference_frame: world}" 

实现:步骤二(c++代码实现)

#include "rclcpp/rclcpp.hpp"
#include "gazebo_msgs/srv/set_entity_state.hpp"

int main(int argc, char** argv)
{
    rclcpp::init(argc, argv);
    auto node = rclcpp::Node::make_shared("gazebo_service_client");

    // 创建一个用于发送服务请求的客户端
    auto client = node->create_client<gazebo_msgs::srv::SetEntityState>("/gazebo/set_entity_state");

    // 循环发送服务请求
    int num=0;
    while (rclcpp::ok()) {
        num=num+1;
        num=num%10;
        if (client->wait_for_service(std::chrono::seconds(1))) {
            auto request = std::make_shared<gazebo_msgs::srv::SetEntityState::Request>();

            // 填充请求参数
            request->state.name = "turtlebot3_burger";
            request->state.pose.position.x = -(num+1);
            request->state.pose.position.y = -(num+1);
            request->state.pose.position.z = double(num%100);
            request->state.reference_frame = "world";

            // 发送服务请求(异步)
            client->async_send_request(request);

            // 可以在此添加其他操作,不需要等待响应

        } else {
            RCLCPP_ERROR(node->get_logger(), "Service not available");
        }

        // 延时一段时间后再次发送请求
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }

    rclcpp::shutdown();
    return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值