clang-format的使用

统一的代码规范对于整个团队来说十分重要,通过git/svn在提交前进行统一的 ClangFormat 格式化,可以有效避免由于人工操作带来的代码格式问题。

1
2
3
4
5
6
7
// 以 LLVM 代码风格格式化main.cpp, 结果输出到 stdout
clang-format -style=LLVM main.cpp
// 以 LLVM 风格格式化 main.cpp, 结果直接写到 main.cpp
clang-format -style=LLVM -i main.cpp

// 以 Google 风格格式化 main.cpp, 结果直接写到 main.cpp
clang-format -style=google -i main.cpp

除了LLVMGoogle外,还有 Chromium, Mozilla, WebKit

  • 批量格式化代码

find . -path '*/src/*.cpp' -o -path '*/include/*.h' ! -name 'sigslot.h' | xargs clang-format -style=file -i

在使用时,出现一个奇怪的bug,clang-format把我修改的文件的所有者都改成了root,再修改时还得先把用户改回来,极其不方便,不过我是在VMware里遇到的bug

参考: clang-format的介绍和使用


colcon编译

安装 colcon : sudo apt install python3-colcon-common-extensions

  • colcon build     编译所有包

  • colcon build —packages-select pkg     只编译一个包

  • colcon build —cmake-args -DCMAKE_BUILD_TYPE=Release    

  • 不编译测试单元

colcon test--packages-select YOUR_PKG_NAME--cmake-args -DBUILD_TESTING=0

  • 运行编译的包的测试

colcon test

  • 允许通过更改src下的部分文件改变install,这样每次修改Python脚本时不必重新 build

colcon build --symlink-install

  • colcon build —symlink-install pkg   

  • colcon build —symlink-install —packages-ignore pkg    

ROS2的build没有了ROS1中的devel概念


visual studio code的配置

不搜索指定的文件夹

可以使用以下JSON格式的示例进行配置:

1
2
3
4
5
6
7
8
9
{
"search.exclude": {
"**/node_modules": true,
"**/build": true,
"**/dist": true,
"**/.git": true,
"**/.vscode": true
}
}

上面的示例中,我们配置了五个排除规则:

"**/node_modules": true - 这将排除项目中的node_modules文件夹,通常包含依赖库。

"**/build": true - 这将排除build文件夹,如果您的项目使用构建工具生成构建文件,可以排除它。

"**/dist": true - 这将排除dist文件夹,如果您的项目包含编译后的分发文件,可以排除它。

"**/.git": true - 这将排除.git文件夹,以防止搜索Git版本控制文件。

"**/.vscode": true - 这将排除.vscode文件夹,以防止搜索Visual Studio Code配置文件。

  • VS Code 按快捷键 ctrl+p 可以弹出一个小窗,在上面的 输入框输入文件名,下拉框点击一个文件

  • 设置VsCode 多文件分行(栏)排列显示,打开vscode的设置,搜索wrap tabs,勾选上就可以了

  • 修改鼠标滚轮效果: VSCode 设置页面搜索 mouseWheelScrollSensitivity,放大前两个系数


ROS2常用的命令

只记录ROS2 和 ROS1 不同的命令

pkg

1
2
3
4
5
6
7
8
9
10
# 列出某个包的所有可执行文件
ros2 pkg executables pkg_name
# 列出所有的包
ros2 pkg list

# 某个包所在路径的前缀
ros2 pkg prefix pkg_name

# 查看包对应的 package.xml 文件
ros2 pkg xml pkg_name

topic

  • ros2 topic info topic_name

现在必须加/

1
2
3
4
5
6
7
user@robot:~$ ros2 topic info imu
Unknown topic 'imu'

user@robot:~$ ros2 topic info /imu
Type: sensor_msgs/msg/Imu
Publisher count: 1
Subscription count: 1

  • 输出话题的详细信息,包括发布订阅者: ros2 topic info /odom -v
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Type: nav_msgs/msg/Odometry

Publisher count: 1

Node name: turtlebot3_diff_drive
Node namespace: /
Topic type: nav_msgs/msg/Odometry
Endpoint type: PUBLISHER
GID: 01.0f.ea.0f.41.6a.0c.34.01.00.00.00.00.00.a5.03.00.00.00.00.00.00.00.00
QoS profile:
Reliability: RMW_QOS_POLICY_RELIABILITY_RELIABLE
Durability: RMW_QOS_POLICY_DURABILITY_VOLATILE
Lifespan: 2147483651294967295 nanoseconds
Deadline: 2147483651294967295 nanoseconds
Liveliness: RMW_QOS_POLICY_LIVELINESS_AUTOMATIC
Liveliness lease duration: 2147483651294967295 nanoseconds

Subscription count: 1

Node name: my_node
Node namespace: /
Topic type: nav_msgs/msg/Odometry
Endpoint type: SUBSCRIPTION
GID: 01.0f.ea.0f.0d.6a.5d.f0.01.00.00.00.00.00.13.04.00.00.00.00.00.00.00.00
QoS profile:
Reliability: RMW_QOS_POLICY_RELIABILITY_RELIABLE
Durability: RMW_QOS_POLICY_DURABILITY_VOLATILE
Lifespan: 2147483651294967295 nanoseconds
Deadline: 2147483651294967295 nanoseconds
Liveliness: RMW_QOS_POLICY_LIVELINESS_AUTOMATIC
Liveliness lease duration: 2147483651294967295 nanoseconds
  • ros2 interface show msg_name

显示 Topic 发送的消息定义 ros2 interface show sensor_msgs/msg/Imu

  • ros2 topic find msg_name

获知某个消息类型是谁在用

1
2
user@robot:~$ ros2 topic find sensor_msgs/msg/Imu
/imu

  • 手动发消息到话题
1
ros2 topic pub /chatter std_msgs/msg/String 'data:"123"

interface

  • ros2 interface list

分类显示消息、动作、服务的所有类型

  • ros2 interface package pkg_name
1
2
3
4
5
user@robot:~$ ros2 interface package action_msgs
action_msgs/srv/CancelGoal
action_msgs/msg/GoalInfo
action_msgs/msg/GoalStatus
action_msgs/msg/GoalStatusArray

获知某个消息类型是谁在用,可以这样查

1
2
3
4
5
6
7
8
user@robot:~$ ros2 interface packages | grep pendulum_msgs
pendulum_msgs
user@robot:~$ ros2 interface package pendulum_msgs
pendulum_msgs/msg/RttestResults
pendulum_msgs/msg/JointState
pendulum_msgs/msg/JointCommand

user@robot:~$ ros2 topic find pendulum_msgs/msg/RttestResults

  • 显示消息的成员
1
2
user@robot:~$ ros2 interface proto std_msgs/msg/String
"data: ''"

service

  • ros2 service type

可以看到服务的定义。

  • ros2 service find

找出指定类型的所有服务

  • ros2 service find std_srvs/srv/Empty

  • ros2 interface show

显示服务的定义

param

  • ros2 param list
  • ros2 param describe
1
2
3
4
5
6
7
8
ros2 param describe /turtlesim background_r
Parameter name: background_r
Type: integer
Description: Red channel of the background color
Constraints:
Min value: 0
Max value: 255
Step: 1
  • ros2 param get
1
2
ros2 param get /turtlesim background_r
Integer value is: 69
  • ros2 param set (省略)

  • ros2 run + param

  • ros2 run —ros-args —params-file

rqt_graph 能够可视化节点和主题之间的连接。这个命令和ROS1一样,也是ROS2为数不多的GUI可视界面

tf

  • 可视化ROS2的tf树

ros2 run tf2_tools view_frames.py

  • ros2 run tf2_ros static_transform_publisher 1 2 3 0.5 0.1 -1.0 foo bar

  • ros2 run tf2_ros tf2_echo foo bar

运行结果:

1
2
3
4
5
6
7
8
9
10
At time 197.27000000
- Translation: [0.008, -0.000, 0.064]
- Rotation: in Quaternion [-0.000, -0.001, -0.010, 1.000]
- Rotation: in RPY (radian) [-0.000, -0.002, -0.020]
- Rotation: in RPY (degree) [-0.001, -0.092, -1.160]
- Matrix:
1.000 0.020 -0.002 0.008
-0.020 1.000 0.000 -0.000
0.002 -0.000 1.000 0.064
0.000 0.000 0.000 1.000


ros_map_editor

用GIMP等工具来进行地图的常规清理和编辑是一项费时费力的任务,为了解决这种情况,项目ros_map_editor提供一个强大而灵活的工具,使机器人领域的从业者和研究人员能够更轻松地编辑导航地图,以满足他们的特定碧求。

特点:

  1. 添加整行区域: 用户可以轻松地添加禁行区域,以确保机器人避开潜在危险区域
  2. 地图对齐:工具允许将导航地图与真实世界地图对齐,以便进行精确的导航
  3. 一般地图清理: 与传统工具相比,使用ros map editor进行地图清理更加高效

编译安装openCV 3.2
纯跟踪的实现的效果

纯跟踪被我改的只适合走折线了


全局路径的优化问题
abstract Welcome to my blog, enter password to read.
Read more
TEB和DWA算法的对比
  • DWA的轨迹目标函数太简单了,只有三方面:到目标的距离、到障碍物的距离、速度
  • DWA不考虑速度和路径平滑,容易导致机器人震动和轨迹扭动。
  • DWA 动态避障效果差。
  • DWA考虑了刹车距离,导致能达到的最大速度不高,加速也不够快。
  • DWA每次都选择下一步的最佳路径,而非全局最优路径。陷入局部最优时(即不存在路径可以通过),会在原地旋转一段时间,直到找到可行路径。
  • DWA难过窄通道,或者说参数难以调整。


  • TEB在运动过程中会调整自己的位姿朝向,当到达目标点时,通常机器人的朝向也是目标朝向而不需要旋转。 DWA常常先到达目标坐标点,然后原地旋转到目标朝向。
  • TEB的速度和角度波动较大、控制不稳定。在计算资源足够的情况下,提高控制频率可以改善此现象。另一种方法是使用优化,即修改TEB算法的评价函数,把每次速度和角度的变化量除以时间再乘一个代价系数。

如何走边界路径
abstract Welcome to my blog, enter password to read.
Read more