- 博客(26)
- 收藏
- 关注
原创 差速小车运动模型
通过角速度可以知道转一圈的时间,我们又知道线速度就可以知道绕圆的周长。就可以知道旋转半径。然后通过编码器就可以得出两个轮的速度就可以算出行驶的距离。我们收到的是线速度和角速度,需要转化到两个轮子的速度。角速度是弧度每秒,线速度是米每秒。
2024-09-29 15:18:18
425
原创 moveit的简单使用
自适应碰撞检测,点击Generate Collision Matrix。然后就可以设置保存的路径,点击Generate。在添加完name和邮箱后,还有问题直接点ok。当我们下载好moveit的时候,运行。添加规划组,点击Chain的那一个。demo.launch文件。如图,导入机械臂的文件。
2024-09-03 11:38:06
171
原创 雅可比矩阵与海赛矩阵
判断函数的极值性质:如果海赛矩阵在某一点处是正定的,那么该点是函数的局部极小值点;如果海赛矩阵是负定的,那么该点是局部极大值点;如果海赛矩阵是不定的,那么该点是鞍点。(这个感觉就是我们学的导数)
2024-08-20 11:11:49
231
原创 Gazebo 模拟激光雷达传感器
主要是laser_link这个坐标系要确定,然后就是plugin那一行的插件,有可能是没有下载的需要下载,那个是多线雷达的插件。里面的就是一些线数和角度那些雷达的基本信息。多线激光雷达的代码如下。
2024-08-08 15:50:06
542
原创 使用ubuntu20.04通过以太网获取数据
还有一种情况是我们需要发送特定的数据给服务端,服务端才会给我们数据。这种情况我们需要先发送一遍特定的数据去唤醒服务端在发送一边数据给服务端,才能获取到一遍数据(想要一直有数据就要一直发送特定的数据给服务端)。我们想获取数据我们就是客户端,能发送我们想要的数据的一方是服务端,我们相对获取的数据以话题的方式发布的代码如下。当我们获取到的数据是以字节的形式时我们需要解析报文来得到数据。我们需要知道服务端的ip和端口。
2024-08-08 14:48:35
284
原创 cartographer的submap_2d.cc/h
将点云插入到submap中,当点云数据等于num_range_data时就新建submap,再将点云插入到二个submap中当第一个点云等于2倍的num_range_data是,删除第一个,创建第三个。在submap_2d.h的Submap类中。是对继承的纯虚函数重写和成员的声明。ActiveSubmaps2D类中。啥样的地图在lua文件里会有设置。在submap_2d.cc里。先看看Submap2D继承。对Submap进行继承。在Submap.h中。
2024-03-18 16:46:21
546
原创 运动畸变的处理
首先在静止是额米有运动畸变,畸变是因为当我们在运动时雷达也在对周围扫描,所以在一次的点云数据中我们所在的位置是不一样的,我们得到的数据是运动时的,但我们在不知道的情况啊就会得到不准确的点云值,(慢的运动与雷达转的快的搜集会降低运动畸变的产生),我们需要对每一时刻的点云与每一时刻imu的值结合,将点云进过坐标变换到统一时刻的坐标中去。local_trajectory_builder_2d.cc文件中。
2024-03-16 19:49:53
414
1
原创 cartographer的点云数据的时间同步
LocalTrajectoryBuilder2D::AddRangeData函数中的range_data_collator_.AddRangeData(sensor_id, unsynchronized_data);函数进行了多个雷达的点云数据的时间同步。sensor::TimedPointCloudData timed_point_cloud_data)函数。也是调用了CropAndMerge()函数返回result。看看CropAndMerge()再看看之前的if判断。
2024-03-16 15:45:12
521
1
原创 cartographer的传感器数据走向分析
HandleLaserScan将雷达进行分段在调用HandleRangefinder。调用了SensorBridge::HandleLaserScanMessage。Node类的HandleLaserScanMessage函数。BlockingQueue的Push函数是缓冲区。将数据保存queue_中,是。生产者和消费者之间不直接依赖。将两个类之间的耦合度降到最低。调用类中的AddData。Dispatch是消费者。生产者将数据丢到缓冲区。生产者直接调用消费者。两者是同步(阻塞)的。
2024-03-15 17:10:09
453
1
原创 cartographer开始轨迹时的处理
node_main.cc的StartTrajectoryWithDefaultTopics函数。map_builder_bridge_是MapBuilderBridge类。MapBuilderBridge类的AddTrajectory函数、MapBuilder的构造在上文的工厂函数就创建了。将map_builder的所有权在给转移。Node的AddTrajectory函数。将map_builder的所有权给转移。CreateMapBuilder函数。的构造函数,然后将其封装在一个。在Node的构造函数中。
2024-03-14 18:05:10
365
1
原创 cartographer的node.cc回调函数与数据走向
获取SensorBridge类的指针,调用trajectory_builder_的AddSensorData进行数据的处理。在node.h中有如下这个成员,因为回调函数用到了所以上锁。odom准确就可以用,在lua文件中可以设置。sensor_id 里程计的topic名字。trajectory_id 轨迹id。msg 里程计的ros格式的数据。调用函数将数据格式转换。
2024-03-11 16:12:06
375
1
原创 cartographer的node.cc(订阅话题与注册回调函数)
subscribers_(unordered_map)中int值为trajectory_id,有多个单线雷达的topic调用一个回调函数。
2024-03-10 20:22:33
424
1
原创 cartographer的node.cc(开始轨迹与数据采样器)
StartTrajectoryWithDefaultTopics函数在node.cc。返回extrapolators_和sensor_samplers_(头文件定义的)std::string id;// topic的名字。ValidateTrajectoryOptions函数。AddTrajectory函数(部分)在node_main.cc中。
2024-03-10 17:01:05
406
1
原创 大概看看cartographer的node.cc
其中,void (Node::*handler)(int, const std::string&,const typename MessageType::ConstPtr&)是指向Node类的成员函数的指针,该成员函数需要传入三个参数。map_builder_bridge_类也需要传入三个参数(node_options_, std::move(map_builder), tf_buffer)然后继承node_options_(node_options),map_builder_bridge_
2024-03-10 15:14:36
424
1
原创 cartographer的node.h
包含subscriber和string的结构体。结构体(在lua文件中设置的传感器的采样频率)在node_main.cc中调用的。先是Node的初始化传入。然后就是一些会用到的函数。
2024-03-10 14:23:20
336
1
原创 cartographer的node_main.cc
检查configuration_directory与configuration_basename是否为空(他们在launch中有对应的设置)根据Lua配置文件中的内容, 为node_options, trajectory_options 赋值。将返回node_options.map_builder_options的指针。std::move(map_builder)是将所有权转移。指定参数的名称、默认值和描述信息啥的。先从mian函数开始。使用函数对参数初始化。然后就是初始化节点,
2024-03-10 12:26:29
328
1
原创 cartographer的参数
最后生成地图,启动 Cartographer 的 Occupancy Grid 节点,并设置生成的 Occupancy Grid 地图的分辨率为 0.05 米。在launch文件中.lua是我们需要在上面所展现的路径中添加一个lua文件。然后将节点内部的 "scan" 话题重映射到名为 "front_scan" 的话题上。在lua文件中是对参数进行设置的文件。(编译时常量)的字符数组,它的名字是。单线点云与多线点云的话题的数量。launch文件的关键。树的最上边的一个坐标系。
2024-03-09 15:40:45
552
1
原创 cartographer的c++之lambda
这种方式有时被称为“立即调用的 lambda 表达式”或者“立即执行函数表达式(Immediately Invoked Function Expression,IIFE)”。通过立即执行 lambda,你可以避免在后续代码中使用这个 lambda 表达式,同时允许你执行一些一次性的操作。在ROS中我们通常订阅数据,然后有回调函数处理,在cartographer中除了接受的数据,还要配合其他的参数来处理,这就用到了lambda的[函数对象参数 ]与(是一种匿名函数的表达式,它在很多编程语言中都有支持。
2024-01-25 16:49:51
382
原创 SLAM介绍
相对于覆盖栅格地图等二维地图表示方式,点云地图的优点在于可以提供更加真实的环境信息,可以描述物体的三维形状和位置信息,同时也可以用于识别和分类物体。需要注意的是,点云地图的精度和分辨率取决于传感器的精度和采样率等因素,而点云地图的质量对机器人的定位和导航等任务影响很大,因此需要对点云地图进行精细的处理和优化。(没整过三维的就不讲了)点云地图可以通过激光雷达、摄像头等传感器获得环境中物体的位置和形状信息,通过点云配准和滤波等算法,可以将多个点云融合成一个完整的地图,用于机器人的定位、导航和避障等任务。
2023-06-04 16:34:28
7180
2
原创 ros设计导航小车仿真模型
value="${(base_length / 2 + lidi - wheel_radius) * -1}" />这个值是link name="base_link"与joint name="${wheel_name}2link"的距离(落差)。通过中的sphere可以看出是球体${footprint_radius}就相当于对之前代码的footprint_radius的价值引用,所以这个点是半径为0.001的球体。
2023-05-21 20:06:06
1456
1
原创 ros分布式通讯的介绍
ROS的分布式通信是基于ROS Master节点的。ROS Master是一个中央节点,可以将不同的ROS节点连接在一起,它负责维护ROS节点的注册、发现和通信。当一个ROS节点需要和其他节点通信时,它会向ROS Master注册,并告知ROS Master自己提供的服务或需要访问的服务。在ROS中,分布式通信是一种基本的通信方式,它允许不同的ROS节点(ROS Node)在不同的计算机上运行,并通过ROS网络进行通信,以实现机器人系统的各个部分之间的信息交换和协作。
2023-05-15 20:52:36
705
1
原创 优化每次ros运行程序都要source一下
然后,我是在后面的位置输入alias sc="source ./devel/setup.bash"位置应该没啥影响。首先打开终端输入sudo gedit .bashrc。保存退出,以后只用输入sc就是source一下了。
2023-03-07 18:17:15
503
原创 通过2560驱动板实现电机驱动
因为没有2560的集成板,所以通过赵虚左老师的视频教程(上网可以学习修改)修改的ros_arduino_bridge文件会让蜂鸣器一直想,并没有实现电机的驱动。left_count或者right_count二个后面的++与--(反过来)(那个轮子的不对就改那个)M2: 电机电源-(和M1对调可以正反转)左右电机M1,2分别接电机驱动板的MA,MB(正反转)电机:M1: 电机电源+(和M2对调可以正反转 )分别接2560的21,20,18,19对应的引脚。GND与5V接电机驱动板的地和5v。
2023-03-06 19:02:56
551
原创 虚拟机连接电脑有线网络
打开电脑命令提示符输入ipconfig查询电脑的IP地址,子网掩码,默认网关。添加有线设置,将地址等查询的信息输入,并在dns出输入8.8.8.8。每次电脑连接不同的网络都要设置新的有线设置。然后打开虚拟机的有线设置。最后虚拟机就可以上网了。
2023-03-03 13:53:33
1937
原创 ROS小车导航转圈
在修改move_base集成的yaml文件的线速度和角速度时问题并没有解决,后来在看base_local_planner_params文件参数的注释时发现了其中一个参数(sim_time:0.8)对于这个参数的注释是小车规划未来路径的时间(单位是秒)我增大了时间后小车不在打转,问题解决。yaw.goal_tolerane是最多距离目标方向的误差(单位是弧度)xy_goal_tolerance是最多距离目标点方向的误差(单位是米)启动相关文件后,在rviz中指明地方后,小车一直在转圈。
2022-11-24 10:13:56
4155
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人