Use GPU to accelerate
先确认 NVIDIA 驱动已安装且正常
nvidia-smi
检查当前渲染显卡(关键):
sudo apt install -y mesa-utils
glxinfo -B | grep -i “opengl renderer”
强制 Gazebo 使用 NVIDIA GPU(双显卡笔记本必做)
echo ’
Force NVIDIA GPU for Gazebo/RViz
export __NV_PRIME_RENDER_OFFLOAD=1
export __GLX_VENDOR_LIBRARY_NAME=nvidia
export __VK_LAYER_NV_optimus=NVIDIA_only
Use OGRE2 for better GPU acceleration
echo "export GZ_RENDER_ENGINE=ogre2 export IGN_RENDER_ENGINE=ogre2’ >> ~/.bashrc
echo “export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:/opt/ros/humble/share/turtlebot3_gazebo/models” >> ~/.bashrc
source ~/.bashrc
sudo apt install -y ros-humble-mapviz ros-humble-mapviz-plugins ros-humble-tile-map
ros2 launch nav2_bringup tb3_simulation_launch.py headless:=False
没有启动gazebo,
补充gazebo自身环境,
export TURTLEBOT3_MODEL=waffle
source /usr/share/gazebo/setup.sh
正确导航启动命令(加载官方预设地图)
ros2 launch nav2_bringup tb3_simulation_launch.py headless:=False slam:=False
nvidia-smi show that
|=========================================================================================|
| 0 N/A N/A 2314 G /usr/bin/gnome-shell 42MiB |
| 0 N/A N/A 15747 G gzserver 18MiB |
| 0 N/A N/A 15749 G gzclient 142MiB |
| 0 N/A N/A 15755 G /opt/ros/humble/lib/rviz2/rviz2 47MiB |
±----------------------------------------------------------------------------------------+
ros2 param set /gazebo use_sim_time true
==============gazebo
参考了https://zhuanlan.zhihu.com/p/50400789
从https://gitee.com/lyx52/gazebo_models下载模型,移动models和worlds目录到~/.gazebo/下
gazebo是一款功能强大的三维物理仿真平台,具备强大的物理引擎、高质量的图形渲染、方便的编程与图形接口,最重要的是其开源免费的特性。gazebo中的机器人模型与rviz使用的模型相同,但是需要在模型中加入机器人和周围环境的物理属性,例如质量、摩擦系数、弹性系数等。机器人的传感器信息也可以通过插件的形式加入仿真环境,以可视化的方式进行显示。
gazebo是一款优秀的开源物理仿真环境,它具备如下特点:
动力学仿真:支持多种高性能的物理引擎,例如ODE、Bullet、SimBody、DART等。
三维可视化环境:支持显示逼真的三维环境,包括光线、纹理、影子。
传感器仿真:支持传感器数据的仿真,同时可以仿真传感器噪声。
可扩展插件:用户可以定制化开发插件,扩展gazebo的功能,满足个性化的需求。
多种机器人模型:官方提供PR2、Pioneer2 DX、TurtleBot等机器人模型,当然也可以使用自己创建的机器人模型。
TCP/IP传输:gazebo可以实现远程仿真,后台仿真和前台显示通过网络通信。
云仿真:gazebo仿真可以在Amazon、Softlayer等云端运行,也可以在自己搭建的云服务器上运行。
终端工具:用户可以使用gazebo提供的命令行工具在终端实现仿真控制。
安装
sudo apt install ros-humble-gazebo-ros-pkgs
ros2 launch gazebo_ros gazebo.launch.py


============================使用apt安装的mapviz,天地图的瓦片地图怎么都加载不了
参考了https://www.cnblogs.com/cyun2001/p/18769043 《关于mapviz,这一篇就够了》,进行源码编译安装成功
申请天地图的token:http://lbs.tianditu.gov.cn/server/MapService.html
安装依赖:sudo apt-get install ros-humble-mapviz ros-humble-mapviz-plugins ros-humble-tile-map ros-humble-multires-image
git clone https://github.com/swri-robotics/mapviz.git, 使用默认的ros2-devel版本
cd mapviz
colcon build --symlink-install
source install/setup.bash
修改mapviz.lauch.py的初始经纬度和海拔,可以手机安装bigemap软件查询。
cat ./install/mapviz/share/mapviz/launch/mapviz.launch.py
import launch
import launch.actions
import launch.substitutions
import launch_ros.actions
def generate_launch_description():
return launch.LaunchDescription([
launch_ros.actions.Node(
package="mapviz",
executable="mapviz",
name="mapviz",
),
launch_ros.actions.Node(
package="swri_transform_util",
executable="initialize_origin.py",
name="initialize_origin",
parameters=[
{"local_xy_frame": "map"},
{"local_xy_origin": "swri"},
{"local_xy_origins": """[
{"name": "swri",
"latitude": 3.511475,
"longitude": 10.086625,
"altitude": 49.93301392,
"heading": 0.0},
{"name": "back_40",
"latitude": 3.511475,
"longitude": 10.0886625,
"altitude": 49.934,
"heading": 0.0}
]"""},
]
),
launch_ros.actions.Node(
package="tf2_ros",
executable="static_transform_publisher",
name="swri_transform",
arguments=["0", "0", "0", "0", "0", "0", "map", "origin"]
)
])
ros2 launch mapviz mapviz.launch.py
报错:[mapviz-1] [ERROR] [1778506080.096983297] [mapviz]: Unhandled std::exception in Qt event loop: bad file: /home/chenjunhua/.mapviz_config
删除后重新touch一个空文件解决。
base URL:
http://t0.tianditu.gov.cn/img_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={level}&TILEROW={y}&TILECOL={x}&tk=申请的key





加载图片成功。
模拟gps
#!/usr/bin/env python3
import rclpy
from rclpy.node import Node
from sensor_msgs.msg import NavSatFix
import utm
# 经纬度
latitude = 30.511475
longitude = 104.086625
num_points = 2000
distance_interval = 1
# 坐标转换
def latlon_to_utm(lat, lon):
return utm.from_latlon(lat, lon)
def utm_to_latlon(easting, northing, zone_number, zone_letter):
return utm.to_latlon(easting, northing, zone_number, zone_letter)
# 生成轨迹
def generate_utm_trajectory(lat, lon, num_points, distance_interval):
utm_start = latlon_to_utm(lat, lon)
zone_number = utm_start[2]
zone_letter = utm_start[3]
utm_trajectory = []
x = utm_start[0]
y = utm_start[1]
for _ in range(num_points):
utm_trajectory.append((x, y, zone_number, zone_letter))
x += distance_interval
return utm_trajectory
def utm_trajectory_to_latlon(utm_trajectory):
latlon_trajectory = []
for point in utm_trajectory:
lat, lon = utm_to_latlon(point[0], point[1], point[2], point[3])
latlon_trajectory.append((lat, lon))
return latlon_trajectory
# ROS2 节点
class GPSPublisher(Node):
def __init__(self, latlon_trajectory):
super().__init__('gps_trajectory_publisher')
self.publisher_ = self.create_publisher(NavSatFix, '/trajectory', 10)
self.trajectory = latlon_trajectory
self.index = 0
# 10Hz 发布
self.timer = self.create_timer(0.1, self.timer_callback)
self.get_logger().info("GPS 轨迹发布节点启动")
def timer_callback(self):
if self.index >= len(self.trajectory):
self.get_logger().info("轨迹播放完成")
return
lat, lon = self.trajectory[self.index]
msg = NavSatFix()
msg.header.stamp = self.get_clock().now().to_msg()
msg.header.frame_id = "gps"
msg.latitude = lat
msg.longitude = lon
msg.altitude = 0.0
self.publisher_.publish(msg)
self.index += 1
def main(args=None):
# 生成轨迹
utm_traj = generate_utm_trajectory(latitude, longitude, num_points, distance_interval)
latlon_traj = utm_trajectory_to_latlon(utm_traj)
# ROS2 初始化
rclpy.init(args=args)
node = GPSPublisher(latlon_traj)
try:
rclpy.spin(node)
except KeyboardInterrupt:
node.get_logger().info("退出节点")
finally:
node.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
下图绿线条为效果:



End: Sep 27 2022 16:01:58.500347043 (1664265718.500347043)
Messages: 30157
Topic information: Topic: /livox/imu | Type: sensor_msgs/msg/Imu | Count: 27447 | Serialization Format: cdr
Topic: /livox/lidar | Type: livox_ros_driver/msg/CustomMsg | Count: 1355 | Serialization Format: cdr
Topic: /left_camera/image | Type: sensor_msgs/msg/Image | Count: 1355 | Serialization Format: cdr
livox_ros_driver/msg/CustomMsg 是 Livox 的自定义消息格式,RViz 和 MapViz 原生都不支持直接显示
rviz fixed frame: camera_init
Frame [camera_init] does not exist
这个错误说明 TF(坐标变换)没有发布,camera_init 坐标系不存在。FAST-LIVO2 没有正确初始化或没有发布 TF。
ros2 topic echo /tf --once 显示有TF
transforms:
- header:
stamp:
sec: 1778422696
nanosec: 277500712
frame_id: map__identity
child_frame_id: map
transform:
ros2 node list | grep laserMapping查看节点正常
$ ros2 param get /laserMapping use_sim_time
Boolean value is: False
$ ros2 param set /laserMapping use_sim_time true
Set parameter successful
$ ros2 param get /laserMapping use_sim_time
Boolean value is: True
rosbags-convert --src ~/Downloads/Retail_Street.bag --dst dataset/Retail_Street_ros2.db3 --include-topic /livox/lidar
1) bag文件的metadata.yaml修改消息类型:
rosbag2_bagfile_information:
compression_format: ''
compression_mode: ''
custom_data: {}
duration:
nanoseconds: 135470252209
files:
- duration:
nanoseconds: 135470252209
message_count: 30157
path: Retail_Street.db3
..............
topic_metadata:
name: /livox/lidar
offered_qos_profiles: ''
serialization_format: cdr
- type: livox_ros_driver/msg/CustomMsg
+ type: livox_ros_driver2/msg/CustomMsg2)
# 2)修改db
# 备份
cp /home/cjh/nav/Retail_street/Retail_street.db3 \
/home/cjh/nav/Retail_street/Retail_street.db3.backup
# 进入 sqlite3
sqlite3 /home/cjh/nav/Retail_street/Retail_street.db3
# 查看当前 topics 表
SELECT * FROM topics;
# 修改消息类型
UPDATE topics
SET type = 'livox_ros_driver2/msg/CustomMsg'
WHERE type = 'livox_ros_driver/msg/CustomMsg';
# 验证
SELECT * FROM topics;
# 退出
.quit




198

被折叠的 条评论
为什么被折叠?



