您好,
会员登录 快速注册
退出 ( 条未读消息)
关于本站 意见反馈 首页

公告:小宅博客网可以开发票了,需要发票的,去群里找群主哈!!
全部文章分类
  • 人工智能 >

  • 编程语言 >

  • WPF系列 >

  • ASP.NET系列 >

  • Linux >

  • 数据库 >

  • 嵌入式 >

  • WEB技术 >

  • PLC系列 >

  • 微服务与框架 >

  • 小宅DIY >

  • 学习资料 >

OpenCv基础 ANN车牌识别 yolov5车牌识别 指针式仪表识别 ROS系列 YOLO Halcon Detectron2 昇腾AI ChatGPT在线体验 英伟达JETSON ChatGLM ChatTTS FunASR 地平线 ByteTrack 魔搭社区 LangChain
C C# C++ Python Java Go
WPF
ASP.NET小功能 GPS定位系统-MVC GPS定位系统-VUE ASP.NET WebRTC
Linux Linux内核 Shell MakeFile
MySql SqlServer Oracle
STM8 STM32 51单片机
VUE入门 HTML JavaScript CSS layui镜像网站 ElementUi中文官网 element-plus 图标
三菱 欧姆龙 西门子 施耐德 松下 台达
IOTSharp IOTGateway ABP FRAMEWORK Docker
亚克力音响 编程仙途:智驭万法
面试题与技巧 Python入门技能树 微软C#教程
首页 编程之美 工具下载 全国就业 流量地图 文心一言
ROS系列
ROS - 介绍 ROS1-常规安装方法 ROS1-Linux下的ROS环境搭建 ROS1-ROS话题:发布者 ROS1-发布者与订阅者通讯 ROS1-服务器与客户端节点通讯 ROS1-动作服务器与客户端通讯 ROS1-发布imu和gps消息 ROS2-新建Ubuntu环境 ROS2-创建一个简单节点 ROS2-Python之消息的发布与订阅 ROS2-C++之消息的发布与订阅 ROS2-调用USB免驱摄像头 ROS2-地瓜机器人笔记 ROS2 控制小车进行矩形运动 ROS2 设置节点开机自启 ROS2 添加自定义msg ROS2 URDF建模 ROS2 Gazebo 仿真环境搭建 ROS2 XACRO建模 ROS2 在Gazebo加载机器人模型 ROS2 Carttographer安装 ROS2 配置cartographer进行建图 ROS2 Nav2导航仿真-新建工程 ROS2 Nav2导航仿真 ROS2 Nav2 API导航
ROS2-地瓜机器人笔记
ROS2 设置节点开机自启
激萌の小宅 小宅博客 ROS系列

文章作者:激萌の小宅

促销:¥0

价格:¥0

配送方式: 购买后立即生效(如购买异常,请联系站长)
付款之后一定要等待自动跳转结束,否则购买可能会失败
  • 0 天

    有效期

  • 0

    总销量

  • 0

    累计评价

ROS2 控制小车进行矩形运动

需要启动的节点:

# 打开机器人底盘
ros2 launch turn_on_wheeltec_robot turn_on_wheeltec_robot.launch.py

# 2D导航
ros2 launch wheeltec_nav2 wheeltec_nav2.launch.py


查看小车当前坐标信息:

ros2 topic echo /amcl_pose


然后运行下面节点“ros2 run system_realtime_map navigation_set_node”

import rclpy  
from rclpy.node import Node  
from geometry_msgs.msg import PoseWithCovarianceStamped, PoseStamped  
import math  
import time  
import threading  
from datetime import datetime, timedelta  
  
class NavigationNode(Node):  
    def __init__(self):  
        super().__init__('navigation_set_node')  
        self.start_time = datetime.now()
        # self.end_time = datetime.now() + timedelta(hours=1)
        self.out_time = 0.0
        # 发布2D导航
        self.publisher_ = self.create_publisher(PoseStamped, 'goal_pose', 10)  
        # 订阅坐标信息
        self.subscription  = self.create_subscription(PoseWithCovarianceStamped,"amcl_pose",self.pose_callback,10)
        self.subscription # 防止被垃圾回收

        # 创建一个线程来运行移动逻辑  
        threading.Thread(target=self.thread_move, args=()).start()  
  
    def pose_callback(self, msg):  
        self.start_time = datetime.now()
        print(msg.pose.pose.position)

    def setPose(self, p_x, p_y, theta_deg):  
        # 将角度从度数转换为弧度  
        theta_rad = math.radians(theta_deg)  
        goal = PoseStamped()  
        goal.header.frame_id = 'map'  
        goal.pose.position.x = p_x  
        goal.pose.position.y = p_y  
        goal.pose.position.z = 0.0  # 在2D导航中,z通常设置为0  
        # 计算四元数来表示方向  
        goal.pose.orientation.z = math.sin(theta_rad / 2) # 对于绕z轴旋转,z分量为0  
        goal.pose.orientation.w = math.cos(theta_rad / 2)  
        # 注意:对于绕z轴的简单旋转,x和y分量应该为0,这里我们明确设置为0  
        goal.pose.orientation.x = 0.0  
        goal.pose.orientation.y = 0.0  
        self.publisher_.publish(goal)  
        print(f"send {p_x},{p_y}")
        # self.get_logger().info('Sending goal: {}'.format(goal))  
  
    def thread_move(self):  
        arrX = [0.0, 0.5, 0.5, 0.0, 0.0]  
        arrY = [0.0, 0.0, 0.5, 0.5, 0.0]  
        arrTheta = [0.0, 90.0, 180.0, 270.0, 0.0]  # 使用度数  

        for i in range(len(arrX)):  
            self.setPose(arrX[i], arrY[i], arrTheta[i])  
            self.start_time = datetime.now()
            self.out_time = 0.0
            while self.out_time < 2:
                self.out_time = (datetime.now() - self.start_time).total_seconds()
                time.sleep(0.1)  # 使用秒作为单位 
                # print(f"out_time:{self.out_time}s");

  
def main(args=None):  
    rclpy.init(args=args)  
    navigation_node = NavigationNode()  
    rclpy.spin(navigation_node)  
    navigation_node.destroy_node()  
    rclpy.shutdown()  
  
if __name__ == '__main__':  
    main()


ROS2-地瓜机器人笔记
ROS2 设置节点开机自启

友情链接: CSDN激萌の小宅 95知识库 自考题库 罗分明个人网络博客 精益编程leanboot

小宅博客  www.bilibili996.com All Rights Reserved. 备案号: 闽ICP备2024034575号

网站经营许可证  福建省福州市 Copyright©2021-2025 版权所有

小宅博客
首页 智能家居 地图定位
公告:小宅博客网可以开发票了,需要发票的,去群里找群主哈!!

文章作者:激萌の小宅

促销:¥0

价格:¥0

配送方式: 购买后立即生效(如购买异常,请联系站长)
付款之后一定要等待自动跳转结束,否则购买可能会失败
  • 0 天

    有效期

  • 0

    总销量

  • 0

    累计评价

ROS2 控制小车进行矩形运动

需要启动的节点:

# 打开机器人底盘
ros2 launch turn_on_wheeltec_robot turn_on_wheeltec_robot.launch.py

# 2D导航
ros2 launch wheeltec_nav2 wheeltec_nav2.launch.py


查看小车当前坐标信息:

ros2 topic echo /amcl_pose


然后运行下面节点“ros2 run system_realtime_map navigation_set_node”

import rclpy  
from rclpy.node import Node  
from geometry_msgs.msg import PoseWithCovarianceStamped, PoseStamped  
import math  
import time  
import threading  
from datetime import datetime, timedelta  
  
class NavigationNode(Node):  
    def __init__(self):  
        super().__init__('navigation_set_node')  
        self.start_time = datetime.now()
        # self.end_time = datetime.now() + timedelta(hours=1)
        self.out_time = 0.0
        # 发布2D导航
        self.publisher_ = self.create_publisher(PoseStamped, 'goal_pose', 10)  
        # 订阅坐标信息
        self.subscription  = self.create_subscription(PoseWithCovarianceStamped,"amcl_pose",self.pose_callback,10)
        self.subscription # 防止被垃圾回收

        # 创建一个线程来运行移动逻辑  
        threading.Thread(target=self.thread_move, args=()).start()  
  
    def pose_callback(self, msg):  
        self.start_time = datetime.now()
        print(msg.pose.pose.position)

    def setPose(self, p_x, p_y, theta_deg):  
        # 将角度从度数转换为弧度  
        theta_rad = math.radians(theta_deg)  
        goal = PoseStamped()  
        goal.header.frame_id = 'map'  
        goal.pose.position.x = p_x  
        goal.pose.position.y = p_y  
        goal.pose.position.z = 0.0  # 在2D导航中,z通常设置为0  
        # 计算四元数来表示方向  
        goal.pose.orientation.z = math.sin(theta_rad / 2) # 对于绕z轴旋转,z分量为0  
        goal.pose.orientation.w = math.cos(theta_rad / 2)  
        # 注意:对于绕z轴的简单旋转,x和y分量应该为0,这里我们明确设置为0  
        goal.pose.orientation.x = 0.0  
        goal.pose.orientation.y = 0.0  
        self.publisher_.publish(goal)  
        print(f"send {p_x},{p_y}")
        # self.get_logger().info('Sending goal: {}'.format(goal))  
  
    def thread_move(self):  
        arrX = [0.0, 0.5, 0.5, 0.0, 0.0]  
        arrY = [0.0, 0.0, 0.5, 0.5, 0.0]  
        arrTheta = [0.0, 90.0, 180.0, 270.0, 0.0]  # 使用度数  

        for i in range(len(arrX)):  
            self.setPose(arrX[i], arrY[i], arrTheta[i])  
            self.start_time = datetime.now()
            self.out_time = 0.0
            while self.out_time < 2:
                self.out_time = (datetime.now() - self.start_time).total_seconds()
                time.sleep(0.1)  # 使用秒作为单位 
                # print(f"out_time:{self.out_time}s");

  
def main(args=None):  
    rclpy.init(args=args)  
    navigation_node = NavigationNode()  
    rclpy.spin(navigation_node)  
    navigation_node.destroy_node()  
    rclpy.shutdown()  
  
if __name__ == '__main__':  
    main()