ros建图时新建出来的图跟着车一起转如何解决

本文介绍了使用gmapping建图时遇到的地图旋转问题及其解决方法。通过调整URDF文件中轮子关节参数与雷达坐标系设置,成功解决了地图旋转重叠的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于我建图前后详细的整体流程可以看我的另一篇文章

问题:

我使用gmapping建图的时候发现,刚打开时建的图还是正常的,但是只要我的平台车一旋转,新建出来的图就也会跟着旋转,最后建出来的图是多个旋转的图重合在一起的样子,一开始让我误以为是雷达穿墙了,但实际上没有穿墙。

原因:

大佬帮我看了说可能里程计的问题。

尝试解决:

1.首先启动gazebo,启动键盘指令,可以动一动车,打开新的终端窗口观察/odom话题里面车的位姿变化有没有什么奇怪的地方,小数点后面有轻微跳动是正常的,主要看前面几位的变化。

2.检查车的运动控制部分轮距和轮径设置是否有误,导致里程计算错了(这里我有点没懂,是大佬原话)。

3.在rviz里打开平台车,动一下车的各个车轮的关节,我的模型在此处被发现四个轮子转动的方向不一致,一边向前一边向后,所以要去修改平台模型的car.urdf.xacro文件,可以尝试改动axis后面的值,我的是需要把两个轮子的xyz="0 -1 0"改成xyz="0 1 0":

  <joint
    name="wheel4_joint"
    type="revolute">
    <origin
      xyz="-0.15 -0.295 0"
      rpy="0 0 0" />
    <parent
      link="base_link" />
    <child
      link="wheel4_link" />
    <axis
      xyz="0 1 0" />
    <limit
      lower="-180"
      upper="180"
      effort="0"
      velocity="0" />
  </joint>

4.检查平台模型的car.urdf.xacro文件里雷达的坐标系是否固定(type为fixed):

<joint
    name="sensor_joint"
    type="fixed">
    <origin
      xyz="0 0 0.2"
      rpy="0 0 0" />
    <parent
      link="base_link" />
    <child
      link="sensor_link" />
    <axis
      xyz="0 0 0" />
  </joint>

执行了3和4以后我再建图就不会出现图像旋转的问题了。

<think>嗯,用户想要在树莓派4B上配置Ubuntu 20.04系统,然后连接SG90舵机、HC-SR04超声波模块和L298N电机驱动,最后用ROS实现SLAM和动态路径规划。用户是小白,需要详细的步骤和完整的代码,包括文件存放的位置。首先,我需要确认每个硬件的连接是否正确,特别是GPIO引脚的分配是否合理,避免冲突。然后,安装UbuntuROS的过程需要详细,特别是ROS Noetic在Ubuntu 20.04上的安装步骤。接着,配置GPIO控制,可能需要使用RPi.GPIO库,但要确保在Ubuntu下兼容,或者使用其他替代方法,比如pigpio,因为树莓派的GPIO在Ubuntu中的支持可能和Raspbian不同。舵机和超声波模块的驱动代码需要分开写,然后集成到ROS节点中。电机驱动部分,L298N的使能端和输入引脚需要正确初始化,并控制PWM。对于SLAM,可能需要使用gmapping或者cartographer,需要安装相应的ROS包,并配置激光雷达数据,但这里用户使用的是超声波,可能需要模拟激光数据,或者使用其他SLAM方法。动态路径规划可能需要用到move_base,但需要地数据。可能需要详细解释如何将超声波数据换为激光扫描消息,或者议使用实际的激光雷达。此外,代码的存放位置需要明确,比如catkin工作空间的src目录下创包,并编写节点。需要检查所有代码的语法是否正确,特别是ROS的依赖项和Python的shebang。最后,测试步骤要详细,确保用户能一步步跟着操作,避免遗漏任何依赖安装或配置步骤。可能还需要提醒用户注意电源管理,确保树莓派能提供足够的电流给所有外设,避免电压不足导致的问题。</think>好的!我将以零基础小白的角度为您提供最详细的配置教程。请严格按照以下步骤操作: 一、系统准备阶段 1. 系统烧录: - 下载Ubuntu 20.04 Server镜像:https://ubuntu.com/download/raspberry-pi - 使用BalenaEtcher写入TF卡(至少16GB) 2. 首次启动配置: ```bash sudo apt update && sudo apt upgrade -y sudo apt install ubuntu-desktop -y # 安装桌面环境 sudo reboot ``` 二、硬件连接示意 ``` 树莓派GPIO布局: 3V3 (1) (2) 5V GPIO2 (3) (4) 5V GPIO3 (5) (6) GND GPIO4 (7) (8) GPIO14 GND (9) (10) GPIO15 GPIO17 (11) (12) GPIO18(舵机信号) GPIO27 (13) (14) GND GPIO22 (15) (16) GPIO23 3V3 (17) (18) GPIO24 GPIO10 (19) (20) GPIO25(超声波Echo) GPIO9 (21) (22) GPIO25 GPIO11 (23) (24) GPIO8 GND (25) (26) GPIO7 ``` 具体连接: 1. SG90舵机: - 信号线(黄)→ GPIO18 - 红(+5V)→ 物理引脚2 - 棕(GND)→ 物理引脚6 2. HC-SR04: - VCC → 物理引脚17(3.3V) - Trig → GPIO5(物理引脚29) - Echo → GPIO25(物理引脚22) - GND → 物理引脚14 3. L298N: - ENA → GPIO12(物理引脚32) - IN1 → GPIO16(物理引脚36) - IN2 → GPIO20(物理引脚38) - IN3 → GPIO21(物理引脚40) - IN4 → GPIO26(物理引脚37) - ENB → GPIO13(物理引脚33) 三、ROS安装(需1小时左右) 1. 设置源: ```bash sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu focal main" > /etc/apt/sources.list.d/ros-latest.list' sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654 ``` 2. 安装完整版ROS: ```bash sudo apt update sudo apt install ros-noetic-desktop-full -y ``` 3. 环境配置: ```bash echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc source ~/.bashrc sudo apt install python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential -y sudo rosdep init rosdep update ``` 四、创工作空间 ```bash mkdir -p ~/catkin_ws/src cd ~/catkin_ws/ catkin_make echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc source ~/.bashrc ``` 五、硬件驱动开发 1. 创功能包: ```bash cd ~/catkin_ws/src catkin_create_pkg robot_driver rospy std_msgs ``` 2. 编写舵机驱动(新文件 ~/catkin_ws/src/robot_driver/scripts/servo_control.py): ```python #!/usr/bin/env python3 import rospy from std_msgs.msg import Float32 import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) GPIO.setup(18, GPIO.OUT) pwm = GPIO.PWM(18, 50) # 50Hz pwm.start(0) def callback(data): angle = data.data duty = angle / 18 + 2 GPIO.output(18, True) pwm.ChangeDutyCycle(duty) rospy.sleep(0.3) GPIO.output(18, False) pwm.ChangeDutyCycle(0) def servo_listener(): rospy.init_node('servo_controller') rospy.Subscriber("servo_angle", Float32, callback) rospy.spin() if __name__ == '__main__': try: servo_listener() finally: pwm.stop() GPIO.cleanup() ``` 3. 超声波驱动(新文件 ~/catkin_ws/src/robot_driver/scripts/ultrasonic.py): ```python #!/usr/bin/env python3 import rospy from sensor_msgs.msg import Range import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) TRIG = 5 ECHO = 25 GPIO.setup(TRIG, GPIO.OUT) GPIO.setup(ECHO, GPIO.IN) def get_distance(): GPIO.output(TRIG, True) time.sleep(0.00001) GPIO.output(TRIG, False) start_time = time.time() stop_time = time.time() while GPIO.input(ECHO) == 0: start_time = time.time() while GPIO.input(ECHO) == 1: stop_time = time.time() distance = (stop_time - start_time) * 17150 return distance def ultrasonic_publisher(): pub = rospy.Publisher('ultrasonic_data', Range, queue_size=10) rospy.init_node('ultrasonic_node') rate = rospy.Rate(10) # 10Hz msg = Range() msg.radiation_type = Range.ULTRASOUND msg.field_of_view = 0.1 # 约15度 msg.min_range = 0.02 msg.max_range = 4.0 while not rospy.is_shutdown(): dist = get_distance() msg.range = dist pub.publish(msg) rate.sleep() if __name__ == '__main__': try: ultrasonic_publisher() except rospy.ROSInterruptException: GPIO.cleanup() ``` (由于篇幅限制,电机驱动代码和SLAM配置部分请告知,我可继续补充。议先完成当前步骤的硬件测试。需要继续吗?)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值