工作问题经验整理(3)——使用"/proc/self/exe"获取程序绝对路径

本文探讨了在Linux环境下,由于工作目录不同导致程序获取自身路径错误的问题。通过分析getcwd方法的局限性,提出了使用'/proc/self/exe'结合readlink函数来准确获取程序真实路径的解决方案。

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

1、问题描述:

(1)原来在linux执行可执行文件Tester,启动脚本都是直接cd到Tester所在路径(假设为路径A),然后再启动Tester;

(2)这次在其他目录(假设为路径B)启动ester,发现 Tester在打开某些配置文件的时候失败,提示找不到对应文件;

2. 问题分析:

跟踪代码发现,Tester执行程序 获取到的运行目录出错,获取到了路径B的绝对路径,并没有获取到Tester所在路径A,也就无法打开和Tester文件同个路径(路径A)下的配置文件。查代码发现,Tester获取程序运行目录使用的是getcwd方法;

getcwd 方法功能 为 获取当前工作目录;当我们的启动脚本在路径B直接启动Tester的时候,getcwd 获取到的就是路径B,所有使用到该路径去打开文件就会出错。

3. 文件解决:

现在不论我们是否是在路径A下面启动Tester,都需要获取到 Tester文件所在路径A。可以考虑使用"/proc/self/exe"。

linux系统中有个符号链接:/proc/self/exe 它代表当前程序,我们可以用readlink读取它的源路径就可以获取当前程序的绝对路径。

readlink("/proc/self/exe", buf, MAXBUFSIZE);

这样,使用这种方法,无论我们是在路径A还是在路径B启动Tester,获取到的路径都是Tester文件所在目录的绝对路径(路径A)。

### ABB RobotStudio 中设置避障路径规划 在 ABB RobotStudio 中实现避障路径规划可以通过多种方式完成,包括利用内置功能以及通过二次开发集成外部算法。以下是关于如何在 ABB RobotStudio 中设置避障路径规划的相关说明。 #### 1. 利用 RAPID 内置功能 ABB RobotStudio 提供了一些基本的路径规划命令,例如 `MoveL` 和 `MoveC` 等,它们可以直接用于简单的线性和圆弧运动[^2]。然而,这些命令本身并不具备动态障碍物规避能力。为了实现避障功能,可以结合工件坐标系和逻辑判断语句,在程序中手动设定绕过障碍物的具体路径。 ```rapid PROC MoveAroundObstacle() ! 定义目标位置 PTP HomePos ! 绕开障碍物的第一步移动 IF NOT IsPathClear(StartPoint, ObstacleAvoidancePoint) THEN MoveL ObstacleAvoidancePoint, v1000, z50, tool0 ENDIF ! 移动至最终目标点 MoveL TargetPosition, v1000, z50, tool0 ENDPROC ``` 上述代码片段展示了如何通过条件判断来决定是否执行避开障碍物的动作。其中,`IsPathClear()` 是一个假设的功能函数,实际应用中可能需要开发者自行编写或借助第三方库实现。 --- #### 2. 集成 Dijkstra 或其他路径规划算法 对于更复杂的场景,可以在 ABB RobotStudio 的环境中引入高级路径规划算法,比如 Dijkstra、A* 或者 RRT (Rapidly-exploring Random Tree)[^1]。这种情况下,通常会使用 Python 或 C# 编写自定义脚本并通过 RobotStudio API 进行交互。 以下是一个基于 Dijkstra 算法的简单示例: ```python import networkx as nx def dijkstra_path_planning(graph, start_node, end_node): try: path = nx.dijkstra_path(graph, source=start_node, target=end_node) return path except nx.NetworkXNoPath: print("无法找到从起点到终点的有效路径") return [] # 构建地图模型并调用路径规划方法 graph = build_graph_from_environment() # 自定义的地图构建函数 start_position = get_robot_current_position() # 获取当前机器人位置 goal_position = define_goal_coordinates() # 设定目标位置 path_to_follow = dijkstra_path_planning(graph, start_position, goal_position) if path_to_follow: send_commands_to_robot(path_to_follow) # 将路径发送给机器人执行 else: handle_no_path_found_case() # 处理无解情况 ``` 此部分代码实现了从环境数据中提取节点信息,并通过网络图结构计算最优路径。最后将得到的结果传递回机器人控制系统以指导其动作。 --- #### 3. 开发自定义工具辅助避障 如果项目有特殊需求,则可通过扩展 RobotStudio 功能来自定义解决方案。例如,创建一个新的虚拟传感器模块用来实时监测周围空间变化,并据此调整机器人的行动路线[^3]。 下面是一段伪代码展示如何设计这样的组件: ```python class CollisionDetector: def __init__(self, robot_model): self.robot = robot_model self.obstacles = [] def update_obstacles(self, new_data): """ 更新已知障碍物列表 """ self.obstacles.extend(new_data) def check_collision(self, next_step): for obs in self.obstacles: if is_intersecting(next_step, obs.boundary): return True return False robot_instance = load_robot_model("IRB_1600") detector = CollisionDetector(robot_instance) next_move = plan_next_motion() while detector.check_collision(next_move): adjust_trajectory_and_replan() execute_final_plan() ``` 这里演示了一个碰撞检测器的工作流程——持续更新感知范围内存在的物体集合;每次计划下一步之前先验证是否存在潜在冲突;若有则重新寻找安全替代方案直至成功为止。 --- #### 参数调节的重要性 无论采用何种具体的策略,合理配置相关参数始终至关重要。特别是当涉及某些特定类型的规划器时(如 Pilz),尽管官方文档未提供详尽的初始化选项描述,但从源码分析可知内部确实存在针对不同任务形态定制化支持的能力[^4]。因此建议深入研究对应产品的技术资料并与实验相结合不断摸索最佳组合形式。 --- ### 总结 综上所述,在 ABB RobotStudio 上实施有效的避障路径规划既可依赖现成资源又能探索创新途径。无论是单纯依靠既有指令集还是深度融合前沿理论成果都各有优劣需视具体情况而定择善固执之。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值